30#ifndef _RANGES_UNINITIALIZED_H
31#define _RANGES_UNINITIALIZED_H 1
33#if __cplusplus > 201703L
38namespace 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 borrowed_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>>
110 _DestroyGuard(
const _Iter& __iter)
111 : _M_first(__iter), _M_cur(std::
__addressof(__iter))
117 { _M_cur =
nullptr; }
122 if (_M_cur !=
nullptr)
123 ranges::destroy(
std::move(_M_first), *_M_cur);
127 template<
typename _Iter>
128 requires destructible<iter_value_t<_Iter>>
129 && is_trivially_destructible_v<iter_value_t<_Iter>>
130 struct _DestroyGuard<_Iter>
134 _DestroyGuard(
const _Iter&)
144 struct __uninitialized_default_construct_fn
146 template<__detail::__nothrow_forward_iterator _Iter,
147 __detail::__nothrow_sentinel<_Iter> _Sent>
148 requires default_initializable<iter_value_t<_Iter>>
151 operator()(_Iter __first, _Sent __last)
const
153 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
154 if constexpr (is_trivially_default_constructible_v<_ValueType>)
155 return ranges::next(__first, __last);
158 auto __guard = __detail::_DestroyGuard(__first);
159 for (; __first != __last; ++__first)
160 ::new (__detail::__voidify(*__first)) _ValueType;
166 template<__detail::__nothrow_forward_range _Range>
167 requires default_initializable<range_value_t<_Range>>
169 borrowed_iterator_t<_Range>
170 operator()(_Range&& __r)
const
172 return (*
this)(ranges::begin(__r), ranges::end(__r));
176 inline constexpr __uninitialized_default_construct_fn
179 struct __uninitialized_default_construct_n_fn
181 template<__detail::__nothrow_forward_iterator _Iter>
182 requires default_initializable<iter_value_t<_Iter>>
185 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const
187 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
188 if constexpr (is_trivially_default_constructible_v<_ValueType>)
189 return ranges::next(__first, __n);
192 auto __guard = __detail::_DestroyGuard(__first);
193 for (; __n > 0; ++__first, (void) --__n)
194 ::new (__detail::__voidify(*__first)) _ValueType;
201 inline constexpr __uninitialized_default_construct_n_fn
204 struct __uninitialized_value_construct_fn
206 template<__detail::__nothrow_forward_iterator _Iter,
207 __detail::__nothrow_sentinel<_Iter> _Sent>
208 requires default_initializable<iter_value_t<_Iter>>
211 operator()(_Iter __first, _Sent __last)
const
213 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
214 if constexpr (is_trivially_default_constructible_v<_ValueType>
215 && is_trivially_copy_assignable_v<_ValueType>)
216 return ranges::fill(__first, __last, _ValueType());
219 auto __guard = __detail::_DestroyGuard(__first);
220 for (; __first != __last; ++__first)
221 ::new (__detail::__voidify(*__first)) _ValueType();
227 template<__detail::__nothrow_forward_range _Range>
228 requires default_initializable<range_value_t<_Range>>
230 borrowed_iterator_t<_Range>
231 operator()(_Range&& __r)
const
233 return (*
this)(ranges::begin(__r), ranges::end(__r));
237 inline constexpr __uninitialized_value_construct_fn
240 struct __uninitialized_value_construct_n_fn
242 template<__detail::__nothrow_forward_iterator _Iter>
243 requires default_initializable<iter_value_t<_Iter>>
246 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const
248 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
249 if constexpr (is_trivially_default_constructible_v<_ValueType>
250 && is_trivially_copy_assignable_v<_ValueType>)
251 return ranges::fill_n(__first, __n, _ValueType());
254 auto __guard = __detail::_DestroyGuard(__first);
255 for (; __n > 0; ++__first, (void) --__n)
256 ::new (__detail::__voidify(*__first)) _ValueType();
263 inline constexpr __uninitialized_value_construct_n_fn
272 template<
typename _Dp1,
typename _Dp2>
273 constexpr common_type_t<_Dp1, _Dp2>
274 operator()(_Dp1 __d1, _Dp2 __d2)
const noexcept
278 static_assert(std::__detail::__is_signed_integer_like<_Dp1>);
279 static_assert(std::__detail::__is_signed_integer_like<_Dp2>);
283 inline constexpr __mindist_fn __mindist{};
286 template<
typename _Iter,
typename _Out>
287 using uninitialized_copy_result = in_out_result<_Iter, _Out>;
289 struct __uninitialized_copy_fn
291 template<input_iterator _Iter, sentinel_for<_Iter> _ISent,
292 __detail::__nothrow_forward_iterator _Out,
293 __detail::__nothrow_sentinel<_Out> _OSent>
294 requires constructible_from<iter_value_t<_Out>, iter_reference_t<_Iter>>
296 uninitialized_copy_result<_Iter, _Out>
297 operator()(_Iter __ifirst, _ISent __ilast,
298 _Out __ofirst, _OSent __olast)
const
300 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
301 if constexpr (sized_sentinel_for<_ISent, _Iter>
302 && sized_sentinel_for<_OSent, _Out>
303 && is_trivially_constructible_v<_OutType, iter_reference_t<_Iter>>
304 && is_trivially_default_constructible_v<_OutType>
305 && is_trivially_assignable_v<_OutType&,
306 iter_reference_t<_Iter>>)
308 auto __d1 = __ilast - __ifirst;
309 auto __d2 = __olast - __ofirst;
310 return ranges::copy_n(
std::move(__ifirst),
311 __detail::__mindist(__d1, __d2), __ofirst);
315 auto __guard = __detail::_DestroyGuard(__ofirst);
316 for (; __ifirst != __ilast && __ofirst != __olast;
317 ++__ofirst, (void)++__ifirst)
318 ::new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
324 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
325 requires constructible_from<range_value_t<_ORange>,
326 range_reference_t<_IRange>>
328 uninitialized_copy_result<borrowed_iterator_t<_IRange>,
329 borrowed_iterator_t<_ORange>>
330 operator()(_IRange&& __inr, _ORange&& __outr)
const
332 return (*
this)(ranges::begin(__inr), ranges::end(__inr),
333 ranges::begin(__outr), ranges::end(__outr));
339 template<
typename _Iter,
typename _Out>
340 using uninitialized_copy_n_result = in_out_result<_Iter, _Out>;
342 struct __uninitialized_copy_n_fn
344 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
345 __detail::__nothrow_sentinel<_Out> _Sent>
346 requires constructible_from<iter_value_t<_Out>, iter_reference_t<_Iter>>
348 uninitialized_copy_n_result<_Iter, _Out>
349 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
350 _Out __ofirst, _Sent __olast)
const
352 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
353 if constexpr (sized_sentinel_for<_Sent, _Out>
354 && is_trivially_constructible_v<_OutType, iter_reference_t<_Iter>>
355 && is_trivially_default_constructible_v<_OutType>
356 && is_trivially_assignable_v<_OutType&,
357 iter_reference_t<_Iter>>)
359 auto __d = __olast - __ofirst;
360 return ranges::copy_n(
std::move(__ifirst),
361 __detail::__mindist(__n, __d), __ofirst);
365 auto __guard = __detail::_DestroyGuard(__ofirst);
366 for (; __n > 0 && __ofirst != __olast;
367 ++__ofirst, (void)++__ifirst, (void)--__n)
368 ::new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
377 template<
typename _Iter,
typename _Out>
378 using uninitialized_move_result = in_out_result<_Iter, _Out>;
380 struct __uninitialized_move_fn
382 template<input_iterator _Iter, sentinel_for<_Iter> _ISent,
383 __detail::__nothrow_forward_iterator _Out,
384 __detail::__nothrow_sentinel<_Out> _OSent>
385 requires constructible_from<iter_value_t<_Out>,
386 iter_rvalue_reference_t<_Iter>>
388 uninitialized_move_result<_Iter, _Out>
389 operator()(_Iter __ifirst, _ISent __ilast,
390 _Out __ofirst, _OSent __olast)
const
392 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
393 if constexpr (sized_sentinel_for<_ISent, _Iter>
394 && sized_sentinel_for<_OSent, _Out>
395 && is_trivially_constructible_v<_OutType, iter_rvalue_reference_t<_Iter>>
396 && is_trivially_default_constructible_v<_OutType>
397 && is_trivially_assignable_v<_OutType&,
398 iter_rvalue_reference_t<_Iter>>)
400 auto __d1 = __ilast - __ifirst;
401 auto __d2 = __olast - __ofirst;
403 = ranges::copy_n(std::make_move_iterator(
std::move(__ifirst)),
404 __detail::__mindist(__d1, __d2), __ofirst);
409 auto __guard = __detail::_DestroyGuard(__ofirst);
410 for (; __ifirst != __ilast && __ofirst != __olast;
411 ++__ofirst, (void)++__ifirst)
412 ::new (__detail::__voidify(*__ofirst))
413 _OutType(ranges::iter_move(__ifirst));
419 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
420 requires constructible_from<range_value_t<_ORange>,
421 range_rvalue_reference_t<_IRange>>
423 uninitialized_move_result<borrowed_iterator_t<_IRange>,
424 borrowed_iterator_t<_ORange>>
425 operator()(_IRange&& __inr, _ORange&& __outr)
const
427 return (*
this)(ranges::begin(__inr), ranges::end(__inr),
428 ranges::begin(__outr), ranges::end(__outr));
434 template<
typename _Iter,
typename _Out>
435 using uninitialized_move_n_result = in_out_result<_Iter, _Out>;
437 struct __uninitialized_move_n_fn
439 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
440 __detail::__nothrow_sentinel<_Out> _Sent>
441 requires constructible_from<iter_value_t<_Out>,
442 iter_rvalue_reference_t<_Iter>>
444 uninitialized_move_n_result<_Iter, _Out>
445 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
446 _Out __ofirst, _Sent __olast)
const
448 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
449 if constexpr (sized_sentinel_for<_Sent, _Out>
450 && is_trivially_constructible_v<_OutType, iter_rvalue_reference_t<_Iter>>
451 && is_trivially_default_constructible_v<_OutType>
452 && is_trivially_assignable_v<_OutType&,
453 iter_rvalue_reference_t<_Iter>>)
455 auto __d = __olast - __ofirst;
457 = ranges::copy_n(std::make_move_iterator(
std::move(__ifirst)),
458 __detail::__mindist(__n, __d), __ofirst);
463 auto __guard = __detail::_DestroyGuard(__ofirst);
464 for (; __n > 0 && __ofirst != __olast;
465 ++__ofirst, (void)++__ifirst, (void)--__n)
466 ::new (__detail::__voidify(*__ofirst))
467 _OutType(ranges::iter_move(__ifirst));
476 struct __uninitialized_fill_fn
478 template<__detail::__nothrow_forward_iterator _Iter,
479 __detail::__nothrow_sentinel<_Iter> _Sent,
typename _Tp>
480 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
483 operator()(_Iter __first, _Sent __last,
const _Tp& __x)
const
485 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
486 if constexpr (is_trivially_constructible_v<_ValueType, const _Tp&>
487 && is_trivially_assignable_v<_ValueType&, const _Tp&>)
488 return ranges::fill(__first, __last, __x);
491 auto __guard = __detail::_DestroyGuard(__first);
492 for (; __first != __last; ++__first)
493 ::new (__detail::__voidify(*__first)) _ValueType(__x);
499 template<__detail::__nothrow_forward_range _Range,
typename _Tp>
500 requires constructible_from<range_value_t<_Range>,
const _Tp&>
502 borrowed_iterator_t<_Range>
503 operator()(_Range&& __r,
const _Tp& __x)
const
505 return (*
this)(ranges::begin(__r), ranges::end(__r), __x);
511 struct __uninitialized_fill_n_fn
513 template<__detail::__nothrow_forward_iterator _Iter,
typename _Tp>
514 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
517 operator()(_Iter __first, iter_difference_t<_Iter> __n,
518 const _Tp& __x)
const
520 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
521 if constexpr (is_trivially_constructible_v<_ValueType, const _Tp&>
522 && is_trivially_assignable_v<_ValueType&, const _Tp&>)
523 return ranges::fill_n(__first, __n, __x);
526 auto __guard = __detail::_DestroyGuard(__first);
527 for (; __n > 0; ++__first, (void)--__n)
528 ::new (__detail::__voidify(*__first)) _ValueType(__x);
537 struct __construct_at_fn
539 template<
typename _Tp,
typename... _Args>
544 operator()(_Tp* __location, _Args&&... __args) const
545 noexcept(noexcept(std::construct_at(__location,
546 std::forward<_Args>(__args)...)))
548 return std::construct_at(__location,
553 inline constexpr __construct_at_fn construct_at{};
555 struct __destroy_at_fn
557 template<destructible _Tp>
559 operator()(_Tp* __location)
const noexcept
561 if constexpr (is_array_v<_Tp>)
562 ranges::destroy(ranges::begin(*__location), ranges::end(*__location));
568 inline constexpr __destroy_at_fn destroy_at{};
570 template<__detail::__nothrow_input_iterator _Iter,
571 __detail::__nothrow_sentinel<_Iter> _Sent>
572 requires destructible<iter_value_t<_Iter>>
574 __destroy_fn::operator()(_Iter __first, _Sent __last)
const noexcept
576 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
577 return ranges::next(
std::move(__first), __last);
580 for (; __first != __last; ++__first)
586 template<__detail::__nothrow_input_range _Range>
587 requires destructible<range_value_t<_Range>>
588 constexpr borrowed_iterator_t<_Range>
589 __destroy_fn::operator()(_Range&& __r)
const noexcept
591 return (*
this)(ranges::begin(__r), ranges::end(__r));
594 struct __destroy_n_fn
596 template<__detail::__nothrow_input_iterator _Iter>
597 requires destructible<iter_value_t<_Iter>>
599 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const noexcept
601 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
602 return ranges::next(
std::move(__first), __n);
605 for (; __n > 0; ++__first, (void)--__n)
612 inline constexpr __destroy_n_fn destroy_n{};
614_GLIBCXX_END_NAMESPACE_VERSION
_ForwardIterator uninitialized_copy_n(_InputIterator __first, _Size __n, _ForwardIterator __result)
Copies the range [first,first+n) into result.
void uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__x)
Copies the value x into the range [first,last).
_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
Value-initializes objects in the range [first,first+count).
_ForwardIterator uninitialized_move(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Move-construct from the range [first,last) into result.
_ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __count)
Default-initializes objects in the range [first,first+count).
void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last)
Default-initializes objects in the range [first,last).
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last)
Value-initializes objects in the range [first,last).
pair< _InputIterator, _ForwardIterator > uninitialized_move_n(_InputIterator __first, _Size __count, _ForwardIterator __result)
Move-construct from the range [first,first+count) into result.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.