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>>
109 _DestroyGuard(
const _Iter& __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 borrowed_iterator_t<_Range>
163 operator()(_Range&& __r)
const
165 return (*
this)(ranges::begin(__r), ranges::end(__r));
169 inline constexpr __uninitialized_default_construct_fn
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
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_trivially_default_constructible_v<_ValueType>
206 && is_trivially_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 borrowed_iterator_t<_Range>
221 operator()(_Range&& __r)
const
223 return (*
this)(ranges::begin(__r), ranges::end(__r));
227 inline constexpr __uninitialized_value_construct_fn
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_trivially_default_constructible_v<_ValueType>
239 && is_trivially_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
255 template<
typename _Iter,
typename _Out>
256 using uninitialized_copy_result = in_out_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_trivially_constructible_v<_OutType, iter_reference_t<_Iter>>
272 && is_trivially_default_constructible_v<_OutType>
273 && is_trivially_assignable_v<_OutType&,
274 iter_reference_t<_Iter>>)
276 auto __d1 = __ilast - __ifirst;
277 auto __d2 = __olast - __ofirst;
283 auto __guard = __detail::_DestroyGuard(__ofirst);
284 for (; __ifirst != __ilast && __ofirst != __olast;
285 ++__ofirst, (void)++__ifirst)
286 ::new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
292 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
293 requires constructible_from<range_value_t<_ORange>,
294 range_reference_t<_IRange>>
295 uninitialized_copy_result<borrowed_iterator_t<_IRange>,
296 borrowed_iterator_t<_ORange>>
297 operator()(_IRange&& __inr, _ORange&& __outr)
const
299 return (*
this)(ranges::begin(__inr), ranges::end(__inr),
300 ranges::begin(__outr), ranges::end(__outr));
306 template<
typename _Iter,
typename _Out>
307 using uninitialized_copy_n_result = in_out_result<_Iter, _Out>;
309 struct __uninitialized_copy_n_fn
311 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
312 __detail::__nothrow_sentinel<_Out> _Sent>
313 requires constructible_from<iter_value_t<_Out>, iter_reference_t<_Iter>>
314 uninitialized_copy_n_result<_Iter, _Out>
315 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
316 _Out __ofirst, _Sent __olast)
const
318 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
319 if constexpr (sized_sentinel_for<_Sent, _Out>
320 && is_trivially_constructible_v<_OutType, iter_reference_t<_Iter>>
321 && is_trivially_default_constructible_v<_OutType>
322 && is_trivially_assignable_v<_OutType&,
323 iter_reference_t<_Iter>>)
325 auto __d = __olast - __ofirst;
331 auto __guard = __detail::_DestroyGuard(__ofirst);
332 for (; __n > 0 && __ofirst != __olast;
333 ++__ofirst, (void)++__ifirst, (void)--__n)
334 ::new (__detail::__voidify(*__ofirst)) _OutType(*__ifirst);
343 template<
typename _Iter,
typename _Out>
344 using uninitialized_move_result = in_out_result<_Iter, _Out>;
346 struct __uninitialized_move_fn
348 template<input_iterator _Iter, sentinel_for<_Iter> _ISent,
349 __detail::__nothrow_forward_iterator _Out,
350 __detail::__nothrow_sentinel<_Out> _OSent>
351 requires constructible_from<iter_value_t<_Out>,
352 iter_rvalue_reference_t<_Iter>>
353 uninitialized_move_result<_Iter, _Out>
354 operator()(_Iter __ifirst, _ISent __ilast,
355 _Out __ofirst, _OSent __olast)
const
357 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
358 if constexpr (sized_sentinel_for<_ISent, _Iter>
359 && sized_sentinel_for<_OSent, _Out>
360 && is_trivially_constructible_v<_OutType, iter_rvalue_reference_t<_Iter>>
361 && is_trivially_default_constructible_v<_OutType>
362 && is_trivially_assignable_v<_OutType&,
363 iter_rvalue_reference_t<_Iter>>)
365 auto __d1 = __ilast - __ifirst;
366 auto __d2 = __olast - __ofirst;
368 = ranges::copy_n(std::make_move_iterator(
std::move(__ifirst)),
374 auto __guard = __detail::_DestroyGuard(__ofirst);
375 for (; __ifirst != __ilast && __ofirst != __olast;
376 ++__ofirst, (void)++__ifirst)
377 ::new (__detail::__voidify(*__ofirst))
378 _OutType(ranges::iter_move(__ifirst));
384 template<input_range _IRange, __detail::__nothrow_forward_range _ORange>
385 requires constructible_from<range_value_t<_ORange>,
386 range_rvalue_reference_t<_IRange>>
387 uninitialized_move_result<borrowed_iterator_t<_IRange>,
388 borrowed_iterator_t<_ORange>>
389 operator()(_IRange&& __inr, _ORange&& __outr)
const
391 return (*
this)(ranges::begin(__inr), ranges::end(__inr),
392 ranges::begin(__outr), ranges::end(__outr));
398 template<
typename _Iter,
typename _Out>
399 using uninitialized_move_n_result = in_out_result<_Iter, _Out>;
401 struct __uninitialized_move_n_fn
403 template<input_iterator _Iter, __detail::__nothrow_forward_iterator _Out,
404 __detail::__nothrow_sentinel<_Out> _Sent>
405 requires constructible_from<iter_value_t<_Out>,
406 iter_rvalue_reference_t<_Iter>>
407 uninitialized_move_n_result<_Iter, _Out>
408 operator()(_Iter __ifirst, iter_difference_t<_Iter> __n,
409 _Out __ofirst, _Sent __olast)
const
411 using _OutType = remove_reference_t<iter_reference_t<_Out>>;
412 if constexpr (sized_sentinel_for<_Sent, _Out>
413 && is_trivially_constructible_v<_OutType, iter_rvalue_reference_t<_Iter>>
414 && is_trivially_default_constructible_v<_OutType>
415 && is_trivially_assignable_v<_OutType&,
416 iter_rvalue_reference_t<_Iter>>)
418 auto __d = __olast - __ofirst;
420 = ranges::copy_n(std::make_move_iterator(
std::move(__ifirst)),
426 auto __guard = __detail::_DestroyGuard(__ofirst);
427 for (; __n > 0 && __ofirst != __olast;
428 ++__ofirst, (void)++__ifirst, (void)--__n)
429 ::new (__detail::__voidify(*__ofirst))
430 _OutType(ranges::iter_move(__ifirst));
439 struct __uninitialized_fill_fn
441 template<__detail::__nothrow_forward_iterator _Iter,
442 __detail::__nothrow_sentinel<_Iter> _Sent,
typename _Tp>
443 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
445 operator()(_Iter __first, _Sent __last,
const _Tp& __x)
const
447 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
448 if constexpr (is_trivially_constructible_v<_ValueType, const _Tp&>
449 && is_trivially_assignable_v<_ValueType&, const _Tp&>)
450 return ranges::fill(__first, __last, __x);
453 auto __guard = __detail::_DestroyGuard(__first);
454 for (; __first != __last; ++__first)
455 ::new (__detail::__voidify(*__first)) _ValueType(__x);
461 template<__detail::__nothrow_forward_range _Range,
typename _Tp>
462 requires constructible_from<range_value_t<_Range>,
const _Tp&>
463 borrowed_iterator_t<_Range>
464 operator()(_Range&& __r,
const _Tp& __x)
const
466 return (*
this)(ranges::begin(__r), ranges::end(__r), __x);
472 struct __uninitialized_fill_n_fn
474 template<__detail::__nothrow_forward_iterator _Iter,
typename _Tp>
475 requires constructible_from<iter_value_t<_Iter>,
const _Tp&>
477 operator()(_Iter __first, iter_difference_t<_Iter> __n,
478 const _Tp& __x)
const
480 using _ValueType = remove_reference_t<iter_reference_t<_Iter>>;
481 if constexpr (is_trivially_constructible_v<_ValueType, const _Tp&>
482 && is_trivially_assignable_v<_ValueType&, const _Tp&>)
483 return ranges::fill_n(__first, __n, __x);
486 auto __guard = __detail::_DestroyGuard(__first);
487 for (; __n > 0; ++__first, (void)--__n)
488 ::new (__detail::__voidify(*__first)) _ValueType(__x);
497 struct __construct_at_fn
499 template<
typename _Tp,
typename... _Args>
504 operator()(_Tp* __location, _Args&&... __args) const
505 noexcept(noexcept(
std::construct_at(__location,
506 std::forward<_Args>(__args)...)))
508 return std::construct_at(__location,
513 inline constexpr __construct_at_fn construct_at{};
515 struct __destroy_at_fn
517 template<destructible _Tp>
519 operator()(_Tp* __location)
const noexcept
521 if constexpr (is_array_v<_Tp>)
522 ranges::destroy(ranges::begin(*__location), ranges::end(*__location));
528 inline constexpr __destroy_at_fn destroy_at{};
530 template<__detail::__nothrow_input_iterator _Iter,
531 __detail::__nothrow_sentinel<_Iter> _Sent>
532 requires destructible<iter_value_t<_Iter>>
534 __destroy_fn::operator()(_Iter __first, _Sent __last)
const noexcept
536 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
537 return ranges::next(
std::move(__first), __last);
540 for (; __first != __last; ++__first)
546 template<__detail::__nothrow_input_range _Range>
547 requires destructible<range_value_t<_Range>>
548 constexpr borrowed_iterator_t<_Range>
549 __destroy_fn::operator()(_Range&& __r)
const noexcept
551 return (*
this)(ranges::begin(__r), ranges::end(__r));
554 struct __destroy_n_fn
556 template<__detail::__nothrow_input_iterator _Iter>
557 requires destructible<iter_value_t<_Iter>>
559 operator()(_Iter __first, iter_difference_t<_Iter> __n)
const noexcept
561 if constexpr (is_trivially_destructible_v<iter_value_t<_Iter>>)
562 return ranges::next(
std::move(__first), __n);
565 for (; __n > 0; ++__first, (void)--__n)
572 inline constexpr __destroy_n_fn destroy_n{};
574_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.