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>
49 template<
typename _Tp>
50 struct __allocator_always_compares_equal<
std::allocator<_Tp>>
55 template<
typename _Tp,
typename _Array>
61 template<
typename _Tp>
67 template<
typename _Tp>
71 template<
typename>
struct mt_allocator;
73 template<
typename _Tp>
74 struct __allocator_always_compares_equal<mt_allocator<_Tp>>
79 template<
typename _Tp>
83 template<
typename>
struct pool_allocator;
85 template<
typename _Tp>
86 struct __allocator_always_compares_equal<pool_allocator<_Tp>>
94 template<
typename _Alloc>
96 #if __cplusplus >= 201103L
101 #if __cplusplus >= 201103L 109 typedef value_type& reference;
110 typedef const value_type& const_reference;
111 using _Base_type::allocate;
112 using _Base_type::deallocate;
113 using _Base_type::construct;
114 using _Base_type::destroy;
115 using _Base_type::max_size;
118 template<
typename _Ptr>
119 using __is_custom_pointer
120 = std::__and_<std::is_same<pointer, _Ptr>,
121 std::__not_<std::is_pointer<_Ptr>>>;
125 template<
typename _Ptr,
typename... _Args>
126 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
127 construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
130 std::forward<_Args>(__args)...);
134 template<
typename _Ptr>
135 static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
136 destroy(_Alloc& __a, _Ptr __p)
139 static _Alloc _S_select_on_copy(
const _Alloc& __a)
140 {
return _Base_type::select_on_container_copy_construction(__a); }
142 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
143 { std::__alloc_on_swap(__a, __b); }
145 static constexpr
bool _S_propagate_on_copy_assign()
146 {
return _Base_type::propagate_on_container_copy_assignment::value; }
148 static constexpr
bool _S_propagate_on_move_assign()
149 {
return _Base_type::propagate_on_container_move_assignment::value; }
151 static constexpr
bool _S_propagate_on_swap()
152 {
return _Base_type::propagate_on_container_swap::value; }
154 static constexpr
bool _S_always_equal()
155 {
return __allocator_always_compares_equal<_Alloc>::value; }
157 static constexpr
bool _S_nothrow_move()
158 {
return _S_propagate_on_move_assign() || _S_always_equal(); }
160 static constexpr
bool _S_nothrow_swap()
163 return !_S_propagate_on_swap()
164 || noexcept(swap(std::declval<_Alloc&>(), std::declval<_Alloc&>()));
167 template<
typename _Tp>
169 {
typedef typename _Base_type::template rebind_alloc<_Tp> other; };
172 typedef typename _Alloc::pointer pointer;
173 typedef typename _Alloc::const_pointer const_pointer;
174 typedef typename _Alloc::value_type value_type;
175 typedef typename _Alloc::reference reference;
176 typedef typename _Alloc::const_reference const_reference;
177 typedef typename _Alloc::size_type size_type;
178 typedef typename _Alloc::difference_type difference_type;
181 allocate(_Alloc& __a, size_type __n)
182 {
return __a.allocate(__n); }
184 static void deallocate(_Alloc& __a, pointer __p, size_type __n)
185 { __a.deallocate(__p, __n); }
187 template<
typename _Tp>
188 static void construct(_Alloc& __a, pointer __p,
const _Tp& __arg)
189 { __a.construct(__p, __arg); }
191 static void destroy(_Alloc& __a, pointer __p)
192 { __a.destroy(__p); }
194 static size_type max_size(
const _Alloc& __a)
195 {
return __a.max_size(); }
197 static const _Alloc& _S_select_on_copy(
const _Alloc& __a) {
return __a; }
199 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
203 std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
206 template<
typename _Tp>
208 {
typedef typename _Alloc::template rebind<_Tp>::other other; };
212 _GLIBCXX_END_NAMESPACE_VERSION
_Alloc::value_type value_type
The allocated type.
GNU extensions for public use.
Uniform interface to all allocator types.
ISO C++ entities toplevel namespace is std.
An allocator that uses global new, as per [20.4].This is precisely the allocator defined in the C++ S...
_Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
An allocator that uses malloc.This is precisely the allocator defined in the C++ Standard.
An allocator that uses previously allocated memory. This memory can be externally, globally, or otherwise allocated.
_Alloc allocator_type
The allocator type.
__const_pointer const_pointer
The allocator's const pointer type.
Bitmap Allocator, primary template.
__size_type size_type
The allocator's size type.
__pointer pointer
The allocator's pointer type.
__difference_type difference_type
The allocator's difference type.
Uniform interface to C++98 and C++0x allocators.