30#ifndef _GLIBCXX_RANGES_BASE_H
31#define _GLIBCXX_RANGES_BASE_H 1
34#pragma GCC system_header
37#if __cplusplus > 201703L
44#if __glibcxx_containers_ranges
48#pragma GCC diagnostic push
49#pragma GCC diagnostic ignored "-Wpedantic"
51#if __glibcxx_algorithm_default_value_type
52# define _GLIBCXX26_RANGE_ALGO_DEF_VAL_T(_I, _P) = projected_value_t<_I, _P>
54# define _GLIBCXX26_RANGE_ALGO_DEF_VAL_T(_I, _P)
57#ifdef __cpp_lib_concepts
58namespace std _GLIBCXX_VISIBILITY(default)
60_GLIBCXX_BEGIN_NAMESPACE_VERSION
64 inline constexpr bool disable_sized_range =
false;
66 template<
typename _Tp>
67 inline constexpr bool enable_borrowed_range =
false;
71 [[__gnu__::__always_inline__]]
72 constexpr __max_size_type
73 __to_unsigned_like(__max_size_type __t)
noexcept
76 [[__gnu__::__always_inline__]]
77 constexpr __max_size_type
78 __to_unsigned_like(__max_diff_type __t)
noexcept
79 {
return __max_size_type(__t); }
81 template<
integral _Tp>
82 [[__gnu__::__always_inline__]]
84 __to_unsigned_like(_Tp __t)
noexcept
87 template<
typename _Tp>
88 using __make_unsigned_like_t
91 template<
typename _Wp>
92 constexpr auto __to_signed_like(_Wp __w)
noexcept
94 if constexpr (!integral<_Wp>)
95 return iter_difference_t<_Wp>();
96 else if constexpr (
sizeof(iter_difference_t<_Wp>) >
sizeof(_Wp))
97 return iter_difference_t<_Wp>(__w);
98 else if constexpr (
sizeof(ptrdiff_t) >
sizeof(_Wp))
99 return ptrdiff_t(__w);
100 else if constexpr (
sizeof(
long long) >
sizeof(_Wp))
101 return (
long long)(__w);
102#ifdef __SIZEOF_INT128__
103 else if constexpr (__SIZEOF_INT128__ >
sizeof(_Wp))
104 return __int128(__w);
107 return __max_diff_type(__w);
111 template<
typename _Tp>
112 concept __maybe_borrowed_range
113 = is_lvalue_reference_v<_Tp>
114 || enable_borrowed_range<remove_cvref_t<_Tp>>;
121 using std::ranges::__detail::__maybe_borrowed_range;
122 using std::__detail::__range_iter_t;
127 template<
typename _Tp>
128 static consteval bool
131 if constexpr (is_array_v<remove_reference_t<_Tp>>)
133 else if constexpr (__member_begin<_Tp>)
140 template<__maybe_borrowed_range _Tp>
141 requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
143 [[nodiscard, __gnu__::__always_inline__]]
145 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
147 if constexpr (is_array_v<remove_reference_t<_Tp>>)
149 static_assert(is_lvalue_reference_v<_Tp>);
152 else if constexpr (__member_begin<_Tp>)
159 template<
typename _Tp>
160 concept __member_end =
requires(_Tp& __t)
162 { _GLIBCXX_AUTO_CAST(__t.end()) } -> sentinel_for<__range_iter_t<_Tp>>;
168 template<
typename _Tp>
169 concept __adl_end = __class_or_enum<remove_reference_t<_Tp>>
170 &&
requires(_Tp& __t)
172 { _GLIBCXX_AUTO_CAST(end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
178 template<
typename _Tp>
179 static consteval bool
182 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
184 else if constexpr (__member_end<_Tp>)
191 template<__maybe_borrowed_range _Tp>
192 requires is_bounded_array_v<remove_reference_t<_Tp>>
193 || __member_end<_Tp> || __adl_end<_Tp>
194 [[nodiscard, __gnu__::__always_inline__]]
196 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
198 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
200 static_assert(is_lvalue_reference_v<_Tp>);
201 return __t + extent_v<remove_reference_t<_Tp>>;
203 else if constexpr (__member_end<_Tp>)
210 template<
typename _Tp>
211 concept __member_rbegin =
requires(_Tp& __t)
213 { _GLIBCXX_AUTO_CAST(__t.rbegin()) } -> input_or_output_iterator;
216 void rbegin() =
delete;
218 template<
typename _Tp>
219 concept __adl_rbegin = __class_or_enum<remove_reference_t<_Tp>>
220 &&
requires(_Tp& __t)
222 { _GLIBCXX_AUTO_CAST(rbegin(__t)) } -> input_or_output_iterator;
225 template<
typename _Tp>
226 concept __reversable =
requires(_Tp& __t)
228 { _Begin{}(__t) } -> bidirectional_iterator;
229 { _End{}(__t) } -> same_as<
decltype(_Begin{}(__t))>;
235 template<
typename _Tp>
236 static consteval bool
239 if constexpr (__member_rbegin<_Tp>)
241 else if constexpr (__adl_rbegin<_Tp>)
249 return is_nothrow_copy_constructible_v<_It>;
257 template<__maybe_borrowed_range _Tp>
258 requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
259 [[nodiscard, __gnu__::__always_inline__]]
261 operator()(_Tp&& __t)
const
262 noexcept(_S_noexcept<_Tp&>())
264 if constexpr (__member_rbegin<_Tp>)
266 else if constexpr (__adl_rbegin<_Tp>)
273 template<
typename _Tp>
274 concept __member_rend =
requires(_Tp& __t)
276 { _GLIBCXX_AUTO_CAST(__t.rend()) }
280 void rend() =
delete;
282 template<
typename _Tp>
283 concept __adl_rend = __class_or_enum<remove_reference_t<_Tp>>
284 &&
requires(_Tp& __t)
286 { _GLIBCXX_AUTO_CAST(rend(__t)) }
293 template<
typename _Tp>
294 static consteval bool
297 if constexpr (__member_rend<_Tp>)
299 else if constexpr (__adl_rend<_Tp>)
307 return is_nothrow_copy_constructible_v<_It>;
315 template<__maybe_borrowed_range _Tp>
316 requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
317 [[nodiscard, __gnu__::__always_inline__]]
319 operator()(_Tp&& __t)
const
320 noexcept(_S_noexcept<_Tp&>())
322 if constexpr (__member_rend<_Tp>)
324 else if constexpr (__adl_rend<_Tp>)
331 template<
typename _Tp>
332 concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
333 &&
requires(_Tp& __t)
335 { _GLIBCXX_AUTO_CAST(__t.size()) } -> __detail::__is_integer_like;
338 void size() =
delete;
340 template<
typename _Tp>
341 concept __adl_size = __class_or_enum<remove_reference_t<_Tp>>
342 && !disable_sized_range<remove_cvref_t<_Tp>>
343 &&
requires(_Tp& __t)
345 { _GLIBCXX_AUTO_CAST(size(__t)) } -> __detail::__is_integer_like;
348 template<
typename _Tp>
349 concept __sentinel_size =
requires(_Tp& __t)
351 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
353 { _Begin{}(__t) } -> forward_iterator;
355 { _End{}(__t) } -> sized_sentinel_for<
decltype(_Begin{}(__t))>;
357 __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
363 template<
typename _Tp>
364 static consteval bool
367 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
369 else if constexpr (__member_size<_Tp>)
371 else if constexpr (__adl_size<_Tp>)
373 else if constexpr (__sentinel_size<_Tp>)
379 template<
typename _Tp>
380 requires is_bounded_array_v<remove_reference_t<_Tp>>
381 || __member_size<_Tp> || __adl_size<_Tp> || __sentinel_size<_Tp>
382 [[nodiscard, __gnu__::__always_inline__]]
384 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
386 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
388 else if constexpr (__member_size<_Tp>)
390 else if constexpr (__adl_size<_Tp>)
392 else if constexpr (__sentinel_size<_Tp>)
393 return __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
401 template<
typename _Tp>
402 requires requires (_Tp& __t) { _Size{}(__t); }
403 [[nodiscard, __gnu__::__always_inline__]]
405 operator()(_Tp&& __t)
const noexcept(
noexcept(_Size{}(__t)))
407 auto __size = _Size{}(__t);
408 using __size_type =
decltype(__size);
410 if constexpr (integral<__size_type>)
413 if constexpr (__int_traits<__size_type>::__digits
414 < __int_traits<ptrdiff_t>::__digits)
415 return static_cast<ptrdiff_t
>(__size);
420 return __detail::__max_diff_type(__size);
424 template<
typename _Tp>
425 concept __member_empty =
requires(_Tp& __t) { bool(__t.empty()); };
427 template<
typename _Tp>
428 concept __size0_empty =
requires(_Tp& __t) { _Size{}(__t) == 0; };
430 template<
typename _Tp>
431 concept __eq_iter_empty =
requires(_Tp& __t)
433 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
435 { _Begin{}(__t) } -> forward_iterator;
437 bool(_Begin{}(__t) == _End{}(__t));
443 template<
typename _Tp>
444 static consteval bool
447 if constexpr (__member_empty<_Tp>)
449 else if constexpr (__size0_empty<_Tp>)
457 template<
typename _Tp>
458 requires __member_empty<_Tp> || __size0_empty<_Tp>
459 || __eq_iter_empty<_Tp>
460 [[nodiscard, __gnu__::__always_inline__]]
462 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
464 if constexpr (__member_empty<_Tp>)
465 return bool(__t.empty());
466 else if constexpr (__size0_empty<_Tp>)
467 return _Size{}(__t) == 0;
469 return bool(_Begin{}(__t) == _End{}(__t));
473 template<
typename _Tp>
474 concept __pointer_to_object = is_pointer_v<_Tp>
475 && is_object_v<remove_pointer_t<_Tp>>;
477 template<
typename _Tp>
478 concept __member_data =
requires(_Tp& __t)
480 { _GLIBCXX_AUTO_CAST(__t.data()) } -> __pointer_to_object;
483 template<
typename _Tp>
484 concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
489 template<
typename _Tp>
490 static consteval bool
493 if constexpr (__member_data<_Tp>)
500 template<__maybe_borrowed_range _Tp>
501 requires __member_data<_Tp> || __begin_data<_Tp>
502 [[nodiscard, __gnu__::__always_inline__]]
504 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp>())
506 if constexpr (__member_data<_Tp>)
515 inline namespace _Cpo
517 inline constexpr ranges::__access::_Begin begin{};
518 inline constexpr ranges::__access::_End end{};
519 inline constexpr ranges::__access::_RBegin rbegin{};
520 inline constexpr ranges::__access::_REnd rend{};
521 inline constexpr ranges::__access::_Size size{};
522 inline constexpr ranges::__access::_SSize ssize{};
523 inline constexpr ranges::__access::_Empty empty{};
524 inline constexpr ranges::__access::_Data data{};
528 template<
typename _Tp>
536 template<
typename _Tp>
538 =
range<_Tp> && __detail::__maybe_borrowed_range<_Tp>;
540 template<
typename _Tp>
541 using iterator_t = std::__detail::__range_iter_t<_Tp>;
543 template<range _Range>
546#if __glibcxx_ranges_as_const
549 template<range _Range>
550 using range_const_reference_t = iter_const_reference_t<iterator_t<_Range>>;
553 template<range _Range>
554 using range_difference_t = iter_difference_t<iterator_t<_Range>>;
556 template<range _Range>
557 using range_value_t = iter_value_t<iterator_t<_Range>>;
559 template<range _Range>
560 using range_reference_t = iter_reference_t<iterator_t<_Range>>;
562 template<range _Range>
563 using range_rvalue_reference_t
568 template<range _Range>
569 using range_common_reference_t
570 = iter_common_reference_t<iterator_t<_Range>>;
573 template<
typename _Tp>
575 &&
requires(_Tp& __t) { ranges::size(__t); };
577 template<sized_range _Range>
580#if __cplusplus > 202302L
581 template<
typename _Tp>
583 {
static_cast<char(*)[
size_t(ranges::size(__t)
>= 0)]>(
nullptr); };
585 template<__static_sized_range _Range>
586 consteval range_size_t<_Range>
589 auto __conjure = [](_Range& __r)
591 if constexpr (ranges::size(__r) <= size_t(-1))
594 return integral_constant<range_size_t<_Range>, ranges::size(__r)>{};
600 template<
typename _Derived>
601 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
606 template<
typename _Tp,
typename _Up>
607 requires (!same_as<_Tp, view_interface<_Up>>)
608 void __is_derived_from_view_interface_fn(
const _Tp&,
609 const view_interface<_Up>&);
613 template<
typename _Tp>
614 concept __is_derived_from_view_interface
615 =
requires (_Tp __t) { __is_derived_from_view_interface_fn(__t, __t); };
622 template<
typename _Tp>
624 || __detail::__is_derived_from_view_interface<_Tp>;
627 template<
typename _Tp>
634 template<
typename _Range,
typename _Tp>
639 template<
typename _Tp>
643 template<
typename _Tp>
648 template<
typename _Tp>
653 template<
typename _Tp>
658 template<
typename _Tp>
661 &&
requires(_Tp& __t)
667 template<
typename _Tp>
671#if __glibcxx_ranges_as_const
672 template<
typename _Tp>
673 concept constant_range
679#if __glibcxx_ranges_as_const
680 template<input_range _Range>
681 [[__gnu__::__always_inline__]]
683 __possibly_const_range(_Range& __r)
noexcept
688 return const_cast<const _Range&
>(__r);
694 template<
typename _To,
typename _Tp>
695 [[__gnu__::__always_inline__]]
696 constexpr decltype(
auto)
697 __as_const(_Tp& __t)
noexcept
699 static_assert(std::is_same_v<_To&, _Tp&>);
701 if constexpr (is_lvalue_reference_v<_To>)
702 return const_cast<const _Tp&
>(__t);
704 return static_cast<const _Tp&&
>(__t);
710#if __glibcxx_ranges_as_const
711 template<__maybe_borrowed_range _Tp>
714 operator()(_Tp&& __t)
const
715 noexcept(
noexcept(std::make_const_iterator
716 (ranges::begin(__access::__possibly_const_range(__t)))))
717 requires requires { std::make_const_iterator
718 (ranges::begin(__access::__possibly_const_range(__t))); }
720 auto& __r = __access::__possibly_const_range(__t);
721 return const_iterator<decltype(ranges::begin(__r))>(ranges::begin(__r));
724 template<
typename _Tp>
727 operator()(_Tp&& __e)
const
728 noexcept(
noexcept(_Begin{}(__access::__as_const<_Tp>(__e))))
729 requires requires { _Begin{}(__access::__as_const<_Tp>(__e)); }
731 return _Begin{}(__access::__as_const<_Tp>(__e));
738#if __glibcxx_ranges_as_const
739 template<__maybe_borrowed_range _Tp>
742 operator()(_Tp&& __t)
const
743 noexcept(
noexcept(std::make_const_sentinel
744 (ranges::end(__access::__possibly_const_range(__t)))))
745 requires requires { std::make_const_sentinel
746 (ranges::end(__access::__possibly_const_range(__t))); }
748 auto& __r = __access::__possibly_const_range(__t);
749 return const_sentinel<decltype(ranges::end(__r))>(ranges::end(__r));
752 template<
typename _Tp>
755 operator()(_Tp&& __e)
const
756 noexcept(
noexcept(_End{}(__access::__as_const<_Tp>(__e))))
757 requires requires { _End{}(__access::__as_const<_Tp>(__e)); }
759 return _End{}(__access::__as_const<_Tp>(__e));
766#if __glibcxx_ranges_as_const
767 template<__maybe_borrowed_range _Tp>
770 operator()(_Tp&& __t)
const
771 noexcept(
noexcept(std::make_const_iterator
772 (ranges::rbegin(__access::__possibly_const_range(__t)))))
773 requires requires { std::make_const_iterator
774 (ranges::rbegin(__access::__possibly_const_range(__t))); }
776 auto& __r = __access::__possibly_const_range(__t);
777 return const_iterator<decltype(ranges::rbegin(__r))>(ranges::rbegin(__r));
780 template<
typename _Tp>
783 operator()(_Tp&& __e)
const
784 noexcept(
noexcept(_RBegin{}(__access::__as_const<_Tp>(__e))))
785 requires requires { _RBegin{}(__access::__as_const<_Tp>(__e)); }
787 return _RBegin{}(__access::__as_const<_Tp>(__e));
794#if __glibcxx_ranges_as_const
795 template<__maybe_borrowed_range _Tp>
798 operator()(_Tp&& __t)
const
799 noexcept(
noexcept(std::make_const_sentinel
800 (ranges::rend(__access::__possibly_const_range(__t)))))
801 requires requires { std::make_const_sentinel
802 (ranges::rend(__access::__possibly_const_range(__t))); }
804 auto& __r = __access::__possibly_const_range(__t);
805 return const_sentinel<decltype(ranges::rend(__r))>(ranges::rend(__r));
808 template<
typename _Tp>
811 operator()(_Tp&& __e)
const
812 noexcept(
noexcept(_REnd{}(__access::__as_const<_Tp>(__e))))
813 requires requires { _REnd{}(__access::__as_const<_Tp>(__e)); }
815 return _REnd{}(__access::__as_const<_Tp>(__e));
822#if __glibcxx_ranges_as_const
823 template<__maybe_borrowed_range _Tp>
825 constexpr const auto*
826 operator()(_Tp&& __t)
const
827 noexcept(
noexcept(ranges::data(__access::__possibly_const_range(__t))))
828 requires requires { ranges::data(__access::__possibly_const_range(__t)); }
829 {
return ranges::data(__access::__possibly_const_range(__t)); }
831 template<
typename _Tp>
834 operator()(_Tp&& __e)
const
835 noexcept(
noexcept(_Data{}(__access::__as_const<_Tp>(__e))))
836 requires requires { _Data{}(__access::__as_const<_Tp>(__e)); }
838 return _Data{}(__access::__as_const<_Tp>(__e));
844 inline namespace _Cpo
846 inline constexpr ranges::__access::_CBegin
cbegin{};
847 inline constexpr ranges::__access::_CEnd
cend{};
848 inline constexpr ranges::__access::_CRBegin crbegin{};
849 inline constexpr ranges::__access::_CREnd crend{};
850 inline constexpr ranges::__access::_CData cdata{};
853#if __glibcxx_ranges_as_const
856 template<range _Range>
859 template<range _Range>
865 template<
typename _Tp>
866 inline constexpr bool __is_initializer_list =
false;
868 template<
typename _Tp>
869 inline constexpr bool __is_initializer_list<initializer_list<_Tp>> =
true;
873 template<
typename _Tp>
877 && (is_lvalue_reference_v<_Tp>
878 || (movable<remove_reference_t<_Tp>>
879 && !__detail::__is_initializer_list<remove_cvref_t<_Tp>>))));
883 struct __advance_fn final
885 template<input_or_output_iterator _It>
887 operator()(_It& __it, iter_difference_t<_It> __n)
const
889 if constexpr (random_access_iterator<_It>)
891 else if constexpr (bidirectional_iterator<_It>)
913 __glibcxx_assert(__n >= 0);
919 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
921 operator()(_It& __it, _Sent __bound)
const
925 else if constexpr (sized_sentinel_for<_Sent, _It>)
926 (*
this)(__it, __bound - __it);
929 while (__it != __bound)
934 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
935 constexpr iter_difference_t<_It>
936 operator()(_It& __it, iter_difference_t<_It> __n, _Sent __bound)
const
938 if constexpr (sized_sentinel_for<_Sent, _It>)
940 const iter_difference_t<_It> __diff = __bound - __it;
947 else if constexpr (random_access_iterator<_It>)
948 __it += iter_difference_t<_It>(0);
951 else if (__diff > 0 ? __n >= __diff : __n <= __diff)
953 (*this)(__it, __bound);
956 else if (__n != 0) [[likely]]
959 __glibcxx_assert((__n < 0) == (__diff < 0));
967 if constexpr (random_access_iterator<_It>)
968 __it += iter_difference_t<_It>(0);
972 else if (__n == 0 || __it == __bound)
976 iter_difference_t<_It> __m = 0;
982 while (__m != __n && __it != __bound);
987 iter_difference_t<_It> __m = 0;
993 while (__m != __n && __it != __bound);
999 __glibcxx_assert(__n >= 0);
1007 inline constexpr __advance_fn advance{};
1009 struct __distance_fn final
1011 template<
typename _It, sentinel_for<_It> _Sent>
1012 requires (!sized_sentinel_for<_Sent, _It>)
1013 constexpr iter_difference_t<_It>
1014 operator()[[nodiscard]](_It __first, _Sent __last)
const
1018 iter_difference_t<_It> __n = 0;
1019 auto __func = [
this, &__n](
auto __sfirst,
auto __slast) {
1020 __n += iter_difference_t<_It>(this->
operator()(__sfirst, __slast));
1023 std::__for_each_segment(__first, __last, __func);
1027 iter_difference_t<_It> __n = 0;
1028 while (__first != __last)
1040 template<
typename _It, sized_sentinel_for<decay_t<_It>> _Sent>
1041 [[nodiscard, __gnu__::__always_inline__]]
1042 constexpr iter_difference_t<decay_t<_It>>
1043 operator()(_It&& __first, _Sent __last)
const
1045 if constexpr (!is_array_v<remove_reference_t<_It>>)
1046 return __last - __first;
1051 template<range _Range>
1052 [[nodiscard, __gnu__::__always_inline__]]
1053 constexpr range_difference_t<_Range>
1054 operator()(_Range&& __r)
const
1056 if constexpr (sized_range<_Range>)
1057 return static_cast<range_difference_t<_Range>
>(ranges::size(__r));
1059 return (*
this)(ranges::begin(__r), ranges::end(__r));
1062 void operator&()
const =
delete;
1065 inline constexpr __distance_fn distance{};
1067 struct __next_fn final
1069 template<input_or_output_iterator _It>
1070 [[nodiscard, __gnu__::__always_inline__]]
1072 operator()(_It __x)
const
1078 template<input_or_output_iterator _It>
1079 [[nodiscard, __gnu__::__always_inline__]]
1081 operator()(_It __x, iter_difference_t<_It> __n)
const
1083 ranges::advance(__x, __n);
1087 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1088 [[nodiscard, __gnu__::__always_inline__]]
1090 operator()(_It __x, _Sent __bound)
const
1092 ranges::advance(__x, __bound);
1096 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1097 [[nodiscard, __gnu__::__always_inline__]]
1099 operator()(_It __x, iter_difference_t<_It> __n, _Sent __bound)
const
1101 ranges::advance(__x, __n, __bound);
1105 void operator&()
const =
delete;
1108 inline constexpr __next_fn next{};
1110 struct __prev_fn final
1112 template<b
idirectional_iterator _It>
1113 [[nodiscard, __gnu__::__always_inline__]]
1115 operator()(_It __x)
const
1121 template<b
idirectional_iterator _It>
1122 [[nodiscard, __gnu__::__always_inline__]]
1124 operator()(_It __x, iter_difference_t<_It> __n)
const
1126 ranges::advance(__x, -__n);
1130 template<b
idirectional_iterator _It>
1131 [[nodiscard, __gnu__::__always_inline__]]
1133 operator()(_It __x, iter_difference_t<_It> __n, _It __bound)
const
1135 ranges::advance(__x, -__n, __bound);
1139 void operator&()
const =
delete;
1142 inline constexpr __prev_fn prev{};
1147 constexpr dangling()
noexcept =
default;
1148 template<
typename... _Args>
1149 constexpr dangling(_Args&&...)
noexcept { }
1152 template<range _Range>
1153 using borrowed_iterator_t = __conditional_t<borrowed_range<_Range>,
1158#if __glibcxx_ranges_to_container
1159 struct from_range_t {
explicit from_range_t() =
default; };
1160 inline constexpr from_range_t from_range{};
1163#if __glibcxx_containers_ranges
1165 template<typename _T1, typename _T2>
1170 template<
typename _Rg,
typename _Tp>
1171 concept __container_compatible_range
1172 = ranges::input_range<_Rg>
1173 && convertible_to<ranges::range_reference_t<_Rg>, _Tp>;
1177 template<ranges::input_range _Range>
1178 using __range_key_type
1179 = remove_cvref_t<tuple_element_t<0, ranges::range_value_t<_Range>>>;
1181 template<ranges::input_range _Range>
1182 using __range_mapped_type
1183 = remove_cvref_t<tuple_element_t<1, ranges::range_value_t<_Range>>>;
1186 template<ranges::input_range _Range>
1187 using __range_to_alloc_type
1193_GLIBCXX_END_NAMESPACE_VERSION
1196#pragma GCC diagnostic pop
constexpr bool enable_view
[range.view] The ranges::enable_view boolean.
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename make_signed< _Tp >::type make_signed_t
Alias template for make_signed.
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
typename decay< _Tp >::type decay_t
Alias template for decay.
pair(_T1, _T2) -> pair< _T1, _T2 >
Two pairs are equal iff their members are equal.
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 && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
ISO C++ entities toplevel namespace is std.
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.
ranges::__imove::_IterMove::__type< _Tp & > iter_rvalue_reference_t
The result type of ranges::iter_move(std::declval<_Tp&>()).
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.
Implementation details not part of the namespace std interface.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.
The ranges::view_interface class template.
[range.view] The ranges::view_base type.
Type returned by algorithms instead of a dangling iterator or subrange.
Struct holding two objects (or references) of arbitrary type.
[concept.same], concept same_as
[concept.derived], concept derived_from
[concept.assignable], concept assignable_from
[concept.constructible], concept constructible_from
[range.range] The range concept.
[range.range] The borrowed_range concept.
[range.sized] The sized_range concept.
[range.view] The ranges::view concept.
A range for which ranges::begin returns an output iterator.
A range for which ranges::begin returns an input iterator.
A range for which ranges::begin returns a forward iterator.
A range for which ranges::begin returns a bidirectional iterator.
A range for which ranges::begin returns a random access iterator.
A range for which ranges::begin returns a contiguous iterator.
A range for which ranges::begin and ranges::end return the same type.
A range which can be safely converted to a view.