@@ -40,104 +40,8 @@ inline constexpr bool __is_std_pair<pair<_Type1, _Type2>> = true;
40
40
template <class _Tp >
41
41
inline constexpr bool __is_cv_std_pair = __is_std_pair<remove_cv_t <_Tp>>;
42
42
43
- template <class _Type , class _Alloc , class ... _Args, __enable_if_t <!__is_cv_std_pair<_Type>, int > = 0 >
44
- _LIBCPP_HIDE_FROM_ABI constexpr auto
45
- __uses_allocator_construction_args (const _Alloc& __alloc, _Args&&... __args) noexcept {
46
- if constexpr (!uses_allocator_v<remove_cv_t <_Type>, _Alloc> && is_constructible_v<_Type, _Args...>) {
47
- return std::forward_as_tuple (std::forward<_Args>(__args)...);
48
- } else if constexpr (uses_allocator_v<remove_cv_t <_Type>, _Alloc> &&
49
- is_constructible_v<_Type, allocator_arg_t , const _Alloc&, _Args...>) {
50
- return tuple<allocator_arg_t , const _Alloc&, _Args&&...>(allocator_arg, __alloc, std::forward<_Args>(__args)...);
51
- } else if constexpr (uses_allocator_v<remove_cv_t <_Type>, _Alloc> &&
52
- is_constructible_v<_Type, _Args..., const _Alloc&>) {
53
- return std::forward_as_tuple (std::forward<_Args>(__args)..., __alloc);
54
- } else {
55
- static_assert (
56
- sizeof (_Type) + 1 == 0 , " If uses_allocator_v<Type> is true, the type has to be allocator-constructible" );
57
- }
58
- }
59
-
60
- template <class _Pair , class _Alloc , class _Tuple1 , class _Tuple2 , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
61
- _LIBCPP_HIDE_FROM_ABI constexpr auto __uses_allocator_construction_args (
62
- const _Alloc& __alloc, piecewise_construct_t , _Tuple1&& __x, _Tuple2&& __y) noexcept {
63
- return std::make_tuple (
64
- piecewise_construct,
65
- std::apply (
66
- [&__alloc](auto &&... __args1) {
67
- return std::__uses_allocator_construction_args<typename _Pair::first_type>(
68
- __alloc, std::forward<decltype (__args1)>(__args1)...);
69
- },
70
- std::forward<_Tuple1>(__x)),
71
- std::apply (
72
- [&__alloc](auto &&... __args2) {
73
- return std::__uses_allocator_construction_args<typename _Pair::second_type>(
74
- __alloc, std::forward<decltype (__args2)>(__args2)...);
75
- },
76
- std::forward<_Tuple2>(__y)));
77
- }
78
-
79
- template <class _Pair , class _Alloc , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
80
- _LIBCPP_HIDE_FROM_ABI constexpr auto __uses_allocator_construction_args (const _Alloc& __alloc) noexcept {
81
- return std::__uses_allocator_construction_args<_Pair>(__alloc, piecewise_construct, tuple<>{}, tuple<>{});
82
- }
83
-
84
- template <class _Pair , class _Alloc , class _Up , class _Vp , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
85
- _LIBCPP_HIDE_FROM_ABI constexpr auto
86
- __uses_allocator_construction_args (const _Alloc& __alloc, _Up&& __u, _Vp&& __v) noexcept {
87
- return std::__uses_allocator_construction_args<_Pair>(
88
- __alloc,
89
- piecewise_construct,
90
- std::forward_as_tuple (std::forward<_Up>(__u)),
91
- std::forward_as_tuple (std::forward<_Vp>(__v)));
92
- }
93
-
94
- # if _LIBCPP_STD_VER >= 23
95
- template <class _Pair , class _Alloc , class _Up , class _Vp , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
96
- _LIBCPP_HIDE_FROM_ABI constexpr auto
97
- __uses_allocator_construction_args (const _Alloc& __alloc, pair<_Up, _Vp>& __pair) noexcept {
98
- return std::__uses_allocator_construction_args<_Pair>(
99
- __alloc, piecewise_construct, std::forward_as_tuple (__pair.first ), std::forward_as_tuple (__pair.second ));
100
- }
101
- # endif
102
-
103
- template <class _Pair , class _Alloc , class _Up , class _Vp , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
104
- _LIBCPP_HIDE_FROM_ABI constexpr auto
105
- __uses_allocator_construction_args (const _Alloc& __alloc, const pair<_Up, _Vp>& __pair) noexcept {
106
- return std::__uses_allocator_construction_args<_Pair>(
107
- __alloc, piecewise_construct, std::forward_as_tuple (__pair.first ), std::forward_as_tuple (__pair.second ));
108
- }
109
-
110
- template <class _Pair , class _Alloc , class _Up , class _Vp , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
111
- _LIBCPP_HIDE_FROM_ABI constexpr auto
112
- __uses_allocator_construction_args (const _Alloc& __alloc, pair<_Up, _Vp>&& __pair) noexcept {
113
- return std::__uses_allocator_construction_args<_Pair>(
114
- __alloc,
115
- piecewise_construct,
116
- std::forward_as_tuple (std::get<0 >(std::move (__pair))),
117
- std::forward_as_tuple (std::get<1 >(std::move (__pair))));
118
- }
119
-
120
- # if _LIBCPP_STD_VER >= 23
121
- template <class _Pair , class _Alloc , class _Up , class _Vp , __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
122
- _LIBCPP_HIDE_FROM_ABI constexpr auto
123
- __uses_allocator_construction_args (const _Alloc& __alloc, const pair<_Up, _Vp>&& __pair) noexcept {
124
- return std::__uses_allocator_construction_args<_Pair>(
125
- __alloc,
126
- piecewise_construct,
127
- std::forward_as_tuple (std::get<0 >(std::move (__pair))),
128
- std::forward_as_tuple (std::get<1 >(std::move (__pair))));
129
- }
130
-
131
- template <class _Pair , class _Alloc , __pair_like_no_subrange _PairLike, __enable_if_t <__is_cv_std_pair<_Pair>, int > = 0 >
132
- _LIBCPP_HIDE_FROM_ABI constexpr auto
133
- __uses_allocator_construction_args (const _Alloc& __alloc, _PairLike&& __p) noexcept {
134
- return std::__uses_allocator_construction_args<_Pair>(
135
- __alloc,
136
- piecewise_construct,
137
- std::forward_as_tuple (std::get<0 >(std::forward<_PairLike>(__p))),
138
- std::forward_as_tuple (std::get<1 >(std::forward<_PairLike>(__p))));
139
- }
140
- # endif
43
+ template <class _Tp , class = void >
44
+ struct __uses_allocator_construction_args ;
141
45
142
46
namespace __uses_allocator_detail {
143
47
@@ -165,54 +69,143 @@ inline constexpr bool __uses_allocator_constraints = __is_cv_std_pair<_Tp> && !_
165
69
166
70
} // namespace __uses_allocator_detail
167
71
168
- template < class _Pair ,
169
- class _Alloc ,
170
- class _Type ,
171
- __enable_if_t <__uses_allocator_detail::__uses_allocator_constraints<_Pair, _Type>, int > = 0 >
172
- _LIBCPP_HIDE_FROM_ABI constexpr auto
173
- __uses_allocator_construction_args (const _Alloc& __alloc, _Type&& __value) noexcept ;
174
-
175
72
template <class _Type , class _Alloc , class ... _Args>
176
73
_LIBCPP_HIDE_FROM_ABI constexpr _Type __make_obj_using_allocator (const _Alloc& __alloc, _Args&&... __args);
177
74
178
- template < class _Pair ,
179
- class _Alloc ,
180
- class _Type ,
181
- __enable_if_t < __uses_allocator_detail::__uses_allocator_constraints<_Pair, _Type>, int >>
182
- _LIBCPP_HIDE_FROM_ABI constexpr auto
183
- __uses_allocator_construction_args (const _Alloc& __alloc, _Type&& __value) noexcept {
184
- struct __pair_constructor {
185
- using _PairMutable = remove_cv_t <_Pair>;
75
+ template <class _Pair >
76
+ struct __uses_allocator_construction_args <_Pair, __enable_if_t <__is_cv_std_pair<_Pair>>> {
77
+ template <class _Alloc , class _Tuple1 , class _Tuple2 >
78
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto
79
+ __apply (const _Alloc& __alloc, piecewise_construct_t , _Tuple1&& __x, _Tuple2&& __y) noexcept {
80
+ return std::make_tuple (
81
+ piecewise_construct,
82
+ std::apply (
83
+ [&__alloc](auto &&... __args1) {
84
+ return __uses_allocator_construction_args<typename _Pair::first_type>::__apply (
85
+ __alloc, std::forward<decltype (__args1)>(__args1)...);
86
+ },
87
+ std::forward<_Tuple1>(__x)),
88
+ std::apply (
89
+ [&__alloc](auto &&... __args2) {
90
+ return __uses_allocator_construction_args<typename _Pair::second_type>::__apply (
91
+ __alloc, std::forward<decltype (__args2)>(__args2)...);
92
+ },
93
+ std::forward<_Tuple2>(__y)));
94
+ }
186
95
187
- _LIBCPP_HIDDEN constexpr auto __do_construct (const _PairMutable& __pair) const {
188
- return std::__make_obj_using_allocator<_PairMutable>(__alloc_, __pair);
189
- }
96
+ template <class _Alloc >
97
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc) noexcept {
98
+ return __uses_allocator_construction_args<_Pair>::__apply (__alloc, piecewise_construct, tuple<>{}, tuple<>{});
99
+ }
190
100
191
- _LIBCPP_HIDDEN constexpr auto __do_construct (_PairMutable&& __pair) const {
192
- return std::__make_obj_using_allocator<_PairMutable>(__alloc_, std::move (__pair));
193
- }
101
+ template <class _Alloc , class _Up , class _Vp >
102
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, _Up&& __u, _Vp&& __v) noexcept {
103
+ return __uses_allocator_construction_args<_Pair>::__apply (
104
+ __alloc,
105
+ piecewise_construct,
106
+ std::forward_as_tuple (std::forward<_Up>(__u)),
107
+ std::forward_as_tuple (std::forward<_Vp>(__v)));
108
+ }
194
109
195
- const _Alloc& __alloc_;
196
- _Type& __value_;
110
+ # if _LIBCPP_STD_VER >= 23
111
+ template <class _Alloc , class _Up , class _Vp >
112
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, pair<_Up, _Vp>& __pair) noexcept {
113
+ return __uses_allocator_construction_args<_Pair>::__apply (
114
+ __alloc, piecewise_construct, std::forward_as_tuple (__pair.first ), std::forward_as_tuple (__pair.second ));
115
+ }
116
+ # endif
197
117
198
- _LIBCPP_HIDDEN constexpr operator _PairMutable () const { return __do_construct (std::forward<_Type>(__value_)); }
199
- };
118
+ template <class _Alloc , class _Up , class _Vp >
119
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, const pair<_Up, _Vp>& __pair) noexcept {
120
+ return __uses_allocator_construction_args<_Pair>::__apply (
121
+ __alloc, piecewise_construct, std::forward_as_tuple (__pair.first ), std::forward_as_tuple (__pair.second ));
122
+ }
200
123
201
- return std::make_tuple (__pair_constructor{__alloc, __value});
202
- }
124
+ template <class _Alloc , class _Up , class _Vp >
125
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, pair<_Up, _Vp>&& __pair) noexcept {
126
+ return __uses_allocator_construction_args<_Pair>::__apply (
127
+ __alloc,
128
+ piecewise_construct,
129
+ std::forward_as_tuple (std::get<0 >(std::move (__pair))),
130
+ std::forward_as_tuple (std::get<1 >(std::move (__pair))));
131
+ }
132
+
133
+ # if _LIBCPP_STD_VER >= 23
134
+ template <class _Alloc , class _Up , class _Vp >
135
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, const pair<_Up, _Vp>&& __pair) noexcept {
136
+ return __uses_allocator_construction_args<_Pair>::__apply (
137
+ __alloc,
138
+ piecewise_construct,
139
+ std::forward_as_tuple (std::get<0 >(std::move (__pair))),
140
+ std::forward_as_tuple (std::get<1 >(std::move (__pair))));
141
+ }
142
+
143
+ template < class _Alloc , __pair_like_no_subrange _PairLike>
144
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, _PairLike&& __p) noexcept {
145
+ return __uses_allocator_construction_args<_Pair>::__apply (
146
+ __alloc,
147
+ piecewise_construct,
148
+ std::forward_as_tuple (std::get<0 >(std::forward<_PairLike>(__p))),
149
+ std::forward_as_tuple (std::get<1 >(std::forward<_PairLike>(__p))));
150
+ }
151
+ # endif
152
+
153
+ template <class _Alloc ,
154
+ class _Type ,
155
+ __enable_if_t <__uses_allocator_detail::__uses_allocator_constraints<_Pair, _Type>, int > = 0 >
156
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, _Type&& __value) noexcept {
157
+ struct __pair_constructor {
158
+ using _PairMutable = remove_cv_t <_Pair>;
159
+
160
+ _LIBCPP_HIDDEN constexpr auto __do_construct (const _PairMutable& __pair) const {
161
+ return std::__make_obj_using_allocator<_PairMutable>(__alloc_, __pair);
162
+ }
163
+
164
+ _LIBCPP_HIDDEN constexpr auto __do_construct (_PairMutable&& __pair) const {
165
+ return std::__make_obj_using_allocator<_PairMutable>(__alloc_, std::move (__pair));
166
+ }
167
+
168
+ const _Alloc& __alloc_;
169
+ _Type& __value_;
170
+
171
+ _LIBCPP_HIDDEN constexpr operator _PairMutable () const { return __do_construct (std::forward<_Type>(__value_)); }
172
+ };
173
+
174
+ return std::make_tuple (__pair_constructor{__alloc, __value});
175
+ }
176
+ };
177
+
178
+ template <class _Type >
179
+ struct __uses_allocator_construction_args <_Type, __enable_if_t <!__is_cv_std_pair<_Type>>> {
180
+ template <class _Alloc , class ... _Args>
181
+ static _LIBCPP_HIDE_FROM_ABI constexpr auto __apply (const _Alloc& __alloc, _Args&&... __args) noexcept {
182
+ if constexpr (!uses_allocator_v<remove_cv_t <_Type>, _Alloc> && is_constructible_v<_Type, _Args...>) {
183
+ return std::forward_as_tuple (std::forward<_Args>(__args)...);
184
+ } else if constexpr (uses_allocator_v<remove_cv_t <_Type>, _Alloc> &&
185
+ is_constructible_v<_Type, allocator_arg_t , const _Alloc&, _Args...>) {
186
+ return tuple<allocator_arg_t , const _Alloc&, _Args&&...>(allocator_arg, __alloc, std::forward<_Args>(__args)...);
187
+ } else if constexpr (uses_allocator_v<remove_cv_t <_Type>, _Alloc> &&
188
+ is_constructible_v<_Type, _Args..., const _Alloc&>) {
189
+ return std::forward_as_tuple (std::forward<_Args>(__args)..., __alloc);
190
+ } else {
191
+ static_assert (
192
+ sizeof (_Type) + 1 == 0 , " If uses_allocator_v<Type> is true, the type has to be allocator-constructible" );
193
+ }
194
+ }
195
+ };
203
196
204
197
template <class _Type , class _Alloc , class ... _Args>
205
198
_LIBCPP_HIDE_FROM_ABI constexpr _Type __make_obj_using_allocator (const _Alloc& __alloc, _Args&&... __args) {
206
199
return std::make_from_tuple<_Type>(
207
- std:: __uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...));
200
+ __uses_allocator_construction_args<_Type>:: __apply (__alloc, std::forward<_Args>(__args)...));
208
201
}
209
202
210
203
template <class _Type , class _Alloc , class ... _Args>
211
204
_LIBCPP_HIDE_FROM_ABI constexpr _Type*
212
205
__uninitialized_construct_using_allocator (_Type* __ptr, const _Alloc& __alloc, _Args&&... __args) {
213
206
return std::apply (
214
207
[&__ptr](auto &&... __xs) { return std::__construct_at (__ptr, std::forward<decltype (__xs)>(__xs)...); },
215
- std:: __uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...));
208
+ __uses_allocator_construction_args<_Type>:: __apply (__alloc, std::forward<_Args>(__args)...));
216
209
}
217
210
218
211
#endif // _LIBCPP_STD_VER >= 17
@@ -221,8 +214,8 @@ __uninitialized_construct_using_allocator(_Type* __ptr, const _Alloc& __alloc, _
221
214
222
215
template <class _Type , class _Alloc , class ... _Args>
223
216
_LIBCPP_HIDE_FROM_ABI constexpr auto uses_allocator_construction_args (const _Alloc& __alloc, _Args&&... __args) noexcept
224
- -> decltype(std:: __uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...)) {
225
- return /* --*/ std:: __uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...);
217
+ -> decltype(__uses_allocator_construction_args<_Type>::__apply (__alloc, std::forward<_Args>(__args)...)) {
218
+ return /* --*/ __uses_allocator_construction_args<_Type>:: __apply (__alloc, std::forward<_Args>(__args)...);
226
219
}
227
220
228
221
template <class _Type , class _Alloc , class ... _Args>
0 commit comments