30 #ifndef _RANGES_UNINITIALIZED_H
31 #define _RANGES_UNINITIALIZED_H 1
33 #if __cplusplus > 201703L
34 #if __cpp_lib_concepts
38 namespace std _GLIBCXX_VISIBILITY(default)
40 _GLIBCXX_BEGIN_NAMESPACE_VERSION
45 template<
typename _Tp>
47 __voidify(_Tp& __obj) noexcept
49 return const_cast<void*
>
53 template<
typename _Iter>
54 concept __nothrow_input_iterator
55 = (input_iterator<_Iter>
56 && is_lvalue_reference_v<iter_reference_t<_Iter>>
57 && same_as<remove_cvref_t<iter_reference_t<_Iter>>,
58 iter_value_t<_Iter>>);
60 template<
typename _Sent,
typename _Iter>
61 concept __nothrow_sentinel = sentinel_for<_Sent, _Iter>;
63 template<
typename _Range>
64 concept __nothrow_input_range
66 && __nothrow_input_iterator<iterator_t<_Range>>
67 && __nothrow_sentinel<sentinel_t<_Range>, iterator_t<_Range>>);
69 template<
typename _Iter>
70 concept __nothrow_forward_iterator
71 = (__nothrow_input_iterator<_Iter>
72 && forward_iterator<_Iter>
73 && __nothrow_sentinel<_Iter, _Iter>);
75 template<
typename _Range>
76 concept __nothrow_forward_range
77 = (__nothrow_input_range<_Range>
78 && __nothrow_forward_iterator<iterator_t<_Range>>);
83 template<__detail::__nothrow_input_iterator _Iter,
84 __detail::__nothrow_sentinel<_Iter> _Sent>
85 requires destructible<iter_value_t<_Iter>>
87 operator()(_Iter __first, _Sent __last)
const noexcept;
89 template<__detail::__nothrow_input_range _Range>
90 requires destructible<range_value_t<_Range>>
91 constexpr safe_iterator_t<_Range>
92 operator()(_Range&& __r)
const noexcept;
95 inline constexpr __destroy_fn destroy{};
99 template<
typename _Iter>
100 requires destructible<iter_value_t<_Iter>>
109 _DestroyGuard(
const _Iter* __iter)
110 : _M_first(*__iter), _M_cur(__iter)
115 { _M_cur =
nullptr; }
119 if (_M_cur !=
nullptr)
120 ranges::destroy(
std::move(_M_first), *_M_cur);
124 template<
typename _Iter>
125 requires destructible<iter_value_t<_Iter>>
126 && is_trivially_destructible_v<iter_value_t<_Iter>>
127 struct _DestroyGuard<_Iter>
130 _DestroyGuard(
const _Iter*)
139 struct __uninitialized_default_construct_fn
141 template<__detail::__nothrow_forward_iterator _Iter,
142 __detail::__nothrow_sentinel<_Iter> _Sent>
143 requires default_initializable<iter_value_t<_Iter>>
145 operator()(_Iter __first, _Sent __last)
const
147 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
148 if constexpr (is_trivially_default_constructible_v<_ValueType>)
149 return ranges::next(__first, __last);
152 auto __guard = __detail::_DestroyGuard(&__first);
153 for (; __first != __last; ++__first)
154 ::
new (__detail::__voidify(*__first)) _ValueType;
160 template<__detail::__nothrow_forward_range _Range>
161 requires default_initializable<range_value_t<_Range>>
162 safe_iterator_t<_Range>
163 operator()(_Range&& __r)
const
169 inline constexpr __uninitialized_default_construct_fn
170 uninitialized_default_construct{};
172 struct __uninitialized_default_construct_n_fn
174 template<__detail::__nothrow_forward_iterator _Iter>
175 requires default_initializable<iter_value_t<_Iter>>
177 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const
179 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
180 if constexpr (is_trivially_default_constructible_v<_ValueType>)
181 return ranges::next(__first, __n);
184 auto __guard = __detail::_DestroyGuard(&__first);
185 for (; __n > 0; ++__first, (void) --__n)
186 ::new (__detail::__voidify(*__first)) _ValueType;
193 inline constexpr __uninitialized_default_construct_n_fn
194 uninitialized_default_construct_n;
196 struct __uninitialized_value_construct_fn
198 template<__detail::__nothrow_forward_iterator _Iter,
199 __detail::__nothrow_sentinel<_Iter> _Sent>
200 requires default_initializable<iter_value_t<_Iter>>
202 operator()(_Iter __first, _Sent __last)
const
204 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
205 if constexpr (is_trivial_v<_ValueType>
206 && is_copy_assignable_v<_ValueType>)
207 return ranges::fill(__first, __last, _ValueType());
210 auto __guard = __detail::_DestroyGuard(&__first);
211 for (; __first != __last; ++__first)
212 ::
new (__detail::__voidify(*__first)) _ValueType();
218 template<__detail::__nothrow_forward_range _Range>
219 requires default_initializable<range_value_t<_Range>>
220 safe_iterator_t<_Range>
221 operator()(_Range&& __r)
const
227 inline constexpr __uninitialized_value_construct_fn
228 uninitialized_value_construct{};
230 struct __uninitialized_value_construct_n_fn
232 template<__detail::__nothrow_forward_iterator _Iter>
233 requires default_initializable<iter_value_t<_Iter>>
235 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const
237 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
238 if constexpr (is_trivial_v<_ValueType>
239 && is_copy_assignable_v<_ValueType>)
240 return ranges::fill_n(__first, __n, _ValueType());
243 auto __guard = __detail::_DestroyGuard(&__first);
244 for (; __n > 0; ++__first, (void) --__n)
245 ::new (__detail::__voidify(*__first)) _ValueType();
252 inline constexpr __uninitialized_value_construct_n_fn
253 uninitialized_value_construct_n;
255 template<
typename _Iter,
typename _Out>
256 using uninitialized_copy_result = copy_result<_Iter, _Out>;
258 struct __uninitialized_copy_fn
260 template<input_iterator _Iter, sentinel_for<_Iter> _ISent,
261 __detail::__nothrow_forward_iterator _Out,
262 __detail::__nothrow_sentinel<_Out> _OSent>
263 requires constructible_from<iter_value_t<_Out>, iter_reference_t<_Iter>>
264 uninitialized_copy_result<_Iter, _Out>
265 operator()(_Iter __ifirst, _ISent __ilast,
266 _Out __ofirst, _OSent __olast)
const
268 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
269 if constexpr (sized_sentinel_for<_ISent, _Iter>
270 && sized_sentinel_for<_OSent, _Out>
271 && is_trivial_v<_OutType>
272 && is_nothrow_assignable_v<_OutType,
273 iter_reference_t<_Iter>>)
277 return ranges::copy_n(__ifirst,
std::min(__d1, __d2), __ofirst);
281 auto __guard = __detail::_DestroyGuard(&__ofirst);
282 for (; __ifirst != __ilast && __ofirst != __olast;
283 ++__ofirst, (void)++__ifirst)
284 ::new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
286 return {__ifirst, __ofirst};
290 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
291 requires constructible_from<range_value_t<_ORange>,
292 range_reference_t<_IRange>>
293 uninitialized_copy_result<safe_iterator_t<_IRange>,
294 safe_iterator_t<_ORange>>
295 operator()(_IRange&& __inr, _ORange&& __outr)
const
304 template<
typename _Iter,
typename _Out>
305 using uninitialized_copy_n_result = uninitialized_copy_result<_Iter, _Out>;
307 struct __uninitialized_copy_n_fn
309 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
310 __detail::__nothrow_sentinel<_Out> _Sent>
311 requires constructible_from<iter_value_t<_Out>, iter_reference_t<_Iter>>
312 uninitialized_copy_n_result<_Iter, _Out>
313 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
314 _Out __ofirst, _Sent __olast)
const
316 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
317 if constexpr (sized_sentinel_for<_Sent, _Out>
318 && is_trivial_v<_OutType>
319 && is_nothrow_assignable_v<_OutType,
320 iter_reference_t<_Iter>>)
323 return ranges::copy_n(__ifirst,
std::min(__n, __d), __ofirst);
327 auto __guard = __detail::_DestroyGuard(&__ofirst);
328 for (; __n > 0 && __ofirst != __olast;
329 ++__ofirst, (void)++__ifirst, (
void)--__n)
330 ::
new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
332 return {__ifirst, __ofirst};
339 template<
typename _Iter,
typename _Out>
340 using uninitialized_move_result = uninitialized_copy_result<_Iter, _Out>;
342 struct __uninitialized_move_fn
344 template<input_iterator _Iter, sentinel_for<_Iter> _ISent,
345 __detail::__nothrow_forward_iterator _Out,
346 __detail::__nothrow_sentinel<_Out> _OSent>
347 requires constructible_from<iter_value_t<_Out>,
348 iter_rvalue_reference_t<_Iter>>
349 uninitialized_move_result<_Iter, _Out>
350 operator()(_Iter __ifirst, _ISent __ilast,
351 _Out __ofirst, _OSent __olast)
const
353 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
354 if constexpr (sized_sentinel_for<_ISent, _Iter>
355 && sized_sentinel_for<_OSent, _Out>
356 && is_trivial_v<_OutType>
357 && is_nothrow_assignable_v<_OutType,
358 iter_rvalue_reference_t<_Iter>>)
362 return ranges::copy_n(std::make_move_iterator(__ifirst),
367 auto __guard = __detail::_DestroyGuard(&__ofirst);
368 for (; __ifirst != __ilast && __ofirst != __olast;
369 ++__ofirst, (void)++__ifirst)
370 ::new (__detail::__voidify(*__ofirst))
371 _OutType(ranges::iter_move(__ifirst));
373 return {__ifirst, __ofirst};
377 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
378 requires constructible_from<range_value_t<_ORange>,
379 range_rvalue_reference_t<_IRange>>
380 uninitialized_move_result<safe_iterator_t<_IRange>,
381 safe_iterator_t<_ORange>>
382 operator()(_IRange&& __inr, _ORange&& __outr)
const
389 inline constexpr __uninitialized_move_fn uninitialized_move{};
391 template<
typename _Iter,
typename _Out>
392 using uninitialized_move_n_result = uninitialized_copy_result<_Iter, _Out>;
394 struct __uninitialized_move_n_fn
396 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
397 __detail::__nothrow_sentinel<_Out> _Sent>
398 requires constructible_from<iter_value_t<_Out>,
399 iter_rvalue_reference_t<_Iter>>
400 uninitialized_move_n_result<_Iter, _Out>
401 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
402 _Out __ofirst, _Sent __olast)
const
404 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
405 if constexpr (sized_sentinel_for<_Sent, _Out>
406 && is_trivial_v<_OutType>
407 && is_nothrow_assignable_v<_OutType,
408 iter_rvalue_reference_t<_Iter>>)
411 return ranges::copy_n(std::make_move_iterator(__ifirst),
416 auto __guard = __detail::_DestroyGuard(&__ofirst);
417 for (; __n > 0 && __ofirst != __olast;
418 ++__ofirst, (void)++__ifirst, (
void)--__n)
419 ::
new (__detail::__voidify(*__ofirst))
420 _OutType(ranges::iter_move(__ifirst));
422 return {__ifirst, __ofirst};
427 inline constexpr __uninitialized_move_n_fn uninitialized_move_n{};
429 struct __uninitialized_fill_fn
431 template<__detail::__nothrow_forward_iterator _Iter,
432 __detail::__nothrow_sentinel<_Iter> _Sent,
typename _Tp>
433 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
435 operator()(_Iter __first, _Sent __last,
const _Tp& __x)
const
437 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
438 if constexpr (is_trivial_v<_ValueType>
439 && is_nothrow_assignable_v<_ValueType, const _Tp&>)
440 return ranges::fill(__first, __last, __x);
443 auto __guard = __detail::_DestroyGuard(&__first);
444 for (; __first != __last; ++__first)
445 ::
new (__detail::__voidify(*__first)) _ValueType(__x);
451 template<__detail::__nothrow_forward_range _Range,
typename _Tp>
452 requires constructible_from<range_value_t<_Range>,
const _Tp&>
453 safe_iterator_t<_Range>
454 operator()(_Range&& __r,
const _Tp& __x)
const
462 struct __uninitialized_fill_n_fn
464 template<__detail::__nothrow_forward_iterator _Iter,
typename _Tp>
465 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
467 operator()(_Iter __first, iter_difference_t<_Iter> __n,
468 const _Tp& __x)
const
470 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
471 if constexpr (is_trivial_v<_ValueType>
472 && is_nothrow_assignable_v<_ValueType, const _Tp&>)
473 return ranges::fill_n(__first, __n, __x);
476 auto __guard = __detail::_DestroyGuard(&__first);
477 for (; __n > 0; ++__first, (void)--__n)
478 ::new (__detail::__voidify(*__first)) _ValueType(__x);
487 struct __construct_at_fn
489 template<
typename _Tp,
typename... _Args>
490 requires requires { ::new (declval<void*>()) _Tp(declval<_Args>()...); }
492 operator()(_Tp* __location, _Args&&... __args)
const
494 return ::new (__detail::__voidify(*__location))
495 _Tp(std::forward<_Args>(__args)...);
499 inline constexpr __construct_at_fn construct_at{};
501 struct __destroy_at_fn
503 template<destructible _Tp>
505 operator()(_Tp* __location)
const noexcept
507 if constexpr (is_array_v<_Tp>)
514 inline constexpr __destroy_at_fn destroy_at{};
516 template<__detail::__nothrow_input_iterator _Iter,
517 __detail::__nothrow_sentinel<_Iter> _Sent>
518 requires destructible<iter_value_t<_Iter>>
520 __destroy_fn::operator()(_Iter __first, _Sent __last)
const noexcept
522 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
523 return ranges::next(__first, __last);
526 for (; __first != __last; ++__first)
532 template<__detail::__nothrow_input_range _Range>
533 requires destructible<range_value_t<_Range>>
534 constexpr safe_iterator_t<_Range>
535 __destroy_fn::operator()(_Range&& __r)
const noexcept
540 struct __destroy_n_fn
542 template<__detail::__nothrow_input_iterator _Iter>
543 requires destructible<iter_value_t<_Iter>>
545 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const noexcept
547 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
548 return ranges::next(__first, __n);
551 for (; __n > 0; ++__first, (void)--__n)
558 inline constexpr __destroy_n_fn destroy_n{};
560 _GLIBCXX_END_NAMESPACE_VERSION
564 #endif // _RANGES_UNINITIALIZED_H