1735240b3SAdrian Vogelsgesang //===----------------------------------------------------------------------===//
2735240b3SAdrian Vogelsgesang //
3735240b3SAdrian Vogelsgesang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4735240b3SAdrian Vogelsgesang // See https://llvm.org/LICENSE.txt for license information.
5735240b3SAdrian Vogelsgesang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6735240b3SAdrian Vogelsgesang //
7735240b3SAdrian Vogelsgesang //===----------------------------------------------------------------------===//
8735240b3SAdrian Vogelsgesang
9735240b3SAdrian Vogelsgesang // <memory>
10735240b3SAdrian Vogelsgesang
11735240b3SAdrian Vogelsgesang // unique_ptr
12735240b3SAdrian Vogelsgesang
13735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
14735240b3SAdrian Vogelsgesang // bool
15735240b3SAdrian Vogelsgesang // operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
16735240b3SAdrian Vogelsgesang
17735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
18735240b3SAdrian Vogelsgesang // bool
19735240b3SAdrian Vogelsgesang // operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
20735240b3SAdrian Vogelsgesang
21735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
22735240b3SAdrian Vogelsgesang // bool
23735240b3SAdrian Vogelsgesang // operator< (const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
24735240b3SAdrian Vogelsgesang
25735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
26735240b3SAdrian Vogelsgesang // bool
27735240b3SAdrian Vogelsgesang // operator> (const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
28735240b3SAdrian Vogelsgesang
29735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
30735240b3SAdrian Vogelsgesang // bool
31735240b3SAdrian Vogelsgesang // operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
32735240b3SAdrian Vogelsgesang
33735240b3SAdrian Vogelsgesang // template <class T1, class D1, class T2, class D2>
34735240b3SAdrian Vogelsgesang // bool
35735240b3SAdrian Vogelsgesang // operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
36735240b3SAdrian Vogelsgesang
37735240b3SAdrian Vogelsgesang // template<class T1, class D1, class T2, class D2>
38735240b3SAdrian Vogelsgesang // requires three_way_comparable_with<typename unique_ptr<T1, D1>::pointer,
39735240b3SAdrian Vogelsgesang // typename unique_ptr<T2, D2>::pointer>
40735240b3SAdrian Vogelsgesang // compare_three_way_result_t<typename unique_ptr<T1, D1>::pointer,
41735240b3SAdrian Vogelsgesang // typename unique_ptr<T2, D2>::pointer>
42735240b3SAdrian Vogelsgesang // operator<=>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
43735240b3SAdrian Vogelsgesang
44735240b3SAdrian Vogelsgesang #include <memory>
45735240b3SAdrian Vogelsgesang #include <cassert>
46735240b3SAdrian Vogelsgesang
47735240b3SAdrian Vogelsgesang #include "test_macros.h"
48735240b3SAdrian Vogelsgesang #include "deleter_types.h"
49735240b3SAdrian Vogelsgesang #include "test_comparisons.h"
50*30dadaa2SIgor Zhukov #include "unique_ptr_test_helper.h"
51735240b3SAdrian Vogelsgesang
test()52*30dadaa2SIgor Zhukov TEST_CONSTEXPR_CXX23 bool test() {
53735240b3SAdrian Vogelsgesang AssertComparisonsReturnBool<std::unique_ptr<int> >();
54735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
55735240b3SAdrian Vogelsgesang AssertOrderReturn<std::strong_ordering, std::unique_ptr<int>>();
56735240b3SAdrian Vogelsgesang #endif
57735240b3SAdrian Vogelsgesang
58735240b3SAdrian Vogelsgesang // Pointers of same type
59735240b3SAdrian Vogelsgesang {
60735240b3SAdrian Vogelsgesang A* ptr1 = new A;
61735240b3SAdrian Vogelsgesang A* ptr2 = new A;
62735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p1(ptr1);
63735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p2(ptr2);
64735240b3SAdrian Vogelsgesang
65735240b3SAdrian Vogelsgesang assert(!(p1 == p2));
66735240b3SAdrian Vogelsgesang assert(p1 != p2);
67*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED) {
68735240b3SAdrian Vogelsgesang assert((p1 < p2) == (ptr1 < ptr2));
69735240b3SAdrian Vogelsgesang assert((p1 <= p2) == (ptr1 <= ptr2));
70735240b3SAdrian Vogelsgesang assert((p1 > p2) == (ptr1 > ptr2));
71735240b3SAdrian Vogelsgesang assert((p1 >= p2) == (ptr1 >= ptr2));
72735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
73735240b3SAdrian Vogelsgesang assert((p1 <=> p2) != std::strong_ordering::equal);
74735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == (ptr1 <=> ptr2));
75735240b3SAdrian Vogelsgesang #endif
76735240b3SAdrian Vogelsgesang }
77*30dadaa2SIgor Zhukov }
78735240b3SAdrian Vogelsgesang // Pointers of different type
79735240b3SAdrian Vogelsgesang {
80735240b3SAdrian Vogelsgesang A* ptr1 = new A;
81735240b3SAdrian Vogelsgesang B* ptr2 = new B;
82735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p1(ptr1);
83735240b3SAdrian Vogelsgesang const std::unique_ptr<B, Deleter<B> > p2(ptr2);
84735240b3SAdrian Vogelsgesang assert(!(p1 == p2));
85735240b3SAdrian Vogelsgesang assert(p1 != p2);
86*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED) {
87735240b3SAdrian Vogelsgesang assert((p1 < p2) == (ptr1 < ptr2));
88735240b3SAdrian Vogelsgesang assert((p1 <= p2) == (ptr1 <= ptr2));
89735240b3SAdrian Vogelsgesang assert((p1 > p2) == (ptr1 > ptr2));
90735240b3SAdrian Vogelsgesang assert((p1 >= p2) == (ptr1 >= ptr2));
91735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
92735240b3SAdrian Vogelsgesang assert((p1 <=> p2) != std::strong_ordering::equal);
93735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == (ptr1 <=> ptr2));
94735240b3SAdrian Vogelsgesang #endif
95735240b3SAdrian Vogelsgesang }
96*30dadaa2SIgor Zhukov }
97735240b3SAdrian Vogelsgesang // Pointers of same array type
98735240b3SAdrian Vogelsgesang {
99735240b3SAdrian Vogelsgesang A* ptr1 = new A[3];
100735240b3SAdrian Vogelsgesang A* ptr2 = new A[3];
101735240b3SAdrian Vogelsgesang const std::unique_ptr<A[], Deleter<A[]> > p1(ptr1);
102735240b3SAdrian Vogelsgesang const std::unique_ptr<A[], Deleter<A[]> > p2(ptr2);
103735240b3SAdrian Vogelsgesang assert(!(p1 == p2));
104735240b3SAdrian Vogelsgesang assert(p1 != p2);
105*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED) {
106735240b3SAdrian Vogelsgesang assert((p1 < p2) == (ptr1 < ptr2));
107735240b3SAdrian Vogelsgesang assert((p1 <= p2) == (ptr1 <= ptr2));
108735240b3SAdrian Vogelsgesang assert((p1 > p2) == (ptr1 > ptr2));
109735240b3SAdrian Vogelsgesang assert((p1 >= p2) == (ptr1 >= ptr2));
110735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
111735240b3SAdrian Vogelsgesang assert((p1 <=> p2) != std::strong_ordering::equal);
112735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == (ptr1 <=> ptr2));
113735240b3SAdrian Vogelsgesang #endif
114735240b3SAdrian Vogelsgesang }
115*30dadaa2SIgor Zhukov }
116735240b3SAdrian Vogelsgesang // Pointers of different array types
117735240b3SAdrian Vogelsgesang {
118735240b3SAdrian Vogelsgesang A* ptr1 = new A[3];
119735240b3SAdrian Vogelsgesang B* ptr2 = new B[3];
120735240b3SAdrian Vogelsgesang const std::unique_ptr<A[], Deleter<A[]> > p1(ptr1);
121735240b3SAdrian Vogelsgesang const std::unique_ptr<B[], Deleter<B[]> > p2(ptr2);
122735240b3SAdrian Vogelsgesang assert(!(p1 == p2));
123735240b3SAdrian Vogelsgesang assert(p1 != p2);
124*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED) {
125735240b3SAdrian Vogelsgesang assert((p1 < p2) == (ptr1 < ptr2));
126735240b3SAdrian Vogelsgesang assert((p1 <= p2) == (ptr1 <= ptr2));
127735240b3SAdrian Vogelsgesang assert((p1 > p2) == (ptr1 > ptr2));
128735240b3SAdrian Vogelsgesang assert((p1 >= p2) == (ptr1 >= ptr2));
129735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
130735240b3SAdrian Vogelsgesang assert((p1 <=> p2) != std::strong_ordering::equal);
131735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == (ptr1 <=> ptr2));
132735240b3SAdrian Vogelsgesang #endif
133735240b3SAdrian Vogelsgesang }
134*30dadaa2SIgor Zhukov }
135735240b3SAdrian Vogelsgesang // Default-constructed pointers of same type
136735240b3SAdrian Vogelsgesang {
137735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p1;
138735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p2;
139735240b3SAdrian Vogelsgesang assert(p1 == p2);
140735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
141*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED)
142735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == std::strong_ordering::equal);
143735240b3SAdrian Vogelsgesang #endif
144735240b3SAdrian Vogelsgesang }
145735240b3SAdrian Vogelsgesang // Default-constructed pointers of different type
146735240b3SAdrian Vogelsgesang {
147735240b3SAdrian Vogelsgesang const std::unique_ptr<A, Deleter<A> > p1;
148735240b3SAdrian Vogelsgesang const std::unique_ptr<B, Deleter<B> > p2;
149735240b3SAdrian Vogelsgesang assert(p1 == p2);
150735240b3SAdrian Vogelsgesang #if TEST_STD_VER > 17
151*30dadaa2SIgor Zhukov if (!TEST_IS_CONSTANT_EVALUATED)
152735240b3SAdrian Vogelsgesang assert((p1 <=> p2) == std::strong_ordering::equal);
153735240b3SAdrian Vogelsgesang #endif
154735240b3SAdrian Vogelsgesang }
155735240b3SAdrian Vogelsgesang
156*30dadaa2SIgor Zhukov return true;
157*30dadaa2SIgor Zhukov }
158*30dadaa2SIgor Zhukov
main(int,char **)159*30dadaa2SIgor Zhukov int main(int, char**) {
160*30dadaa2SIgor Zhukov test();
161*30dadaa2SIgor Zhukov #if TEST_STD_VER >= 23
162*30dadaa2SIgor Zhukov static_assert(test());
163*30dadaa2SIgor Zhukov #endif
164*30dadaa2SIgor Zhukov
165735240b3SAdrian Vogelsgesang return 0;
166735240b3SAdrian Vogelsgesang }
167