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