25 #ifndef _USES_ALLOCATOR_H 26 #define _USES_ALLOCATOR_H 1 28 #if __cplusplus < 201103L 35 namespace std _GLIBCXX_VISIBILITY(default)
37 _GLIBCXX_BEGIN_NAMESPACE_VERSION
40 struct __erased_type { };
45 template<
typename _Alloc,
typename _Tp>
46 using __is_erased_or_convertible
47 = __or_<is_convertible<_Alloc, _Tp>, is_same<_Tp, __erased_type>>;
55 template<
typename _Tp,
typename _Alloc,
typename = __
void_t<>>
56 struct __uses_allocator_helper
59 template<
typename _Tp,
typename _Alloc>
60 struct __uses_allocator_helper<_Tp, _Alloc,
61 __void_t<typename _Tp::allocator_type>>
62 : __is_erased_or_convertible<_Alloc, typename _Tp::allocator_type>::type
66 template<
typename _Tp,
typename _Alloc>
68 : __uses_allocator_helper<_Tp, _Alloc>::type
71 struct __uses_alloc_base { };
73 struct __uses_alloc0 : __uses_alloc_base
75 struct _Sink {
void operator=(
const void*) { } } _M_a;
78 template<
typename _Alloc>
79 struct __uses_alloc1 : __uses_alloc_base {
const _Alloc* _M_a; };
81 template<
typename _Alloc>
82 struct __uses_alloc2 : __uses_alloc_base {
const _Alloc* _M_a; };
84 template<bool,
typename _Tp,
typename _Alloc,
typename... _Args>
87 template<
typename _Tp,
typename _Alloc,
typename... _Args>
88 struct __uses_alloc<true, _Tp, _Alloc, _Args...>
90 is_constructible<_Tp, allocator_arg_t, const _Alloc&, _Args...>::value,
91 __uses_alloc1<_Alloc>,
92 __uses_alloc2<_Alloc>>::type
97 is_constructible<_Tp, allocator_arg_t, const _Alloc&, _Args...>,
98 is_constructible<_Tp, _Args..., const _Alloc&>>::value,
99 "construction with an allocator must be possible" 100 " if uses_allocator is true");
103 template<
typename _Tp,
typename _Alloc,
typename... _Args>
104 struct __uses_alloc<false, _Tp, _Alloc, _Args...>
107 template<
typename _Tp,
typename _Alloc,
typename... _Args>
108 using __uses_alloc_t =
109 __uses_alloc<uses_allocator<_Tp, _Alloc>::value, _Tp, _Alloc, _Args...>;
111 template<
typename _Tp,
typename _Alloc,
typename... _Args>
112 inline __uses_alloc_t<_Tp, _Alloc, _Args...>
113 __use_alloc(
const _Alloc& __a)
115 __uses_alloc_t<_Tp, _Alloc, _Args...> __ret;
120 template<
typename _Tp,
typename _Alloc,
typename... _Args>
122 __use_alloc(
const _Alloc&&) =
delete;
124 #if __cplusplus > 201402L 125 template <
typename _Tp,
typename _Alloc>
126 inline constexpr
bool uses_allocator_v =
127 uses_allocator<_Tp, _Alloc>::value;
130 template<
template<
typename...>
class _Predicate,
131 typename _Tp,
typename _Alloc,
typename... _Args>
132 struct __is_uses_allocator_predicate
133 : conditional<uses_allocator<_Tp, _Alloc>::value,
134 __or_<_Predicate<_Tp, allocator_arg_t, _Alloc, _Args...>,
135 _Predicate<_Tp, _Args..., _Alloc>>,
136 _Predicate<_Tp, _Args...>>::type { };
138 template<
typename _Tp,
typename _Alloc,
typename... _Args>
139 struct __is_uses_allocator_constructible
140 : __is_uses_allocator_predicate<is_constructible, _Tp, _Alloc, _Args...>
143 #if __cplusplus >= 201402L 144 template<
typename _Tp,
typename _Alloc,
typename... _Args>
145 _GLIBCXX17_INLINE constexpr
bool __is_uses_allocator_constructible_v =
146 __is_uses_allocator_constructible<_Tp, _Alloc, _Args...>::value;
149 template<
typename _Tp,
typename _Alloc,
typename... _Args>
150 struct __is_nothrow_uses_allocator_constructible
151 : __is_uses_allocator_predicate<is_nothrow_constructible,
152 _Tp, _Alloc, _Args...>
156 #if __cplusplus >= 201402L 157 template<
typename _Tp,
typename _Alloc,
typename... _Args>
158 _GLIBCXX17_INLINE constexpr
bool 159 __is_nothrow_uses_allocator_constructible_v =
160 __is_nothrow_uses_allocator_constructible<_Tp, _Alloc, _Args...>::value;
163 template<
typename _Tp,
typename... _Args>
164 void __uses_allocator_construct_impl(__uses_alloc0 __a, _Tp* __ptr,
166 { ::new ((
void*)__ptr) _Tp(std::forward<_Args>(__args)...); }
168 template<
typename _Tp,
typename _Alloc,
typename... _Args>
169 void __uses_allocator_construct_impl(__uses_alloc1<_Alloc> __a, _Tp* __ptr,
172 ::new ((
void*)__ptr) _Tp(allocator_arg, *__a._M_a,
173 std::forward<_Args>(__args)...);
176 template<
typename _Tp,
typename _Alloc,
typename... _Args>
177 void __uses_allocator_construct_impl(__uses_alloc2<_Alloc> __a, _Tp* __ptr,
179 { ::new ((
void*)__ptr) _Tp(std::forward<_Args>(__args)..., *__a._M_a); }
181 template<
typename _Tp,
typename _Alloc,
typename... _Args>
182 void __uses_allocator_construct(
const _Alloc& __a, _Tp* __ptr,
185 std::__uses_allocator_construct_impl(
186 std::__use_alloc<_Tp, _Alloc, _Args...>(__a), __ptr,
187 std::forward<_Args>(__args)...);
190 _GLIBCXX_END_NAMESPACE_VERSION
ISO C++ entities toplevel namespace is std.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.