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
49 template<
typename _Alloc>
51 #if __cplusplus >= 201103L
56 #if __cplusplus >= 201103L
66 using _Base_type::allocate;
67 using _Base_type::deallocate;
68 using _Base_type::construct;
69 using _Base_type::destroy;
70 using _Base_type::max_size;
73 template<
typename _Ptr>
74 using __is_custom_pointer
75 = std::__and_<std::is_same<pointer, _Ptr>,
76 std::__not_<std::is_pointer<_Ptr>>>;
80 template<
typename _Ptr,
typename... _Args>
81 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
82 construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
85 std::forward<_Args>(__args)...);
89 template<
typename _Ptr>
90 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
91 destroy(_Alloc& __a, _Ptr __p)
94 static _Alloc _S_select_on_copy(
const _Alloc& __a)
95 {
return _Base_type::select_on_container_copy_construction(__a); }
97 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
98 { std::__alloc_on_swap(__a, __b); }
100 static constexpr
bool _S_propagate_on_copy_assign()
101 {
return _Base_type::propagate_on_container_copy_assignment::value; }
103 static constexpr
bool _S_propagate_on_move_assign()
104 {
return _Base_type::propagate_on_container_move_assignment::value; }
106 static constexpr
bool _S_propagate_on_swap()
107 {
return _Base_type::propagate_on_container_swap::value; }
109 static constexpr
bool _S_always_equal()
110 {
return _Base_type::is_always_equal::value; }
112 static constexpr
bool _S_nothrow_move()
113 {
return _S_propagate_on_move_assign() || _S_always_equal(); }
115 template<
typename _Tp>
117 {
typedef typename _Base_type::template rebind_alloc<_Tp> other; };
120 typedef typename _Alloc::pointer
pointer;
122 typedef typename _Alloc::value_type
value_type;
123 typedef typename _Alloc::reference reference;
124 typedef typename _Alloc::const_reference const_reference;
125 typedef typename _Alloc::size_type
size_type;
130 {
return __a.allocate(__n); }
133 { __a.deallocate(__p, __n); }
135 template<
typename _Tp>
136 static void construct(_Alloc& __a,
pointer __p,
const _Tp& __arg)
137 { __a.construct(__p, __arg); }
139 static void destroy(_Alloc& __a,
pointer __p)
140 { __a.destroy(__p); }
142 static size_type max_size(
const _Alloc& __a)
143 {
return __a.max_size(); }
145 static const _Alloc& _S_select_on_copy(
const _Alloc& __a) {
return __a; }
147 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
151 std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
154 template<
typename _Tp>
156 {
typedef typename _Alloc::template rebind<_Tp>::other other; };
160 _GLIBCXX_END_NAMESPACE_VERSION
_GLIBCXX17_CONSTEXPR _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
GNU extensions for public use.
Uniform interface to all allocator types.
__detected_or_t< value_type *, __pointer, _Alloc > pointer
The allocator's pointer type.
typename _Size< _Alloc, difference_type >::type size_type
The allocator's size type.
typename _Diff< _Alloc, pointer >::type difference_type
The allocator's difference type.
typename _Ptr< __c_pointer, const value_type >::type const_pointer
The allocator's const pointer type.
_Alloc::value_type value_type
The allocated type.
_Alloc allocator_type
The allocator type.
Uniform interface to C++98 and C++11 allocators.