13 #include "allocator_base.hpp"
17 template <
typename T,
class Allocator>
20 template <
class Allocator>
23 using pointer =
void *;
24 using const_pointer =
const void *;
25 using value_type = void;
26 template <
class U>
struct rebind {
31 template <
typename T,
class Allocator>
33 typename Allocator::value_type &allocator_;
36 using size_type = size_t;
37 using difference_type = ptrdiff_t;
39 using const_pointer =
const T *;
40 using reference = T &;
41 using const_reference =
const T &;
44 template <
typename U>
struct rebind {
49 : allocator_(Allocator::instance())
53 : allocator_(Allocator::instance())
58 explicit stl_allocator(
const stl_allocator<U, Allocator> &)
59 : allocator_(Allocator::instance())
67 pointer address(reference r)
const
71 const_pointer address(const_reference r)
const
76 T *allocate(std::size_t n,
const void * =
nullptr)
78 auto b = allocator_.allocate(n *
sizeof(T));
80 auto p = allocator_.outer_to_prefix(b);
81 p->length =
static_cast<unsigned>(b.length);
82 return static_cast<T *
>(b.ptr);
84 throw std::bad_alloc();
87 void deallocate(T *ptr, std::size_t n)
89 block pseudoBlock(ptr, n);
90 auto p = allocator_.outer_to_prefix(pseudoBlock);
91 block realBlock(ptr, p->length);
92 allocator_.deallocate(realBlock);
95 size_t max_size()
const
97 return ((
size_t)(-1) /
sizeof(T));
100 void construct(pointer ptr)
102 ::new (static_cast<void *>(ptr)) T;
105 template <class U>
void construct(pointer ptr, const U &val)
107 ::new (static_cast<void *>(ptr)) T(val);
110 void construct(pointer ptr, const T &val)
112 ::new (static_cast<void *>(ptr)) T(val);
115 void destroy(pointer p)
121 template <
class Allocator,
typename T1,
typename T2>
122 bool operator==(
const stl_allocator<T1, Allocator> &,
const stl_allocator<T2, Allocator> &)
127 template <
class Allocator,
typename T1,
typename T2>
128 bool operator!=(
const stl_allocator<T1, Allocator> &,
const stl_allocator<T2, Allocator> &)