1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14
10// TODO: Change to XFAIL once https://github.com/llvm/llvm-project/issues/40340 is fixed
11// UNSUPPORTED: availability-pmr-missing
12
13// test_memory_resource requires RTTI for dynamic_cast
14// UNSUPPORTED: no-rtti
15
16// <memory_resource>
17
18// template <class T> class polymorphic_allocator;
19
20// template <class T, class U>
21// bool operator==(
22// polymorphic_allocator<T> const &
23// , polymorphic_allocator<U> const &) noexcept
24
25#include <memory_resource>
26#include <cassert>
27#include <type_traits>
28
29#include "test_std_memory_resource.h"
30
31int main(int, char**) {
32 typedef std::pmr::polymorphic_allocator<void> A1;
33 typedef std::pmr::polymorphic_allocator<int> A2;
34 // check return types
35 {
36 A1 const a1;
37 A2 const a2;
38 static_assert(std::is_same_v<decltype(a1 == a2), bool>);
39 static_assert(noexcept(a1 == a2));
40 }
41 // equal same type (different resource)
42 {
43 TestResource d1(1);
44 TestResource d2(1);
45 A1 const a1(&d1);
46 A1 const a2(&d2);
47
48 assert(a1 == a2);
49 assert(d1.checkIsEqualCalledEq(1));
50 assert(d2.checkIsEqualCalledEq(0));
51
52 d1.reset();
53
54 assert(a2 == a1);
55 assert(d1.checkIsEqualCalledEq(0));
56 assert(d2.checkIsEqualCalledEq(1));
57 }
58 // equal same type (same resource)
59 {
60 TestResource d1;
61 A1 const a1(&d1);
62 A1 const a2(&d1);
63
64 assert(a1 == a2);
65 assert(d1.checkIsEqualCalledEq(0));
66
67 assert(a2 == a1);
68 assert(d1.checkIsEqualCalledEq(0));
69 }
70 // equal different type (different resource)
71 {
72 TestResource d1(42);
73 TestResource d2(42);
74 A1 const a1(&d1);
75 A2 const a2(&d2);
76
77 assert(a1 == a2);
78 assert(d1.checkIsEqualCalledEq(1));
79 assert(d2.checkIsEqualCalledEq(0));
80
81 assert(a2 == a1);
82 assert(d1.checkIsEqualCalledEq(1));
83 assert(d2.checkIsEqualCalledEq(1));
84 }
85 // equal different type (same resource)
86 {
87 TestResource d1(42);
88 A1 const a1(&d1);
89 A2 const a2(&d1);
90
91 assert(a1 == a2);
92 assert(d1.checkIsEqualCalledEq(0));
93
94 assert(a2 == a1);
95 assert(d1.checkIsEqualCalledEq(0));
96 }
97 // not equal same type
98 {
99 TestResource d1(1);
100 TestResource d2(2);
101 A1 const a1(&d1);
102 A1 const a2(&d2);
103
104 assert(!(a1 == a2));
105 assert(d1.checkIsEqualCalledEq(1));
106 assert(d2.checkIsEqualCalledEq(0));
107
108 d1.reset();
109
110 assert(!(a2 == a1));
111 assert(d1.checkIsEqualCalledEq(0));
112 assert(d2.checkIsEqualCalledEq(1));
113 }
114 // not equal different types
115 {
116 TestResource d1;
117 TestResource1 d2;
118 A1 const a1(&d1);
119 A2 const a2(&d2);
120
121 assert(!(a1 == a2));
122 assert(d1.checkIsEqualCalledEq(1));
123 assert(d2.checkIsEqualCalledEq(0));
124
125 d1.reset();
126
127 assert(!(a2 == a1));
128 assert(d1.checkIsEqualCalledEq(0));
129 assert(d2.checkIsEqualCalledEq(1));
130 }
131
132 return 0;
133}
134

source code of libcxx/test/std/utilities/utility/mem.res/mem.poly.allocator.class/mem.poly.allocator.eq/equal.pass.cpp