blob: 8e0afab476342a8db6a441c7714d584b6f13b393 [file] [log] [blame]
Marshall Clow354d39c2014-01-16 16:58:45 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Howard Hinnant07d3ecc2013-06-19 21:29:40 +000010#ifndef MIN_ALLOCATOR_H
11#define MIN_ALLOCATOR_H
12
Eric Fiseliere3981b82014-08-15 04:15:41 +000013#include <cstddef>
Eric Fiselierc7979582016-06-17 19:46:40 +000014#include <cstdlib>
15#include <cstddef>
16#include <cassert>
Eric Fiseliere3981b82014-08-15 04:15:41 +000017
Marshall Clowcbf166a2015-06-03 19:56:43 +000018#include "test_macros.h"
19
Eric Fiseliere3981b82014-08-15 04:15:41 +000020template <class T>
21class bare_allocator
22{
23public:
24 typedef T value_type;
25
Marshall Clowcbf166a2015-06-03 19:56:43 +000026 bare_allocator() TEST_NOEXCEPT {}
Eric Fiseliere3981b82014-08-15 04:15:41 +000027
28 template <class U>
Marshall Clowcbf166a2015-06-03 19:56:43 +000029 bare_allocator(bare_allocator<U>) TEST_NOEXCEPT {}
Eric Fiseliere3981b82014-08-15 04:15:41 +000030
31 T* allocate(std::size_t n)
32 {
33 return static_cast<T*>(::operator new(n*sizeof(T)));
34 }
35
36 void deallocate(T* p, std::size_t)
37 {
38 return ::operator delete(static_cast<void*>(p));
39 }
40
41 friend bool operator==(bare_allocator, bare_allocator) {return true;}
42 friend bool operator!=(bare_allocator x, bare_allocator y) {return !(x == y);}
43};
44
Eric Fiselierc7979582016-06-17 19:46:40 +000045struct malloc_allocator_base {
46 static size_t alloc_count;
47 static size_t dealloc_count;
48 static bool disable_default_constructor;
49
50 static size_t outstanding_alloc() {
51 assert(alloc_count >= dealloc_count);
52 return (alloc_count - dealloc_count);
53 }
54
55 static void reset() {
56 assert(outstanding_alloc() == 0);
57 disable_default_constructor = false;
58 alloc_count = 0;
59 dealloc_count = 0;
60 }
61};
62
63
64size_t malloc_allocator_base::alloc_count = 0;
65size_t malloc_allocator_base::dealloc_count = 0;
66bool malloc_allocator_base::disable_default_constructor = false;
67
68
69template <class T>
70class malloc_allocator : public malloc_allocator_base
71{
72public:
73 typedef T value_type;
74
75 malloc_allocator() TEST_NOEXCEPT { assert(!disable_default_constructor); }
76
77 template <class U>
78 malloc_allocator(malloc_allocator<U>) TEST_NOEXCEPT {}
79
80 T* allocate(std::size_t n)
81 {
82 ++alloc_count;
83 return static_cast<T*>(std::malloc(n*sizeof(T)));
84 }
85
86 void deallocate(T* p, std::size_t)
87 {
88 ++dealloc_count;
89 std::free(static_cast<void*>(p));
90 }
91
92 friend bool operator==(malloc_allocator, malloc_allocator) {return true;}
93 friend bool operator!=(malloc_allocator x, malloc_allocator y) {return !(x == y);}
94};
95
Eric Fiseliere3981b82014-08-15 04:15:41 +000096
Eric Fiselierf2f2a632016-06-14 21:31:42 +000097#if TEST_STD_VER >= 11
Howard Hinnant07d3ecc2013-06-19 21:29:40 +000098
99#include <memory>
100
101template <class T> class min_pointer;
102template <class T> class min_pointer<const T>;
103template <> class min_pointer<void>;
104template <> class min_pointer<const void>;
105template <class T> class min_allocator;
106
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000107template <>
108class min_pointer<const void>
109{
110 const void* ptr_;
111public:
Marshall Clowcbf166a2015-06-03 19:56:43 +0000112 min_pointer() TEST_NOEXCEPT = default;
113 min_pointer(std::nullptr_t) TEST_NOEXCEPT : ptr_(nullptr) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000114 template <class T>
Marshall Clowcbf166a2015-06-03 19:56:43 +0000115 min_pointer(min_pointer<T> p) TEST_NOEXCEPT : ptr_(p.ptr_) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000116
117 explicit operator bool() const {return ptr_ != nullptr;}
118
Howard Hinnant3ec1f002013-06-27 19:35:32 +0000119 friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
120 friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000121 template <class U> friend class min_pointer;
122};
123
124template <>
125class min_pointer<void>
126{
127 void* ptr_;
128public:
Marshall Clowcbf166a2015-06-03 19:56:43 +0000129 min_pointer() TEST_NOEXCEPT = default;
130 min_pointer(std::nullptr_t) TEST_NOEXCEPT : ptr_(nullptr) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000131 template <class T,
132 class = typename std::enable_if
133 <
134 !std::is_const<T>::value
135 >::type
136 >
Marshall Clowcbf166a2015-06-03 19:56:43 +0000137 min_pointer(min_pointer<T> p) TEST_NOEXCEPT : ptr_(p.ptr_) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000138
139 explicit operator bool() const {return ptr_ != nullptr;}
140
Howard Hinnant3ec1f002013-06-27 19:35:32 +0000141 friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
142 friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000143 template <class U> friend class min_pointer;
144};
145
146template <class T>
147class min_pointer
148{
149 T* ptr_;
150
Marshall Clowcbf166a2015-06-03 19:56:43 +0000151 explicit min_pointer(T* p) TEST_NOEXCEPT : ptr_(p) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000152public:
Marshall Clowcbf166a2015-06-03 19:56:43 +0000153 min_pointer() TEST_NOEXCEPT = default;
154 min_pointer(std::nullptr_t) TEST_NOEXCEPT : ptr_(nullptr) {}
155 explicit min_pointer(min_pointer<void> p) TEST_NOEXCEPT : ptr_(static_cast<T*>(p.ptr_)) {}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000156
157 explicit operator bool() const {return ptr_ != nullptr;}
Eric Fiseliere3981b82014-08-15 04:15:41 +0000158
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000159 typedef std::ptrdiff_t difference_type;
160 typedef T& reference;
161 typedef T* pointer;
162 typedef T value_type;
163 typedef std::random_access_iterator_tag iterator_category;
164
165 reference operator*() const {return *ptr_;}
166 pointer operator->() const {return ptr_;}
167
168 min_pointer& operator++() {++ptr_; return *this;}
169 min_pointer operator++(int) {min_pointer tmp(*this); ++ptr_; return tmp;}
170
171 min_pointer& operator--() {--ptr_; return *this;}
172 min_pointer operator--(int) {min_pointer tmp(*this); --ptr_; return tmp;}
173
174 min_pointer& operator+=(difference_type n) {ptr_ += n; return *this;}
175 min_pointer& operator-=(difference_type n) {ptr_ -= n; return *this;}
176
177 min_pointer operator+(difference_type n) const
178 {
179 min_pointer tmp(*this);
180 tmp += n;
181 return tmp;
182 }
183
184 friend min_pointer operator+(difference_type n, min_pointer x)
185 {
186 return x + n;
187 }
188
189 min_pointer operator-(difference_type n) const
190 {
191 min_pointer tmp(*this);
192 tmp -= n;
193 return tmp;
194 }
195
196 friend difference_type operator-(min_pointer x, min_pointer y)
197 {
198 return x.ptr_ - y.ptr_;
199 }
200
201 reference operator[](difference_type n) const {return ptr_[n];}
202
203 friend bool operator< (min_pointer x, min_pointer y) {return x.ptr_ < y.ptr_;}
204 friend bool operator> (min_pointer x, min_pointer y) {return y < x;}
205 friend bool operator<=(min_pointer x, min_pointer y) {return !(y < x);}
206 friend bool operator>=(min_pointer x, min_pointer y) {return !(x < y);}
207
208 static min_pointer pointer_to(T& t) {return min_pointer(std::addressof(t));}
209
Howard Hinnant3ec1f002013-06-27 19:35:32 +0000210 friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
211 friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000212 template <class U> friend class min_pointer;
213 template <class U> friend class min_allocator;
214};
215
216template <class T>
217class min_pointer<const T>
218{
219 const T* ptr_;
220
221 explicit min_pointer(const T* p) : ptr_(p) {}
222public:
Marshall Clowcbf166a2015-06-03 19:56:43 +0000223 min_pointer() TEST_NOEXCEPT = default;
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000224 min_pointer(std::nullptr_t) : ptr_(nullptr) {}
225 min_pointer(min_pointer<T> p) : ptr_(p.ptr_) {}
226 explicit min_pointer(min_pointer<const void> p) : ptr_(static_cast<const T*>(p.ptr_)) {}
227
228 explicit operator bool() const {return ptr_ != nullptr;}
229
230 typedef std::ptrdiff_t difference_type;
231 typedef const T& reference;
232 typedef const T* pointer;
233 typedef const T value_type;
234 typedef std::random_access_iterator_tag iterator_category;
235
236 reference operator*() const {return *ptr_;}
237 pointer operator->() const {return ptr_;}
238
239 min_pointer& operator++() {++ptr_; return *this;}
240 min_pointer operator++(int) {min_pointer tmp(*this); ++ptr_; return tmp;}
241
242 min_pointer& operator--() {--ptr_; return *this;}
243 min_pointer operator--(int) {min_pointer tmp(*this); --ptr_; return tmp;}
244
245 min_pointer& operator+=(difference_type n) {ptr_ += n; return *this;}
246 min_pointer& operator-=(difference_type n) {ptr_ -= n; return *this;}
247
248 min_pointer operator+(difference_type n) const
249 {
250 min_pointer tmp(*this);
251 tmp += n;
252 return tmp;
253 }
254
255 friend min_pointer operator+(difference_type n, min_pointer x)
256 {
257 return x + n;
258 }
259
260 min_pointer operator-(difference_type n) const
261 {
262 min_pointer tmp(*this);
263 tmp -= n;
264 return tmp;
265 }
266
267 friend difference_type operator-(min_pointer x, min_pointer y)
268 {
269 return x.ptr_ - y.ptr_;
270 }
271
272 reference operator[](difference_type n) const {return ptr_[n];}
273
274 friend bool operator< (min_pointer x, min_pointer y) {return x.ptr_ < y.ptr_;}
275 friend bool operator> (min_pointer x, min_pointer y) {return y < x;}
276 friend bool operator<=(min_pointer x, min_pointer y) {return !(y < x);}
277 friend bool operator>=(min_pointer x, min_pointer y) {return !(x < y);}
278
279 static min_pointer pointer_to(const T& t) {return min_pointer(std::addressof(t));}
280
Howard Hinnant3ec1f002013-06-27 19:35:32 +0000281 friend bool operator==(min_pointer x, min_pointer y) {return x.ptr_ == y.ptr_;}
282 friend bool operator!=(min_pointer x, min_pointer y) {return !(x == y);}
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000283 template <class U> friend class min_pointer;
284};
285
286template <class T>
287inline
288bool
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000289operator==(min_pointer<T> x, std::nullptr_t)
290{
291 return !static_cast<bool>(x);
292}
293
294template <class T>
295inline
296bool
297operator==(std::nullptr_t, min_pointer<T> x)
298{
299 return !static_cast<bool>(x);
300}
301
302template <class T>
303inline
304bool
305operator!=(min_pointer<T> x, std::nullptr_t)
306{
307 return static_cast<bool>(x);
308}
309
310template <class T>
311inline
312bool
313operator!=(std::nullptr_t, min_pointer<T> x)
314{
315 return static_cast<bool>(x);
316}
317
318template <class T>
319class min_allocator
320{
321public:
322 typedef T value_type;
323 typedef min_pointer<T> pointer;
324
325 min_allocator() = default;
326 template <class U>
327 min_allocator(min_allocator<U>) {}
328
329 pointer allocate(std::ptrdiff_t n)
330 {
331 return pointer(static_cast<T*>(::operator new(n*sizeof(T))));
332 }
333
334 void deallocate(pointer p, std::ptrdiff_t)
335 {
336 return ::operator delete(p.ptr_);
337 }
338
339 friend bool operator==(min_allocator, min_allocator) {return true;}
340 friend bool operator!=(min_allocator x, min_allocator y) {return !(x == y);}
341};
342
Marshall Clow2a10c962016-08-17 05:58:40 +0000343template <class T>
344class explicit_allocator
345{
346public:
347 typedef T value_type;
348
349 explicit_allocator() TEST_NOEXCEPT {}
350
351 template <class U>
352 explicit explicit_allocator(explicit_allocator<U>) TEST_NOEXCEPT {}
353
354 T* allocate(std::size_t n)
355 {
356 return static_cast<T*>(::operator new(n*sizeof(T)));
357 }
358
359 void deallocate(T* p, std::size_t)
360 {
361 return ::operator delete(static_cast<void*>(p));
362 }
363
364 friend bool operator==(explicit_allocator, explicit_allocator) {return true;}
365 friend bool operator!=(explicit_allocator x, explicit_allocator y) {return !(x == y);}
366};
367
Eric Fiselierf2f2a632016-06-14 21:31:42 +0000368#endif // TEST_STD_VER >= 11
Howard Hinnant07d3ecc2013-06-19 21:29:40 +0000369
370#endif // MIN_ALLOCATOR_H