29#ifndef _EXT_ALLOC_TRAITS_H
30#define _EXT_ALLOC_TRAITS_H 1
32#pragma GCC system_header
34#if __cplusplus >= 201103L
41namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
43_GLIBCXX_BEGIN_NAMESPACE_VERSION
49template<
typename _Alloc>
51#if __cplusplus >= 201103L
55 typedef _Alloc allocator_type;
56#if __cplusplus >= 201103L
64 typedef value_type& reference;
65 typedef const value_type& const_reference;
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;
121 typedef typename _Alloc::const_pointer const_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;
126 typedef typename _Alloc::difference_type difference_type;
129 allocate(_Alloc& __a, size_type __n)
130 {
return __a.allocate(__n); }
132 static void deallocate(_Alloc& __a, pointer __p, size_type __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.
Uniform interface to C++98 and C++11 allocators.