xref: /aosp_15_r20/external/libcxx/test/support/allocators.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker 
10*58b9f456SAndroid Build Coastguard Worker #ifndef ALLOCATORS_H
11*58b9f456SAndroid Build Coastguard Worker #define ALLOCATORS_H
12*58b9f456SAndroid Build Coastguard Worker 
13*58b9f456SAndroid Build Coastguard Worker #include <type_traits>
14*58b9f456SAndroid Build Coastguard Worker #include <utility>
15*58b9f456SAndroid Build Coastguard Worker 
16*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h"
17*58b9f456SAndroid Build Coastguard Worker 
18*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11
19*58b9f456SAndroid Build Coastguard Worker 
20*58b9f456SAndroid Build Coastguard Worker template <class T>
21*58b9f456SAndroid Build Coastguard Worker class A1
22*58b9f456SAndroid Build Coastguard Worker {
23*58b9f456SAndroid Build Coastguard Worker     int id_;
24*58b9f456SAndroid Build Coastguard Worker public:
id_(id)25*58b9f456SAndroid Build Coastguard Worker     explicit A1(int id = 0) TEST_NOEXCEPT : id_(id) {}
26*58b9f456SAndroid Build Coastguard Worker 
27*58b9f456SAndroid Build Coastguard Worker     typedef T value_type;
28*58b9f456SAndroid Build Coastguard Worker 
id()29*58b9f456SAndroid Build Coastguard Worker     int id() const {return id_;}
30*58b9f456SAndroid Build Coastguard Worker 
31*58b9f456SAndroid Build Coastguard Worker     static bool copy_called;
32*58b9f456SAndroid Build Coastguard Worker     static bool move_called;
33*58b9f456SAndroid Build Coastguard Worker     static bool allocate_called;
34*58b9f456SAndroid Build Coastguard Worker     static std::pair<T*, std::size_t> deallocate_called;
35*58b9f456SAndroid Build Coastguard Worker 
A1(const A1 & a)36*58b9f456SAndroid Build Coastguard Worker     A1(const A1& a) TEST_NOEXCEPT : id_(a.id()) {copy_called = true;}
A1(A1 && a)37*58b9f456SAndroid Build Coastguard Worker     A1(A1&& a)      TEST_NOEXCEPT : id_(a.id()) {move_called = true;}
38*58b9f456SAndroid Build Coastguard Worker     A1& operator=(const A1& a) TEST_NOEXCEPT { id_ = a.id(); copy_called = true; return *this;}
39*58b9f456SAndroid Build Coastguard Worker     A1& operator=(A1&& a)      TEST_NOEXCEPT { id_ = a.id(); move_called = true; return *this;}
40*58b9f456SAndroid Build Coastguard Worker 
41*58b9f456SAndroid Build Coastguard Worker     template <class U>
A1(const A1<U> & a)42*58b9f456SAndroid Build Coastguard Worker         A1(const A1<U>& a) TEST_NOEXCEPT : id_(a.id()) {copy_called = true;}
43*58b9f456SAndroid Build Coastguard Worker     template <class U>
A1(A1<U> && a)44*58b9f456SAndroid Build Coastguard Worker         A1(A1<U>&& a) TEST_NOEXCEPT : id_(a.id()) {move_called = true;}
45*58b9f456SAndroid Build Coastguard Worker 
allocate(std::size_t n)46*58b9f456SAndroid Build Coastguard Worker     T* allocate(std::size_t n)
47*58b9f456SAndroid Build Coastguard Worker     {
48*58b9f456SAndroid Build Coastguard Worker         allocate_called = true;
49*58b9f456SAndroid Build Coastguard Worker         return (T*)n;
50*58b9f456SAndroid Build Coastguard Worker     }
51*58b9f456SAndroid Build Coastguard Worker 
deallocate(T * p,std::size_t n)52*58b9f456SAndroid Build Coastguard Worker     void deallocate(T* p, std::size_t n)
53*58b9f456SAndroid Build Coastguard Worker     {
54*58b9f456SAndroid Build Coastguard Worker         deallocate_called = std::pair<T*, std::size_t>(p, n);
55*58b9f456SAndroid Build Coastguard Worker     }
56*58b9f456SAndroid Build Coastguard Worker 
max_size()57*58b9f456SAndroid Build Coastguard Worker     std::size_t max_size() const {return id_;}
58*58b9f456SAndroid Build Coastguard Worker };
59*58b9f456SAndroid Build Coastguard Worker 
60*58b9f456SAndroid Build Coastguard Worker template <class T> bool A1<T>::copy_called = false;
61*58b9f456SAndroid Build Coastguard Worker template <class T> bool A1<T>::move_called = false;
62*58b9f456SAndroid Build Coastguard Worker template <class T> bool A1<T>::allocate_called = false;
63*58b9f456SAndroid Build Coastguard Worker template <class T> std::pair<T*, std::size_t> A1<T>::deallocate_called;
64*58b9f456SAndroid Build Coastguard Worker 
65*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
66*58b9f456SAndroid Build Coastguard Worker inline
67*58b9f456SAndroid Build Coastguard Worker bool operator==(const A1<T>& x, const A1<U>& y)
68*58b9f456SAndroid Build Coastguard Worker {
69*58b9f456SAndroid Build Coastguard Worker     return x.id() == y.id();
70*58b9f456SAndroid Build Coastguard Worker }
71*58b9f456SAndroid Build Coastguard Worker 
72*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
73*58b9f456SAndroid Build Coastguard Worker inline
74*58b9f456SAndroid Build Coastguard Worker bool operator!=(const A1<T>& x, const A1<U>& y)
75*58b9f456SAndroid Build Coastguard Worker {
76*58b9f456SAndroid Build Coastguard Worker     return !(x == y);
77*58b9f456SAndroid Build Coastguard Worker }
78*58b9f456SAndroid Build Coastguard Worker 
79*58b9f456SAndroid Build Coastguard Worker template <class T>
80*58b9f456SAndroid Build Coastguard Worker class A2
81*58b9f456SAndroid Build Coastguard Worker {
82*58b9f456SAndroid Build Coastguard Worker     int id_;
83*58b9f456SAndroid Build Coastguard Worker public:
id_(id)84*58b9f456SAndroid Build Coastguard Worker     explicit A2(int id = 0) TEST_NOEXCEPT : id_(id) {}
85*58b9f456SAndroid Build Coastguard Worker 
86*58b9f456SAndroid Build Coastguard Worker     typedef T value_type;
87*58b9f456SAndroid Build Coastguard Worker 
88*58b9f456SAndroid Build Coastguard Worker     typedef unsigned size_type;
89*58b9f456SAndroid Build Coastguard Worker     typedef int difference_type;
90*58b9f456SAndroid Build Coastguard Worker 
91*58b9f456SAndroid Build Coastguard Worker     typedef std::true_type propagate_on_container_move_assignment;
92*58b9f456SAndroid Build Coastguard Worker 
id()93*58b9f456SAndroid Build Coastguard Worker     int id() const {return id_;}
94*58b9f456SAndroid Build Coastguard Worker 
95*58b9f456SAndroid Build Coastguard Worker     static bool copy_called;
96*58b9f456SAndroid Build Coastguard Worker     static bool move_called;
97*58b9f456SAndroid Build Coastguard Worker     static bool allocate_called;
98*58b9f456SAndroid Build Coastguard Worker 
A2(const A2 & a)99*58b9f456SAndroid Build Coastguard Worker     A2(const A2& a) TEST_NOEXCEPT : id_(a.id()) {copy_called = true;}
A2(A2 && a)100*58b9f456SAndroid Build Coastguard Worker     A2(A2&& a)      TEST_NOEXCEPT : id_(a.id()) {move_called = true;}
101*58b9f456SAndroid Build Coastguard Worker     A2& operator=(const A2& a) TEST_NOEXCEPT { id_ = a.id(); copy_called = true; return *this;}
102*58b9f456SAndroid Build Coastguard Worker     A2& operator=(A2&& a)      TEST_NOEXCEPT { id_ = a.id(); move_called = true; return *this;}
103*58b9f456SAndroid Build Coastguard Worker 
allocate(std::size_t,const void * hint)104*58b9f456SAndroid Build Coastguard Worker     T* allocate(std::size_t, const void* hint)
105*58b9f456SAndroid Build Coastguard Worker     {
106*58b9f456SAndroid Build Coastguard Worker         allocate_called = true;
107*58b9f456SAndroid Build Coastguard Worker         return (T*) const_cast<void *>(hint);
108*58b9f456SAndroid Build Coastguard Worker     }
109*58b9f456SAndroid Build Coastguard Worker };
110*58b9f456SAndroid Build Coastguard Worker 
111*58b9f456SAndroid Build Coastguard Worker template <class T> bool A2<T>::copy_called = false;
112*58b9f456SAndroid Build Coastguard Worker template <class T> bool A2<T>::move_called = false;
113*58b9f456SAndroid Build Coastguard Worker template <class T> bool A2<T>::allocate_called = false;
114*58b9f456SAndroid Build Coastguard Worker 
115*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
116*58b9f456SAndroid Build Coastguard Worker inline
117*58b9f456SAndroid Build Coastguard Worker bool operator==(const A2<T>& x, const A2<U>& y)
118*58b9f456SAndroid Build Coastguard Worker {
119*58b9f456SAndroid Build Coastguard Worker     return x.id() == y.id();
120*58b9f456SAndroid Build Coastguard Worker }
121*58b9f456SAndroid Build Coastguard Worker 
122*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
123*58b9f456SAndroid Build Coastguard Worker inline
124*58b9f456SAndroid Build Coastguard Worker bool operator!=(const A2<T>& x, const A2<U>& y)
125*58b9f456SAndroid Build Coastguard Worker {
126*58b9f456SAndroid Build Coastguard Worker     return !(x == y);
127*58b9f456SAndroid Build Coastguard Worker }
128*58b9f456SAndroid Build Coastguard Worker 
129*58b9f456SAndroid Build Coastguard Worker template <class T>
130*58b9f456SAndroid Build Coastguard Worker class A3
131*58b9f456SAndroid Build Coastguard Worker {
132*58b9f456SAndroid Build Coastguard Worker     int id_;
133*58b9f456SAndroid Build Coastguard Worker public:
id_(id)134*58b9f456SAndroid Build Coastguard Worker     explicit A3(int id = 0) TEST_NOEXCEPT : id_(id) {}
135*58b9f456SAndroid Build Coastguard Worker 
136*58b9f456SAndroid Build Coastguard Worker     typedef T value_type;
137*58b9f456SAndroid Build Coastguard Worker 
138*58b9f456SAndroid Build Coastguard Worker     typedef std::true_type propagate_on_container_copy_assignment;
139*58b9f456SAndroid Build Coastguard Worker     typedef std::true_type propagate_on_container_swap;
140*58b9f456SAndroid Build Coastguard Worker 
id()141*58b9f456SAndroid Build Coastguard Worker     int id() const {return id_;}
142*58b9f456SAndroid Build Coastguard Worker 
143*58b9f456SAndroid Build Coastguard Worker     static bool copy_called;
144*58b9f456SAndroid Build Coastguard Worker     static bool move_called;
145*58b9f456SAndroid Build Coastguard Worker     static bool constructed;
146*58b9f456SAndroid Build Coastguard Worker     static bool destroy_called;
147*58b9f456SAndroid Build Coastguard Worker 
A3(const A3 & a)148*58b9f456SAndroid Build Coastguard Worker     A3(const A3& a) TEST_NOEXCEPT : id_(a.id()) {copy_called = true;}
A3(A3 && a)149*58b9f456SAndroid Build Coastguard Worker     A3(A3&& a)      TEST_NOEXCEPT : id_(a.id())  {move_called = true;}
150*58b9f456SAndroid Build Coastguard Worker     A3& operator=(const A3& a) TEST_NOEXCEPT { id_ = a.id(); copy_called = true; return *this;}
151*58b9f456SAndroid Build Coastguard Worker     A3& operator=(A3&& a)      TEST_NOEXCEPT { id_ = a.id(); move_called = true; return *this;}
152*58b9f456SAndroid Build Coastguard Worker 
153*58b9f456SAndroid Build Coastguard Worker     template <class U, class ...Args>
construct(U * p,Args &&...args)154*58b9f456SAndroid Build Coastguard Worker     void construct(U* p, Args&& ...args)
155*58b9f456SAndroid Build Coastguard Worker     {
156*58b9f456SAndroid Build Coastguard Worker         ::new (p) U(std::forward<Args>(args)...);
157*58b9f456SAndroid Build Coastguard Worker         constructed = true;
158*58b9f456SAndroid Build Coastguard Worker     }
159*58b9f456SAndroid Build Coastguard Worker 
160*58b9f456SAndroid Build Coastguard Worker     template <class U>
destroy(U * p)161*58b9f456SAndroid Build Coastguard Worker     void destroy(U* p)
162*58b9f456SAndroid Build Coastguard Worker     {
163*58b9f456SAndroid Build Coastguard Worker         p->~U();
164*58b9f456SAndroid Build Coastguard Worker         destroy_called = true;
165*58b9f456SAndroid Build Coastguard Worker     }
166*58b9f456SAndroid Build Coastguard Worker 
select_on_container_copy_construction()167*58b9f456SAndroid Build Coastguard Worker     A3 select_on_container_copy_construction() const {return A3(-1);}
168*58b9f456SAndroid Build Coastguard Worker };
169*58b9f456SAndroid Build Coastguard Worker 
170*58b9f456SAndroid Build Coastguard Worker template <class T> bool A3<T>::copy_called = false;
171*58b9f456SAndroid Build Coastguard Worker template <class T> bool A3<T>::move_called = false;
172*58b9f456SAndroid Build Coastguard Worker template <class T> bool A3<T>::constructed = false;
173*58b9f456SAndroid Build Coastguard Worker template <class T> bool A3<T>::destroy_called = false;
174*58b9f456SAndroid Build Coastguard Worker 
175*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
176*58b9f456SAndroid Build Coastguard Worker inline
177*58b9f456SAndroid Build Coastguard Worker bool operator==(const A3<T>& x, const A3<U>& y)
178*58b9f456SAndroid Build Coastguard Worker {
179*58b9f456SAndroid Build Coastguard Worker     return x.id() == y.id();
180*58b9f456SAndroid Build Coastguard Worker }
181*58b9f456SAndroid Build Coastguard Worker 
182*58b9f456SAndroid Build Coastguard Worker template <class T, class U>
183*58b9f456SAndroid Build Coastguard Worker inline
184*58b9f456SAndroid Build Coastguard Worker bool operator!=(const A3<T>& x, const A3<U>& y)
185*58b9f456SAndroid Build Coastguard Worker {
186*58b9f456SAndroid Build Coastguard Worker     return !(x == y);
187*58b9f456SAndroid Build Coastguard Worker }
188*58b9f456SAndroid Build Coastguard Worker 
189*58b9f456SAndroid Build Coastguard Worker #endif  // TEST_STD_VER >= 11
190*58b9f456SAndroid Build Coastguard Worker 
191*58b9f456SAndroid Build Coastguard Worker #endif  // ALLOCATORS_H
192