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