29 #ifndef _EXT_ALLOC_TRAITS_H
30 #define _EXT_ALLOC_TRAITS_H 1
32 #pragma GCC system_header
34 #if __cplusplus >= 201103L
41 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
45 #if __cplusplus >= 201103L
46 template<
typename _Alloc>
47 struct __allocator_always_compares_equal
48 {
static const bool value =
false; };
50 template<
typename _Alloc>
51 const bool __allocator_always_compares_equal<_Alloc>::value;
53 template<
typename _Tp>
54 struct __allocator_always_compares_equal<std::allocator<_Tp>>
55 {
static const bool value =
true; };
57 template<
typename _Tp>
58 const bool __allocator_always_compares_equal<std::allocator<_Tp>>::value;
62 template<
typename _Tp,
typename _Array>
64 {
static const bool value =
true; };
66 template<
typename _Tp,
typename _Array>
68 __allocator_always_compares_equal<array_allocator<_Tp, _Array>>::value;
72 template<
typename _Tp>
74 {
static const bool value =
true; };
76 template<
typename _Tp>
77 const bool __allocator_always_compares_equal<bitmap_allocator<_Tp>>::value;
81 template<
typename _Tp>
83 {
static const bool value =
true; };
85 template<
typename _Tp>
86 const bool __allocator_always_compares_equal<malloc_allocator<_Tp>>::value;
88 template<
typename>
struct mt_allocator;
90 template<
typename _Tp>
91 struct __allocator_always_compares_equal<mt_allocator<_Tp>>
92 {
static const bool value =
true; };
94 template<
typename _Tp>
95 const bool __allocator_always_compares_equal<mt_allocator<_Tp>>::value;
99 template<
typename _Tp>
101 {
static const bool value =
true; };
103 template<
typename _Tp>
104 const bool __allocator_always_compares_equal<new_allocator<_Tp>>::value;
106 template<
typename>
struct pool_allocator;
108 template<
typename _Tp>
109 struct __allocator_always_compares_equal<pool_allocator<_Tp>>
110 {
static const bool value =
true; };
112 template<
typename _Tp>
113 const bool __allocator_always_compares_equal<pool_allocator<_Tp>>::value;
120 template<
typename _Alloc>
122 #if __cplusplus >= 201103L
127 #if __cplusplus >= 201103L
135 typedef value_type& reference;
136 typedef const value_type& const_reference;
137 using _Base_type::allocate;
138 using _Base_type::deallocate;
139 using _Base_type::construct;
140 using _Base_type::destroy;
141 using _Base_type::max_size;
144 template<
typename _Ptr>
145 struct __is_custom_pointer
147 && !std::is_pointer<_Ptr>::value>
152 template<
typename _Ptr,
typename... _Args>
153 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
154 construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
157 std::forward<_Args>(__args)...);
161 template<
typename _Ptr>
162 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
163 destroy(_Alloc& __a, _Ptr __p)
166 static _Alloc _S_select_on_copy(
const _Alloc& __a)
167 {
return _Base_type::select_on_container_copy_construction(__a); }
169 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
170 { std::__alloc_on_swap(__a, __b); }
172 static constexpr
bool _S_propagate_on_copy_assign()
173 {
return _Base_type::propagate_on_container_copy_assignment::value; }
175 static constexpr
bool _S_propagate_on_move_assign()
176 {
return _Base_type::propagate_on_container_move_assignment::value; }
178 static constexpr
bool _S_propagate_on_swap()
179 {
return _Base_type::propagate_on_container_swap::value; }
181 static constexpr
bool _S_always_equal()
182 {
return __allocator_always_compares_equal<_Alloc>::value; }
184 static constexpr
bool _S_nothrow_move()
185 {
return _S_propagate_on_move_assign() || _S_always_equal(); }
187 static constexpr
bool _S_nothrow_swap()
190 return !_S_propagate_on_swap()
191 || noexcept(swap(std::declval<_Alloc&>(), std::declval<_Alloc&>()));
194 template<
typename _Tp>
196 {
typedef typename _Base_type::template rebind_alloc<_Tp> other; };
199 typedef typename _Alloc::pointer pointer;
200 typedef typename _Alloc::const_pointer const_pointer;
201 typedef typename _Alloc::value_type value_type;
202 typedef typename _Alloc::reference reference;
203 typedef typename _Alloc::const_reference const_reference;
204 typedef typename _Alloc::size_type size_type;
205 typedef typename _Alloc::difference_type difference_type;
208 allocate(_Alloc& __a, size_type __n)
209 {
return __a.allocate(__n); }
211 static void deallocate(_Alloc& __a, pointer __p, size_type __n)
212 { __a.deallocate(__p, __n); }
214 template<
typename _Tp>
215 static void construct(_Alloc& __a, pointer __p,
const _Tp& __arg)
216 { __a.construct(__p, __arg); }
218 static void destroy(_Alloc& __a, pointer __p)
219 { __a.destroy(__p); }
221 static size_type max_size(
const _Alloc& __a)
222 {
return __a.max_size(); }
224 static const _Alloc& _S_select_on_copy(
const _Alloc& __a) {
return __a; }
226 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
230 std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
233 template<
typename _Tp>
235 {
typedef typename _Alloc::template rebind<_Tp>::other other; };
239 _GLIBCXX_END_NAMESPACE_VERSION
__pointer pointer
The allocator's pointer type.
An allocator that uses malloc.This is precisely the allocator defined in the C++ Standard.
Uniform interface to C++98 and C++0x allocators.
Bitmap Allocator, primary template.
_Alloc allocator_type
The allocator type.
_Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
Uniform interface to all allocator types.
An allocator that uses previously allocated memory. This memory can be externally, globally, or otherwise allocated.
__const_pointer const_pointer
The allocator's const pointer type.
An allocator that uses global new, as per [20.4].This is precisely the allocator defined in the C++ S...
void swap(function< _Res(_Args...)> &__x, function< _Res(_Args...)> &__y)
Swap the targets of two polymorphic function object wrappers.
__difference_type difference_type
The allocator's difference type.
_Alloc::value_type value_type
The allocated type.
__size_type size_type
The allocator's size type.