• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef ALLOCATORS_H
2 #define ALLOCATORS_H
3 
4 #include <type_traits>
5 #include <utility>
6 
7 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
8 
9 template <class T>
10 class A1
11 {
12     int id_;
13 public:
id_(id)14     explicit A1(int id = 0) : id_(id) {}
15 
16     typedef T value_type;
17 
id()18     int id() const {return id_;}
19 
20     static bool copy_called;
21     static bool move_called;
22     static bool allocate_called;
23     static std::pair<T*, std::size_t> deallocate_called;
24 
A1(const A1 & a)25     A1(const A1& a) : id_(a.id()) {copy_called = true;}
A1(A1 && a)26     A1(A1&& a) : id_(a.id())      {move_called = true;}
27 
28     template <class U>
A1(const A1<U> & a)29         A1(const A1<U>& a) : id_(a.id()) {copy_called = true;}
30     template <class U>
A1(A1<U> && a)31         A1(A1<U>&& a) : id_(a.id()) {move_called = true;}
32 
allocate(std::size_t n)33     T* allocate(std::size_t n)
34     {
35         allocate_called = true;
36         return (T*)n;
37     }
38 
deallocate(T * p,std::size_t n)39     void deallocate(T* p, std::size_t n)
40     {
41         deallocate_called = std::pair<T*, std::size_t>(p, n);
42     }
43 
max_size()44     std::size_t max_size() const {return id_;}
45 };
46 
47 template <class T> bool A1<T>::copy_called = false;
48 template <class T> bool A1<T>::move_called = false;
49 template <class T> bool A1<T>::allocate_called = false;
50 template <class T> std::pair<T*, std::size_t> A1<T>::deallocate_called;
51 
52 template <class T, class U>
53 inline
54 bool operator==(const A1<T>& x, const A1<U>& y)
55 {
56     return x.id() == y.id();
57 }
58 
59 template <class T, class U>
60 inline
61 bool operator!=(const A1<T>& x, const A1<U>& y)
62 {
63     return !(x == y);
64 }
65 
66 template <class T>
67 class A2
68 {
69     int id_;
70 public:
id_(id)71     explicit A2(int id = 0) : id_(id) {}
72 
73     typedef T value_type;
74 
75     typedef unsigned size_type;
76     typedef int difference_type;
77 
78     typedef std::true_type propagate_on_container_move_assignment;
79 
id()80     int id() const {return id_;}
81 
82     static bool copy_called;
83     static bool move_called;
84     static bool allocate_called;
85 
A2(const A2 & a)86     A2(const A2& a) : id_(a.id()) {copy_called = true;}
A2(A2 && a)87     A2(A2&& a) : id_(a.id())      {move_called = true;}
88 
allocate(std::size_t n,const void * hint)89     T* allocate(std::size_t n, const void* hint)
90     {
91         allocate_called = true;
92         return (T*)hint;
93     }
94 };
95 
96 template <class T> bool A2<T>::copy_called = false;
97 template <class T> bool A2<T>::move_called = false;
98 template <class T> bool A2<T>::allocate_called = false;
99 
100 template <class T, class U>
101 inline
102 bool operator==(const A2<T>& x, const A2<U>& y)
103 {
104     return x.id() == y.id();
105 }
106 
107 template <class T, class U>
108 inline
109 bool operator!=(const A2<T>& x, const A2<U>& y)
110 {
111     return !(x == y);
112 }
113 
114 template <class T>
115 class A3
116 {
117     int id_;
118 public:
id_(id)119     explicit A3(int id = 0) : id_(id) {}
120 
121     typedef T value_type;
122 
123     typedef std::true_type propagate_on_container_copy_assignment;
124     typedef std::true_type propagate_on_container_swap;
125 
id()126     int id() const {return id_;}
127 
128     static bool copy_called;
129     static bool move_called;
130     static bool constructed;
131     static bool destroy_called;
132 
A3(const A3 & a)133     A3(const A3& a) : id_(a.id()) {copy_called = true;}
A3(A3 && a)134     A3(A3&& a) : id_(a.id())      {move_called = true;}
135 
136     template <class U, class ...Args>
construct(U * p,Args &&...args)137     void construct(U* p, Args&& ...args)
138     {
139         ::new (p) U(std::forward<Args>(args)...);
140         constructed = true;
141     }
142 
143     template <class U>
destroy(U * p)144     void destroy(U* p)
145     {
146         p->~U();
147         destroy_called = true;
148     }
149 
select_on_container_copy_construction()150     A3 select_on_container_copy_construction() const {return A3(-1);}
151 };
152 
153 template <class T> bool A3<T>::copy_called = false;
154 template <class T> bool A3<T>::move_called = false;
155 template <class T> bool A3<T>::constructed = false;
156 template <class T> bool A3<T>::destroy_called = false;
157 
158 template <class T, class U>
159 inline
160 bool operator==(const A3<T>& x, const A3<U>& y)
161 {
162     return x.id() == y.id();
163 }
164 
165 template <class T, class U>
166 inline
167 bool operator!=(const A3<T>& x, const A3<U>& y)
168 {
169     return !(x == y);
170 }
171 
172 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
173 
174 #endif  // ALLOCATORS_H
175