//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef SUPPORT_OPERATOR_HIJACKER_H #define SUPPORT_OPERATOR_HIJACKER_H #include #include #include #include #include "test_macros.h" /// Helper struct to test ADL-hijacking in containers. /// /// The class has some additional operations to be usable in all containers. struct operator_hijacker { TEST_CONSTEXPR bool operator<(const operator_hijacker&) const { return true; } TEST_CONSTEXPR bool operator==(const operator_hijacker&) const { return true; } template friend void operator&(T&&) = delete; template friend void operator,(T&&, U&&) = delete; template friend void operator&&(T&&, U&&) = delete; template friend void operator||(T&&, U&&) = delete; }; static_assert(std::is_trivially_copyable::value && // std::is_copy_constructible::value && // std::is_move_constructible::value && // std::is_copy_assignable::value && // std::is_move_assignable::value, // "does not satisfy the requirements for atomic"); template <> struct std::hash { std::size_t operator()(const operator_hijacker&) const { return 0; } }; template struct operator_hijacker_allocator : std::allocator, operator_hijacker { #if TEST_STD_VER <= 17 struct rebind { typedef operator_hijacker_allocator other; }; #endif }; template struct operator_hijacker_char_traits : std::char_traits, operator_hijacker {}; #endif // SUPPORT_OPERATOR_HIJACKER_H