// -*- C++ -*- //===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 // REQUIRES: c++experimental // // observer_ptr // // template // bool operator==(const observer_ptr& p1, const observer_ptr& p2); // // template // bool operator!=(const observer_ptr& p1, const observer_ptr& p2); // // template // bool operator==(const observer_ptr& p, std::nullptr_t) noexcept; // // template // bool operator==(std::nullptr_t, const observer_ptr& p) noexcept; // // template // bool operator!=(const observer_ptr& p, std::nullptr_t) noexcept; // // template // bool operator!=(std::nullptr_t, const observer_ptr& p) noexcept; // // template // bool operator<(const observer_ptr& p1, const observer_ptr& p2); // // template // bool operator>(const observer_ptr& p1, const observer_ptr& p2); // // template // bool operator<=(const observer_ptr& p1, const observer_ptr& p2); // // template // bool operator>=(const observer_ptr& p1, const observer_ptr& p2); #include #include void test() { using T = int; using Ptr = std::experimental::observer_ptr; using VoidPtr = std::experimental::observer_ptr; // operator==(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1), ptr1_x(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(!(ptr1 == ptr2)); assert(ptr1 == ptr1_x); assert(ptr1 == ptr3); } // operator!=(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1), ptr1_x(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(ptr1 != ptr2); assert(!(ptr1 != ptr1_x)); assert(ptr2 != ptr3); } // operator==(observer_ptr, nullptr_t) { T obj1; Ptr ptr1(&obj1); Ptr ptr2(nullptr); assert(!(ptr1 == nullptr)); assert(ptr2 == nullptr); } // operator==(nullptr_t, observer_ptr) { T obj1; Ptr ptr1(&obj1); Ptr ptr2(nullptr); assert(!(nullptr == ptr1)); assert(nullptr == ptr2); } // operator!=(observer_ptr, nullptr_t) { T obj1; Ptr ptr1(&obj1); Ptr ptr2(nullptr); assert(ptr1 != nullptr); assert(!(ptr2 != nullptr)); } // operator!=(nullptr_t, observer_ptr) { T obj1; Ptr ptr1(&obj1); Ptr ptr2(nullptr); assert(nullptr != ptr1); assert(!(nullptr != ptr2)); } // operator<(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(!(ptr1 < ptr1)); assert((ptr1 < ptr2) == (&obj1 < &obj2)); assert(!(ptr1 < ptr3)); } // operator>(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(!(ptr1 > ptr1)); assert((ptr1 > ptr2) == (&obj1 > &obj2)); assert(!(ptr1 > ptr3)); } // operator<=(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(ptr1 <= ptr1); assert((ptr1 <= ptr2) == (&obj1 <= &obj2)); assert(ptr1 <= ptr3); } // operator>=(observer_ptr, observer_ptr) { T obj1, obj2; Ptr ptr1(&obj1); Ptr ptr2(&obj2); VoidPtr ptr3(&obj1); assert(ptr1 >= ptr1); assert((ptr1 >= ptr2) == (&obj1 >= &obj2)); assert(ptr1 >= ptr3); } } int main(int, char**) { // Note: this is not constexpr in the spec test(); return 0; }