1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10// UNSUPPORTED: c++03, c++11, c++14
11// REQUIRES: c++experimental
12
13// <experimental/memory>
14
15// observer_ptr
16//
17// template <class W1, class W2>
18// bool operator==(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
19//
20// template <class W1, class W2>
21// bool operator!=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
22//
23// template <class W>
24// bool operator==(const observer_ptr<W>& p, std::nullptr_t) noexcept;
25//
26// template <class W>
27// bool operator==(std::nullptr_t, const observer_ptr<W>& p) noexcept;
28//
29// template <class W>
30// bool operator!=(const observer_ptr<W>& p, std::nullptr_t) noexcept;
31//
32// template <class W>
33// bool operator!=(std::nullptr_t, const observer_ptr<W>& p) noexcept;
34//
35// template <class W1, class W2>
36// bool operator<(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
37//
38// template <class W1, class W2>
39// bool operator>(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
40//
41// template <class W1, class W2>
42// bool operator<=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
43//
44// template <class W1, class W2>
45// bool operator>=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);
46
47#include <experimental/memory>
48#include <cassert>
49
50void test() {
51 using T = int;
52 using Ptr = std::experimental::observer_ptr<T>;
53 using VoidPtr = std::experimental::observer_ptr<void>;
54
55 // operator==(observer_ptr, observer_ptr)
56 {
57 T obj1, obj2;
58 Ptr ptr1(&obj1), ptr1_x(&obj1);
59 Ptr ptr2(&obj2);
60 VoidPtr ptr3(&obj1);
61
62 assert(!(ptr1 == ptr2));
63 assert(ptr1 == ptr1_x);
64
65 assert(ptr1 == ptr3);
66 }
67
68 // operator!=(observer_ptr, observer_ptr)
69 {
70 T obj1, obj2;
71 Ptr ptr1(&obj1), ptr1_x(&obj1);
72 Ptr ptr2(&obj2);
73 VoidPtr ptr3(&obj1);
74
75 assert(ptr1 != ptr2);
76 assert(!(ptr1 != ptr1_x));
77
78 assert(ptr2 != ptr3);
79 }
80
81 // operator==(observer_ptr, nullptr_t)
82 {
83 T obj1;
84 Ptr ptr1(&obj1);
85 Ptr ptr2(nullptr);
86
87 assert(!(ptr1 == nullptr));
88 assert(ptr2 == nullptr);
89 }
90
91 // operator==(nullptr_t, observer_ptr)
92 {
93 T obj1;
94 Ptr ptr1(&obj1);
95 Ptr ptr2(nullptr);
96
97 assert(!(nullptr == ptr1));
98 assert(nullptr == ptr2);
99 }
100
101 // operator!=(observer_ptr, nullptr_t)
102 {
103 T obj1;
104 Ptr ptr1(&obj1);
105 Ptr ptr2(nullptr);
106
107 assert(ptr1 != nullptr);
108 assert(!(ptr2 != nullptr));
109 }
110
111 // operator!=(nullptr_t, observer_ptr)
112 {
113 T obj1;
114 Ptr ptr1(&obj1);
115 Ptr ptr2(nullptr);
116
117 assert(nullptr != ptr1);
118 assert(!(nullptr != ptr2));
119 }
120
121 // operator<(observer_ptr, observer_ptr)
122 {
123 T obj1, obj2;
124 Ptr ptr1(&obj1);
125 Ptr ptr2(&obj2);
126 VoidPtr ptr3(&obj1);
127
128 assert(!(ptr1 < ptr1));
129 assert((ptr1 < ptr2) == (&obj1 < &obj2));
130
131 assert(!(ptr1 < ptr3));
132 }
133
134 // operator>(observer_ptr, observer_ptr)
135 {
136 T obj1, obj2;
137 Ptr ptr1(&obj1);
138 Ptr ptr2(&obj2);
139 VoidPtr ptr3(&obj1);
140
141 assert(!(ptr1 > ptr1));
142 assert((ptr1 > ptr2) == (&obj1 > &obj2));
143
144 assert(!(ptr1 > ptr3));
145 }
146
147 // operator<=(observer_ptr, observer_ptr)
148 {
149 T obj1, obj2;
150 Ptr ptr1(&obj1);
151 Ptr ptr2(&obj2);
152 VoidPtr ptr3(&obj1);
153
154 assert(ptr1 <= ptr1);
155 assert((ptr1 <= ptr2) == (&obj1 <= &obj2));
156
157 assert(ptr1 <= ptr3);
158 }
159
160 // operator>=(observer_ptr, observer_ptr)
161 {
162 T obj1, obj2;
163 Ptr ptr1(&obj1);
164 Ptr ptr2(&obj2);
165 VoidPtr ptr3(&obj1);
166
167 assert(ptr1 >= ptr1);
168 assert((ptr1 >= ptr2) == (&obj1 >= &obj2));
169
170 assert(ptr1 >= ptr3);
171 }
172}
173
174int main(int, char**) {
175 // Note: this is not constexpr in the spec
176 test();
177
178 return 0;
179}

source code of libcxx/test/std/experimental/memory/memory.observer.ptr/compare.pass.cpp