30 #ifndef _ALLOC_TRAITS_H
31 #define _ALLOC_TRAITS_H 1
33 #if __cplusplus >= 201103L
39 namespace std _GLIBCXX_VISIBILITY(default)
41 _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 template<
typename _Alloc,
typename _Tp>
44 class __alloctr_rebind_helper
46 template<
typename _Alloc2,
typename _Tp2>
47 static constexpr true_type
48 _S_chk(
typename _Alloc2::template rebind<_Tp2>::other*);
50 template<
typename,
typename>
51 static constexpr false_type
55 using __type = decltype(_S_chk<_Alloc, _Tp>(
nullptr));
58 template<
typename _Alloc,
typename _Tp,
59 bool = __alloctr_rebind_helper<_Alloc, _Tp>::__type::value>
60 struct __alloctr_rebind;
62 template<
typename _Alloc,
typename _Tp>
63 struct __alloctr_rebind<_Alloc, _Tp, true>
65 typedef typename _Alloc::template rebind<_Tp>::other __type;
68 template<
template<
typename,
typename...>
class _Alloc,
typename _Tp,
69 typename _Up,
typename... _Args>
70 struct __alloctr_rebind<_Alloc<_Up, _Args...>, _Tp, false>
72 typedef _Alloc<_Tp, _Args...> __type;
75 template<
typename _Alloc,
typename _Tp>
76 using __alloc_rebind =
typename __alloctr_rebind<_Alloc, _Tp>::__type;
82 template<
typename _Alloc>
90 #define _GLIBCXX_ALLOC_TR_NESTED_TYPE(_NTYPE, _ALT) \
92 template<typename _Tp> \
93 static typename _Tp::_NTYPE _S_##_NTYPE##_helper(_Tp*); \
94 static _ALT _S_##_NTYPE##_helper(...); \
95 typedef decltype(_S_##_NTYPE##_helper((_Alloc*)0)) __##_NTYPE; \
98 _GLIBCXX_ALLOC_TR_NESTED_TYPE(
pointer, value_type*)
108 typename
pointer_traits<pointer>::template rebind<const value_type>)
116 typedef __const_pointer const_pointer;
127 typedef __void_pointer void_pointer;
138 typedef __const_void_pointer const_void_pointer;
149 typedef __difference_type difference_type;
152 typename make_unsigned<difference_type>::type)
160 typedef __size_type size_type;
171 typedef __propagate_on_container_copy_assignment
172 propagate_on_container_copy_assignment;
183 typedef __propagate_on_container_move_assignment
184 propagate_on_container_move_assignment;
195 typedef __propagate_on_container_swap propagate_on_container_swap;
197 #undef _GLIBCXX_ALLOC_TR_NESTED_TYPE
199 template<
typename _Tp>
200 using rebind_alloc =
typename __alloctr_rebind<_Alloc, _Tp>::__type;
201 template<
typename _Tp>
205 template<
typename _Alloc2>
206 struct __allocate_helper
208 template<
typename _Alloc3,
209 typename = decltype(std::declval<_Alloc3*>()->
allocate(
210 std::declval<size_type>(),
211 std::declval<const_void_pointer>()))>
212 static true_type __test(
int);
215 static false_type __test(...);
217 using type = decltype(__test<_Alloc>(0));
220 template<
typename _Alloc2>
221 using __has_allocate =
typename __allocate_helper<_Alloc2>::type;
223 template<
typename _Alloc2,
224 typename = _Require<__has_allocate<_Alloc2>>>
226 _S_allocate(_Alloc2& __a, size_type __n, const_void_pointer __hint)
227 {
return __a.allocate(__n, __hint); }
229 template<
typename _Alloc2,
typename _UnusedHint,
230 typename = _Require<__not_<__has_allocate<_Alloc2>>>>
232 _S_allocate(_Alloc2& __a, size_type __n, _UnusedHint)
233 {
return __a.allocate(__n); }
235 template<
typename _Tp,
typename... _Args>
236 struct __construct_helper
238 template<
typename _Alloc2,
239 typename = decltype(std::declval<_Alloc2*>()->
construct(
240 std::declval<_Tp*>(), std::declval<_Args>()...))>
241 static true_type __test(
int);
244 static false_type __test(...);
246 using type = decltype(__test<_Alloc>(0));
249 template<
typename _Tp,
typename... _Args>
250 using __has_construct
251 =
typename __construct_helper<_Tp, _Args...>::type;
253 template<
typename _Tp,
typename... _Args>
254 static _Require<__has_construct<_Tp, _Args...>>
255 _S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
256 { __a.construct(__p, std::forward<_Args>(__args)...); }
258 template<
typename _Tp,
typename... _Args>
260 _Require<__and_<__not_<__has_construct<_Tp, _Args...>>,
261 is_constructible<_Tp, _Args...>>>
262 _S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
263 { ::new((
void*)__p) _Tp(
std::
forward<_Args>(__args)...); }
265 template<typename _Tp>
266 struct __destroy_helper
268 template<
typename _Alloc2,
269 typename = decltype(std::declval<_Alloc2*>()->
destroy(
270 std::declval<_Tp*>()))>
271 static true_type __test(
int);
274 static false_type __test(...);
276 using type = decltype(__test<_Alloc>(0));
279 template<
typename _Tp>
280 using __has_destroy =
typename __destroy_helper<_Tp>::type;
282 template<
typename _Tp>
283 static _Require<__has_destroy<_Tp>>
284 _S_destroy(_Alloc& __a, _Tp* __p)
285 { __a.destroy(__p); }
287 template<
typename _Tp>
288 static _Require<__not_<__has_destroy<_Tp>>>
289 _S_destroy(_Alloc&, _Tp* __p)
292 template<
typename _Alloc2>
293 struct __maxsize_helper
295 template<
typename _Alloc3,
296 typename = decltype(std::declval<_Alloc3*>()->
max_size())>
297 static true_type __test(
int);
300 static false_type __test(...);
302 using type = decltype(__test<_Alloc2>(0));
305 template<
typename _Alloc2>
306 using __has_max_size =
typename __maxsize_helper<_Alloc2>::type;
308 template<
typename _Alloc2,
309 typename = _Require<__has_max_size<_Alloc2>>>
311 _S_max_size(_Alloc2& __a,
int)
312 {
return __a.max_size(); }
314 template<
typename _Alloc2,
315 typename = _Require<__not_<__has_max_size<_Alloc2>>>>
317 _S_max_size(_Alloc2&, ...)
318 {
return __gnu_cxx::__numeric_traits<size_type>::__max; }
320 template<
typename _Alloc2>
321 struct __select_helper
323 template<
typename _Alloc3,
typename
324 = decltype(std::declval<_Alloc3*>()
326 static true_type __test(
int);
329 static false_type __test(...);
331 using type = decltype(__test<_Alloc2>(0));
334 template<
typename _Alloc2>
335 using __has_soccc =
typename __select_helper<_Alloc2>::type;
337 template<
typename _Alloc2,
338 typename = _Require<__has_soccc<_Alloc2>>>
340 _S_select(_Alloc2& __a,
int)
341 {
return __a.select_on_container_copy_construction(); }
343 template<
typename _Alloc2,
344 typename = _Require<__not_<__has_soccc<_Alloc2>>>>
346 _S_select(_Alloc2& __a, ...)
360 {
return __a.allocate(__n); }
374 allocate(_Alloc& __a, size_type __n, const_void_pointer __hint)
375 {
return _S_allocate(__a, __n, __hint); }
385 static void deallocate(_Alloc& __a, pointer __p, size_type __n)
386 { __a.deallocate(__p, __n); }
399 template<
typename _Tp,
typename... _Args>
400 static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
401 -> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
402 { _S_construct(__a, __p, std::forward<_Args>(__args)...); }
414 { _S_destroy(__a, __p); }
424 static size_type
max_size(
const _Alloc& __a) noexcept
425 {
return _S_max_size(__a, 0); }
437 {
return _S_select(__rhs, 0); }
440 template<
typename _Alloc>
442 __do_alloc_on_copy(_Alloc& __one,
const _Alloc& __two, true_type)
445 template<
typename _Alloc>
447 __do_alloc_on_copy(_Alloc&,
const _Alloc&, false_type)
450 template<
typename _Alloc>
451 inline void __alloc_on_copy(_Alloc& __one,
const _Alloc& __two)
453 typedef allocator_traits<_Alloc> __traits;
454 typedef typename __traits::propagate_on_container_copy_assignment __pocca;
455 __do_alloc_on_copy(__one, __two, __pocca());
458 template<
typename _Alloc>
459 inline _Alloc __alloc_on_copy(
const _Alloc& __a)
461 typedef allocator_traits<_Alloc> __traits;
462 return __traits::select_on_container_copy_construction(__a);
465 template<
typename _Alloc>
466 inline void __do_alloc_on_move(_Alloc& __one, _Alloc& __two, true_type)
469 template<
typename _Alloc>
470 inline void __do_alloc_on_move(_Alloc&, _Alloc&, false_type)
473 template<
typename _Alloc>
474 inline void __alloc_on_move(_Alloc& __one, _Alloc& __two)
476 typedef allocator_traits<_Alloc> __traits;
477 typedef typename __traits::propagate_on_container_move_assignment __pocma;
478 __do_alloc_on_move(__one, __two, __pocma());
481 template<
typename _Alloc>
482 inline void __do_alloc_on_swap(_Alloc& __one, _Alloc& __two, true_type)
488 template<
typename _Alloc>
489 inline void __do_alloc_on_swap(_Alloc&, _Alloc&, false_type)
492 template<
typename _Alloc>
493 inline void __alloc_on_swap(_Alloc& __one, _Alloc& __two)
495 typedef allocator_traits<_Alloc> __traits;
496 typedef typename __traits::propagate_on_container_swap __pocs;
497 __do_alloc_on_swap(__one, __two, __pocs());
500 template<
typename _Alloc>
501 class __is_copy_insertable_impl
503 typedef allocator_traits<_Alloc> _Traits;
505 template<
typename _Up,
typename
506 = decltype(_Traits::construct(std::declval<_Alloc&>(),
507 std::declval<_Up*>(),
508 std::declval<const _Up&>()))>
512 template<
typename _Up>
517 typedef decltype(_M_select<typename _Alloc::value_type>(0)) type;
521 template<typename _Alloc>
522 struct __is_copy_insertable
523 : __is_copy_insertable_impl<_Alloc>::type
527 template<
typename _Tp>
528 struct __is_copy_insertable<allocator<_Tp>>
529 : is_copy_constructible<_Tp>
532 _GLIBCXX_END_NAMESPACE_VERSION
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.
__propagate_on_container_move_assignment propagate_on_container_move_assignment
How the allocator is propagated on move assignment.
__pointer pointer
The allocator's pointer type.
static void destroy(_Alloc &__a, _Tp *__p)
Destroy an object of type _Tp.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
__difference_type difference_type
The allocator's difference type.
static pointer allocate(_Alloc &__a, size_type __n, const_void_pointer __hint)
Allocate memory.
static auto construct(_Alloc &__a, _Tp *__p, _Args &&...__args) -> decltype(_S_construct(__a, __p, std::forward< _Args >(__args)...))
Construct an object of type _Tp.
Uniform interface to all allocator types.
__propagate_on_container_copy_assignment propagate_on_container_copy_assignment
How the allocator is propagated on copy assignment.
static pointer allocate(_Alloc &__a, size_type __n)
Allocate memory.
__const_pointer const_pointer
The allocator's const pointer type.
__const_void_pointer const_void_pointer
The allocator's const void pointer type.
__propagate_on_container_swap propagate_on_container_swap
How the allocator is propagated on swap.
__void_pointer void_pointer
The allocator's void pointer type.
_Alloc::value_type value_type
The allocated type.
__size_type size_type
The allocator's size type.
static size_type max_size(const _Alloc &__a) noexcept
The maximum supported allocation size.
Uniform interface to all pointer-like types.
_Alloc allocator_type
The allocator type.
static _Alloc select_on_container_copy_construction(const _Alloc &__rhs)
Obtain an allocator to use when copying a container.
static void deallocate(_Alloc &__a, pointer __p, size_type __n)
Deallocate memory.
ISO C++ entities toplevel namespace is std.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.