30#ifndef _GLIBCXX_RANGES_BASE_H
31#define _GLIBCXX_RANGES_BASE_H 1
33#pragma GCC system_header
35#if __cplusplus > 201703L
42#ifdef __cpp_lib_concepts
43namespace std _GLIBCXX_VISIBILITY(default)
45_GLIBCXX_BEGIN_NAMESPACE_VERSION
49 inline constexpr bool disable_sized_range =
false;
51 template<
typename _Tp>
52 inline constexpr bool enable_borrowed_range =
false;
56 constexpr __max_size_type
57 __to_unsigned_like(__max_size_type __t)
noexcept
60 constexpr __max_size_type
61 __to_unsigned_like(__max_diff_type __t)
noexcept
62 {
return __max_size_type(__t); }
64 template<
integral _Tp>
66 __to_unsigned_like(_Tp __t)
noexcept
67 {
return static_cast<make_unsigned_t<_Tp>
>(__t); }
69#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
70 constexpr unsigned __int128
71 __to_unsigned_like(__int128 __t)
noexcept
74 constexpr unsigned __int128
75 __to_unsigned_like(
unsigned __int128 __t)
noexcept
79 template<
typename _Tp>
80 using __make_unsigned_like_t
81 =
decltype(__detail::__to_unsigned_like(std::declval<_Tp>()));
84 template<
typename _Tp>
85 concept __maybe_borrowed_range
86 = is_lvalue_reference_v<_Tp>
87 || enable_borrowed_range<remove_cvref_t<_Tp>>;
94 using std::ranges::__detail::__maybe_borrowed_range;
95 using std::__detail::__range_iter_t;
100 template<
typename _Tp>
101 static constexpr bool
104 if constexpr (is_array_v<remove_reference_t<_Tp>>)
106 else if constexpr (__member_begin<_Tp>)
107 return noexcept(__decay_copy(std::declval<_Tp&>().begin()));
109 return noexcept(__decay_copy(
begin(std::declval<_Tp&>())));
113 template<__maybe_borrowed_range _Tp>
114 requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
117 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
119 if constexpr (is_array_v<remove_reference_t<_Tp>>)
121 static_assert(is_lvalue_reference_v<_Tp>);
124 else if constexpr (__member_begin<_Tp>)
131 template<
typename _Tp>
132 concept __member_end =
requires(_Tp& __t)
134 { __decay_copy(__t.end()) } -> sentinel_for<__range_iter_t<_Tp>>;
140 template<
typename _Tp>
141 concept __adl_end = __class_or_enum<remove_reference_t<_Tp>>
142 &&
requires(_Tp& __t)
144 { __decay_copy(
end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
150 template<
typename _Tp>
151 static constexpr bool
154 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
156 else if constexpr (__member_end<_Tp>)
157 return noexcept(__decay_copy(std::declval<_Tp&>().end()));
159 return noexcept(__decay_copy(
end(std::declval<_Tp&>())));
163 template<__maybe_borrowed_range _Tp>
164 requires is_bounded_array_v<remove_reference_t<_Tp>>
165 || __member_end<_Tp> || __adl_end<_Tp>
167 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
169 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
171 static_assert(is_lvalue_reference_v<_Tp>);
172 return __t + extent_v<remove_reference_t<_Tp>>;
174 else if constexpr (__member_end<_Tp>)
181 template<
typename _Tp>
182 concept __member_rbegin =
requires(_Tp& __t)
184 { __decay_copy(__t.rbegin()) } -> input_or_output_iterator;
189 template<
typename _Tp>
190 concept __adl_rbegin = __class_or_enum<remove_reference_t<_Tp>>
191 &&
requires(_Tp& __t)
193 { __decay_copy(
rbegin(__t)) } -> input_or_output_iterator;
196 template<
typename _Tp>
197 concept __reversable =
requires(_Tp& __t)
199 { _Begin{}(__t) } -> bidirectional_iterator;
200 { _End{}(__t) } -> same_as<
decltype(_Begin{}(__t))>;
206 template<
typename _Tp>
207 static constexpr bool
210 if constexpr (__member_rbegin<_Tp>)
211 return noexcept(__decay_copy(std::declval<_Tp&>().
rbegin()));
212 else if constexpr (__adl_rbegin<_Tp>)
213 return noexcept(__decay_copy(
rbegin(std::declval<_Tp&>())));
216 if constexpr (
noexcept(_End{}(std::declval<_Tp&>())))
218 using _It =
decltype(_End{}(std::declval<_Tp&>()));
220 return is_nothrow_copy_constructible_v<_It>;
228 template<__maybe_borrowed_range _Tp>
229 requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
231 operator()[[nodiscard]](_Tp&& __t)
const
232 noexcept(_S_noexcept<_Tp&>())
234 if constexpr (__member_rbegin<_Tp>)
236 else if constexpr (__adl_rbegin<_Tp>)
243 template<
typename _Tp>
244 concept __member_rend =
requires(_Tp& __t)
246 { __decay_copy(__t.rend()) }
247 -> sentinel_for<
decltype(_RBegin{}(std::forward<_Tp>(__t)))>;
250 void rend() =
delete;
252 template<
typename _Tp>
253 concept __adl_rend = __class_or_enum<remove_reference_t<_Tp>>
254 &&
requires(_Tp& __t)
256 { __decay_copy(
rend(__t)) }
257 -> sentinel_for<
decltype(_RBegin{}(std::forward<_Tp>(__t)))>;
263 template<
typename _Tp>
264 static constexpr bool
267 if constexpr (__member_rend<_Tp>)
268 return noexcept(__decay_copy(std::declval<_Tp&>().
rend()));
269 else if constexpr (__adl_rend<_Tp>)
270 return noexcept(__decay_copy(
rend(std::declval<_Tp&>())));
273 if constexpr (
noexcept(_Begin{}(std::declval<_Tp&>())))
275 using _It =
decltype(_Begin{}(std::declval<_Tp&>()));
277 return is_nothrow_copy_constructible_v<_It>;
285 template<__maybe_borrowed_range _Tp>
286 requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
288 operator()[[nodiscard]](_Tp&& __t)
const
289 noexcept(_S_noexcept<_Tp&>())
291 if constexpr (__member_rend<_Tp>)
293 else if constexpr (__adl_rend<_Tp>)
300 template<
typename _Tp>
301 concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
302 &&
requires(_Tp& __t)
304 { __decay_copy(__t.size()) } -> __detail::__is_integer_like;
307 void size() =
delete;
309 template<
typename _Tp>
310 concept __adl_size = __class_or_enum<remove_reference_t<_Tp>>
311 && !disable_sized_range<remove_cvref_t<_Tp>>
312 &&
requires(_Tp& __t)
314 { __decay_copy(
size(__t)) } -> __detail::__is_integer_like;
317 template<
typename _Tp>
318 concept __sentinel_size =
requires(_Tp& __t)
320 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
322 { _Begin{}(__t) } -> forward_iterator;
324 { _End{}(__t) } -> sized_sentinel_for<
decltype(_Begin{}(__t))>;
326 __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
332 template<
typename _Tp>
333 static constexpr bool
336 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
338 else if constexpr (__member_size<_Tp>)
339 return noexcept(__decay_copy(std::declval<_Tp&>().size()));
340 else if constexpr (__adl_size<_Tp>)
341 return noexcept(__decay_copy(
size(std::declval<_Tp&>())));
342 else if constexpr (__sentinel_size<_Tp>)
343 return noexcept(_End{}(std::declval<_Tp&>())
344 - _Begin{}(std::declval<_Tp&>()));
348 template<
typename _Tp>
349 requires is_bounded_array_v<remove_reference_t<_Tp>>
350 || __member_size<_Tp> || __adl_size<_Tp> || __sentinel_size<_Tp>
352 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
354 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
355 return extent_v<remove_reference_t<_Tp>>;
356 else if constexpr (__member_size<_Tp>)
358 else if constexpr (__adl_size<_Tp>)
360 else if constexpr (__sentinel_size<_Tp>)
361 return __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
369 template<
typename _Tp>
370 requires requires (_Tp& __t) { _Size{}(__t); }
372 operator()[[nodiscard]](_Tp&& __t)
const noexcept(
noexcept(_Size{}(__t)))
374 auto __size = _Size{}(__t);
375 using __size_type =
decltype(__size);
377 if constexpr (integral<__size_type>)
380 if constexpr (__int_traits<__size_type>::__digits
381 < __int_traits<ptrdiff_t>::__digits)
382 return static_cast<ptrdiff_t
>(__size);
384 return static_cast<make_signed_t<__size_type>
>(__size);
386#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
388 else if constexpr (__detail::__is_int128<__size_type>)
389 return static_cast<__int128
>(__size);
392 return __detail::__max_diff_type(__size);
396 template<
typename _Tp>
397 concept __member_empty =
requires(_Tp& __t) { bool(__t.empty()); };
399 template<
typename _Tp>
400 concept __size0_empty =
requires(_Tp& __t) { _Size{}(__t) == 0; };
402 template<
typename _Tp>
403 concept __eq_iter_empty =
requires(_Tp& __t)
405 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
407 { _Begin{}(__t) } -> forward_iterator;
409 bool(_Begin{}(__t) == _End{}(__t));
415 template<
typename _Tp>
416 static constexpr bool
419 if constexpr (__member_empty<_Tp>)
420 return noexcept(
bool(std::declval<_Tp&>().
empty()));
421 else if constexpr (__size0_empty<_Tp>)
422 return noexcept(_Size{}(std::declval<_Tp&>()) == 0);
424 return noexcept(bool(_Begin{}(std::declval<_Tp&>())
425 == _End{}(std::declval<_Tp&>())));
429 template<
typename _Tp>
430 requires __member_empty<_Tp> || __size0_empty<_Tp>
431 || __eq_iter_empty<_Tp>
433 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
435 if constexpr (__member_empty<_Tp>)
436 return bool(__t.empty());
437 else if constexpr (__size0_empty<_Tp>)
438 return _Size{}(__t) == 0;
440 return bool(_Begin{}(__t) == _End{}(__t));
444 template<
typename _Tp>
445 concept __pointer_to_object = is_pointer_v<_Tp>
446 && is_object_v<remove_pointer_t<_Tp>>;
448 template<
typename _Tp>
449 concept __member_data =
requires(_Tp& __t)
451 { __decay_copy(__t.data()) } -> __pointer_to_object;
454 template<
typename _Tp>
455 concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
460 template<
typename _Tp>
461 static constexpr bool
464 if constexpr (__member_data<_Tp>)
465 return noexcept(__decay_copy(std::declval<_Tp&>().
data()));
467 return noexcept(_Begin{}(std::declval<_Tp&>()));
471 template<__maybe_borrowed_range _Tp>
472 requires __member_data<_Tp> || __begin_data<_Tp>
474 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp>())
476 if constexpr (__member_data<_Tp>)
485 inline namespace _Cpo
487 inline constexpr ranges::__access::_Begin
begin{};
488 inline constexpr ranges::__access::_End
end{};
489 inline constexpr ranges::__access::_RBegin
rbegin{};
490 inline constexpr ranges::__access::_REnd
rend{};
491 inline constexpr ranges::__access::_Size
size{};
492 inline constexpr ranges::__access::_SSize ssize{};
493 inline constexpr ranges::__access::_Empty
empty{};
494 inline constexpr ranges::__access::_Data
data{};
498 template<
typename _Tp>
499 concept range =
requires(_Tp& __t)
506 template<
typename _Tp>
507 concept borrowed_range
508 = range<_Tp> && __detail::__maybe_borrowed_range<_Tp>;
510 template<
typename _Tp>
511 using iterator_t = std::__detail::__range_iter_t<_Tp>;
513 template<range _Range>
514 using sentinel_t =
decltype(ranges::end(std::declval<_Range&>()));
516#if __cplusplus > 202002L
517 template<range _Range>
518 using const_iterator_t = const_iterator<iterator_t<_Range>>;
520 template<range _Range>
521 using const_sentinel_t = const_sentinel<sentinel_t<_Range>>;
523 template<range _Range>
524 using range_const_reference_t = iter_const_reference_t<iterator_t<_Range>>;
527 template<range _Range>
528 using range_difference_t = iter_difference_t<iterator_t<_Range>>;
530 template<range _Range>
531 using range_value_t = iter_value_t<iterator_t<_Range>>;
533 template<range _Range>
534 using range_reference_t = iter_reference_t<iterator_t<_Range>>;
536 template<range _Range>
537 using range_rvalue_reference_t
538 = iter_rvalue_reference_t<iterator_t<_Range>>;
541 template<
typename _Tp>
542 concept sized_range = range<_Tp>
543 &&
requires(_Tp& __t) { ranges::size(__t); };
545 template<sized_range _Range>
546 using range_size_t =
decltype(ranges::size(std::declval<_Range&>()));
548 template<
typename _Derived>
549 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
550 class view_interface;
554 template<
typename _Tp,
typename _Up>
555 requires (!same_as<_Tp, view_interface<_Up>>)
556 void __is_derived_from_view_interface_fn(
const _Tp&,
557 const view_interface<_Up>&);
561 template<
typename _Tp>
562 concept __is_derived_from_view_interface
563 =
requires (_Tp __t) { __is_derived_from_view_interface_fn(__t, __t); };
567 struct view_base { };
570 template<
typename _Tp>
571 inline constexpr bool enable_view = derived_from<_Tp, view_base>
572 || __detail::__is_derived_from_view_interface<_Tp>;
575 template<
typename _Tp>
577 = range<_Tp> && movable<_Tp> && enable_view<_Tp>;
582 template<
typename _Range,
typename _Tp>
584 = range<_Range> && output_iterator<iterator_t<_Range>, _Tp>;
587 template<
typename _Tp>
588 concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp>>;
591 template<
typename _Tp>
592 concept forward_range
593 = input_range<_Tp> && forward_iterator<iterator_t<_Tp>>;
596 template<
typename _Tp>
597 concept bidirectional_range
598 = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp>>;
601 template<
typename _Tp>
602 concept random_access_range
603 = bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp>>;
606 template<
typename _Tp>
607 concept contiguous_range
608 = random_access_range<_Tp> && contiguous_iterator<iterator_t<_Tp>>
609 &&
requires(_Tp& __t)
611 { ranges::data(__t) } -> same_as<add_pointer_t<range_reference_t<_Tp>>>;
615 template<
typename _Tp>
617 = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
619#if __cplusplus > 202002L
620 template<
typename _Tp>
621 concept constant_range
622 = input_range<_Tp> && std::__detail::__constant_iterator<iterator_t<_Tp>>;
627#if __cplusplus > 202020L
628 template<
typename _Range>
630 __possibly_const_range(_Range& __r)
noexcept
632 if constexpr (constant_range<const _Range> && !constant_range<_Range>)
633 return const_cast<const _Range&
>(__r);
639 template<
typename _To,
typename _Tp>
640 constexpr decltype(
auto)
641 __as_const(_Tp& __t)
noexcept
643 static_assert(std::is_same_v<_To&, _Tp&>);
645 if constexpr (is_lvalue_reference_v<_To>)
646 return const_cast<const _Tp&
>(__t);
648 return static_cast<const _Tp&&
>(__t);
654#if __cplusplus > 202002L
655 template<__maybe_borrowed_range _Tp>
658 operator()(_Tp&& __t)
const
659 noexcept(
noexcept(std::make_const_iterator
660 (ranges::begin(__access::__possibly_const_range(__t)))))
661 requires requires { std::make_const_iterator
662 (ranges::begin(__access::__possibly_const_range(__t))); }
664 auto& __r = __access::__possibly_const_range(__t);
665 return const_iterator_t<decltype(__r)>(ranges::begin(__r));
668 template<
typename _Tp>
671 operator()(_Tp&& __e)
const
672 noexcept(
noexcept(_Begin{}(__access::__as_const<_Tp>(__e))))
673 requires requires { _Begin{}(__access::__as_const<_Tp>(__e)); }
675 return _Begin{}(__access::__as_const<_Tp>(__e));
682#if __cplusplus > 202002L
683 template<__maybe_borrowed_range _Tp>
686 operator()(_Tp&& __t)
const
687 noexcept(
noexcept(std::make_const_sentinel
688 (ranges::end(__access::__possibly_const_range(__t)))))
689 requires requires { std::make_const_sentinel
690 (ranges::end(__access::__possibly_const_range(__t))); }
692 auto& __r = __access::__possibly_const_range(__t);
693 return const_sentinel_t<decltype(__r)>(ranges::end(__r));
696 template<
typename _Tp>
699 operator()(_Tp&& __e)
const
700 noexcept(
noexcept(_End{}(__access::__as_const<_Tp>(__e))))
701 requires requires { _End{}(__access::__as_const<_Tp>(__e)); }
703 return _End{}(__access::__as_const<_Tp>(__e));
710#if __cplusplus > 202002L
711 template<__maybe_borrowed_range _Tp>
714 operator()(_Tp&& __t)
const
715 noexcept(
noexcept(std::make_const_iterator
716 (ranges::rbegin(__access::__possibly_const_range(__t)))))
717 requires requires { std::make_const_iterator
718 (ranges::rbegin(__access::__possibly_const_range(__t))); }
720 auto& __r = __access::__possibly_const_range(__t);
721 return const_iterator<decltype(ranges::rbegin(__r))>(ranges::rbegin(__r));
724 template<
typename _Tp>
727 operator()(_Tp&& __e)
const
728 noexcept(
noexcept(_RBegin{}(__access::__as_const<_Tp>(__e))))
729 requires requires { _RBegin{}(__access::__as_const<_Tp>(__e)); }
731 return _RBegin{}(__access::__as_const<_Tp>(__e));
738#if __cplusplus > 202002L
739 template<__maybe_borrowed_range _Tp>
742 operator()(_Tp&& __t)
const
743 noexcept(
noexcept(std::make_const_sentinel
744 (ranges::rend(__access::__possibly_const_range(__t)))))
745 requires requires { std::make_const_sentinel
746 (ranges::rend(__access::__possibly_const_range(__t))); }
748 auto& __r = __access::__possibly_const_range(__t);
749 return const_sentinel<decltype(ranges::rend(__r))>(ranges::rend(__r));
752 template<
typename _Tp>
755 operator()(_Tp&& __e)
const
756 noexcept(
noexcept(_REnd{}(__access::__as_const<_Tp>(__e))))
757 requires requires { _REnd{}(__access::__as_const<_Tp>(__e)); }
759 return _REnd{}(__access::__as_const<_Tp>(__e));
766#if __cplusplus > 202002L
767 template<__maybe_borrowed_range _Tp>
769 constexpr const auto*
770 operator()(_Tp&& __t)
const
771 noexcept(
noexcept(ranges::data(__access::__possibly_const_range(__t))))
772 requires requires { ranges::data(__access::__possibly_const_range(__t)); }
773 {
return ranges::data(__access::__possibly_const_range(__t)); }
775 template<
typename _Tp>
778 operator()(_Tp&& __e)
const
779 noexcept(
noexcept(_Data{}(__access::__as_const<_Tp>(__e))))
780 requires requires { _Data{}(__access::__as_const<_Tp>(__e)); }
782 return _Data{}(__access::__as_const<_Tp>(__e));
788 inline namespace _Cpo
790 inline constexpr ranges::__access::_CBegin
cbegin{};
791 inline constexpr ranges::__access::_CEnd
cend{};
792 inline constexpr ranges::__access::_CRBegin
crbegin{};
793 inline constexpr ranges::__access::_CREnd
crend{};
794 inline constexpr ranges::__access::_CData cdata{};
799 template<
typename _Tp>
800 inline constexpr bool __is_initializer_list =
false;
802 template<
typename _Tp>
803 inline constexpr bool __is_initializer_list<initializer_list<_Tp>> =
true;
807 template<
typename _Tp>
808 concept viewable_range = range<_Tp>
809 && ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>)
810 || (!view<remove_cvref_t<_Tp>>
811 && (is_lvalue_reference_v<_Tp>
812 || (movable<remove_reference_t<_Tp>>
813 && !__detail::__is_initializer_list<remove_cvref_t<_Tp>>))));
817 struct __advance_fn final
819 template<input_or_output_iterator _It>
821 operator()(_It& __it, iter_difference_t<_It> __n)
const
823 if constexpr (random_access_iterator<_It>)
825 else if constexpr (bidirectional_iterator<_It>)
847 __glibcxx_assert(__n >= 0);
853 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
855 operator()(_It& __it, _Sent __bound)
const
857 if constexpr (assignable_from<_It&, _Sent>)
859 else if constexpr (sized_sentinel_for<_Sent, _It>)
860 (*
this)(__it, __bound - __it);
863 while (__it != __bound)
868 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
869 constexpr iter_difference_t<_It>
870 operator()(_It& __it, iter_difference_t<_It> __n, _Sent __bound)
const
872 if constexpr (sized_sentinel_for<_Sent, _It>)
874 const auto __diff = __bound - __it;
878 else if (__diff > 0 ? __n >= __diff : __n <= __diff)
880 (*this)(__it, __bound);
883 else if (__n != 0) [[likely]]
886 __glibcxx_assert((__n < 0) == (__diff < 0));
894 else if (__it == __bound || __n == 0)
898 iter_difference_t<_It> __m = 0;
904 while (__m != __n && __it != __bound);
907 else if constexpr (bidirectional_iterator<_It> && same_as<_It, _Sent>)
909 iter_difference_t<_It> __m = 0;
915 while (__m != __n && __it != __bound);
921 __glibcxx_assert(__n >= 0);
929 inline constexpr __advance_fn
advance{};
931 struct __distance_fn final
933 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
934 requires (!sized_sentinel_for<_Sent, _It>)
935 constexpr iter_difference_t<_It>
936 operator()[[nodiscard]](_It __first, _Sent __last)
const
938 iter_difference_t<_It> __n = 0;
939 while (__first != __last)
947 template<input_or_output_iterator _It, sized_sentinel_for<_It> _Sent>
949 constexpr iter_difference_t<_It>
950 operator()(
const _It& __first,
const _Sent& __last)
const
952 return __last - __first;
955 template<range _Range>
957 constexpr range_difference_t<_Range>
958 operator()(_Range&& __r)
const
960 if constexpr (sized_range<_Range>)
961 return static_cast<range_difference_t<_Range>
>(ranges::size(__r));
963 return (*
this)(ranges::begin(__r), ranges::end(__r));
969 inline constexpr __distance_fn
distance{};
971 struct __next_fn final
973 template<input_or_output_iterator _It>
976 operator()(_It __x)
const
982 template<input_or_output_iterator _It>
985 operator()(_It __x, iter_difference_t<_It> __n)
const
987 ranges::advance(__x, __n);
991 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
994 operator()(_It __x, _Sent __bound)
const
996 ranges::advance(__x, __bound);
1000 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1003 operator()(_It __x, iter_difference_t<_It> __n, _Sent __bound)
const
1005 ranges::advance(__x, __n, __bound);
1012 inline constexpr __next_fn next{};
1014 struct __prev_fn final
1016 template<b
idirectional_iterator _It>
1019 operator()(_It __x)
const
1025 template<b
idirectional_iterator _It>
1028 operator()(_It __x, iter_difference_t<_It> __n)
const
1030 ranges::advance(__x, -__n);
1034 template<b
idirectional_iterator _It>
1037 operator()(_It __x, iter_difference_t<_It> __n, _It __bound)
const
1039 ranges::advance(__x, -__n, __bound);
1046 inline constexpr __prev_fn prev{};
1051 constexpr dangling() noexcept = default;
1052 template<typename... _Args>
1053 constexpr dangling(_Args&&...) noexcept { }
1056 template<range _Range>
1057 using borrowed_iterator_t = __conditional_t<borrowed_range<_Range>,
1062#if __glibcxx_ranges_to_container
1063 struct from_range_t {
explicit from_range_t() =
default; };
1064 inline constexpr from_range_t from_range{};
1067_GLIBCXX_END_NAMESPACE_VERSION
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
_Tp * end(valarray< _Tp > &__va) noexcept
Return an iterator pointing to one past the last element of the valarray.
_Tp * begin(valarray< _Tp > &__va) noexcept
Return an iterator pointing to the first element of the valarray.
constexpr reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
ISO C++ entities toplevel namespace is std.
constexpr auto crend(const _Container &__cont) -> decltype(std::rend(__cont))
Return a reverse iterator pointing one past the first element of the const container.
constexpr auto rend(_Container &__cont) -> decltype(__cont.rend())
Return a reverse iterator pointing one past the first element of the container.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr auto cend(const _Container &__cont) noexcept(noexcept(std::end(__cont))) -> decltype(std::end(__cont))
Return an iterator pointing to one past the last element of the const container.
constexpr auto empty(const _Container &__cont) noexcept(noexcept(__cont.empty())) -> decltype(__cont.empty())
Return whether a container is empty.
constexpr auto size(const _Container &__cont) noexcept(noexcept(__cont.size())) -> decltype(__cont.size())
Return the size of a container.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
constexpr auto rbegin(_Container &__cont) -> decltype(__cont.rbegin())
Return a reverse iterator pointing to the last element of the container.
constexpr auto crbegin(const _Container &__cont) -> decltype(std::rbegin(__cont))
Return a reverse iterator pointing to the last element of the const container.
constexpr auto data(_Container &__cont) noexcept(noexcept(__cont.data())) -> decltype(__cont.data())
Return the data pointer of a container.
constexpr auto cbegin(const _Container &__cont) noexcept(noexcept(std::begin(__cont))) -> decltype(std::begin(__cont))
Return an iterator pointing to the first element of the const container.
constexpr bitset< _Nb > operator&(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.