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
92 template<
typename _Tp>
93 concept __maybe_borrowed_range
94 = is_lvalue_reference_v<_Tp>
95 || enable_borrowed_range<remove_cvref_t<_Tp>>;
102 using std::ranges::__detail::__maybe_borrowed_range;
103 using std::__detail::__range_iter_t;
108 template<
typename _Tp>
109 static consteval bool
112 if constexpr (is_array_v<remove_reference_t<_Tp>>)
114 else if constexpr (__member_begin<_Tp>)
121 template<__maybe_borrowed_range _Tp>
122 requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
124 [[nodiscard, __gnu__::__always_inline__]]
126 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
128 if constexpr (is_array_v<remove_reference_t<_Tp>>)
130 static_assert(is_lvalue_reference_v<_Tp>);
133 else if constexpr (__member_begin<_Tp>)
140 template<
typename _Tp>
141 concept __member_end =
requires(_Tp& __t)
143 { _GLIBCXX_AUTO_CAST(__t.end()) } -> sentinel_for<__range_iter_t<_Tp>>;
149 template<
typename _Tp>
150 concept __adl_end = __class_or_enum<remove_reference_t<_Tp>>
151 &&
requires(_Tp& __t)
153 { _GLIBCXX_AUTO_CAST(end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
159 template<
typename _Tp>
160 static consteval bool
163 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
165 else if constexpr (__member_end<_Tp>)
172 template<__maybe_borrowed_range _Tp>
173 requires is_bounded_array_v<remove_reference_t<_Tp>>
174 || __member_end<_Tp> || __adl_end<_Tp>
175 [[nodiscard, __gnu__::__always_inline__]]
177 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
179 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
181 static_assert(is_lvalue_reference_v<_Tp>);
182 return __t + extent_v<remove_reference_t<_Tp>>;
184 else if constexpr (__member_end<_Tp>)
191 template<
typename _Tp>
192 concept __member_rbegin =
requires(_Tp& __t)
194 { _GLIBCXX_AUTO_CAST(__t.rbegin()) } -> input_or_output_iterator;
197 void rbegin() =
delete;
199 template<
typename _Tp>
200 concept __adl_rbegin = __class_or_enum<remove_reference_t<_Tp>>
201 &&
requires(_Tp& __t)
203 { _GLIBCXX_AUTO_CAST(rbegin(__t)) } -> input_or_output_iterator;
206 template<
typename _Tp>
207 concept __reversable =
requires(_Tp& __t)
209 { _Begin{}(__t) } -> bidirectional_iterator;
210 { _End{}(__t) } -> same_as<
decltype(_Begin{}(__t))>;
216 template<
typename _Tp>
217 static consteval bool
220 if constexpr (__member_rbegin<_Tp>)
222 else if constexpr (__adl_rbegin<_Tp>)
230 return is_nothrow_copy_constructible_v<_It>;
238 template<__maybe_borrowed_range _Tp>
239 requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
240 [[nodiscard, __gnu__::__always_inline__]]
242 operator()(_Tp&& __t)
const
243 noexcept(_S_noexcept<_Tp&>())
245 if constexpr (__member_rbegin<_Tp>)
247 else if constexpr (__adl_rbegin<_Tp>)
254 template<
typename _Tp>
255 concept __member_rend =
requires(_Tp& __t)
257 { _GLIBCXX_AUTO_CAST(__t.rend()) }
261 void rend() =
delete;
263 template<
typename _Tp>
264 concept __adl_rend = __class_or_enum<remove_reference_t<_Tp>>
265 &&
requires(_Tp& __t)
267 { _GLIBCXX_AUTO_CAST(rend(__t)) }
274 template<
typename _Tp>
275 static consteval bool
278 if constexpr (__member_rend<_Tp>)
280 else if constexpr (__adl_rend<_Tp>)
288 return is_nothrow_copy_constructible_v<_It>;
296 template<__maybe_borrowed_range _Tp>
297 requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
298 [[nodiscard, __gnu__::__always_inline__]]
300 operator()(_Tp&& __t)
const
301 noexcept(_S_noexcept<_Tp&>())
303 if constexpr (__member_rend<_Tp>)
305 else if constexpr (__adl_rend<_Tp>)
312 template<
typename _Tp>
313 concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
314 &&
requires(_Tp& __t)
316 { _GLIBCXX_AUTO_CAST(__t.size()) } -> __detail::__is_integer_like;
319 void size() =
delete;
321 template<
typename _Tp>
322 concept __adl_size = __class_or_enum<remove_reference_t<_Tp>>
323 && !disable_sized_range<remove_cvref_t<_Tp>>
324 &&
requires(_Tp& __t)
326 { _GLIBCXX_AUTO_CAST(size(__t)) } -> __detail::__is_integer_like;
329 template<
typename _Tp>
330 concept __sentinel_size =
requires(_Tp& __t)
332 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
334 { _Begin{}(__t) } -> forward_iterator;
336 { _End{}(__t) } -> sized_sentinel_for<
decltype(_Begin{}(__t))>;
338 __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
344 template<
typename _Tp>
345 static consteval bool
348 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
350 else if constexpr (__member_size<_Tp>)
352 else if constexpr (__adl_size<_Tp>)
354 else if constexpr (__sentinel_size<_Tp>)
360 template<
typename _Tp>
361 requires is_bounded_array_v<remove_reference_t<_Tp>>
362 || __member_size<_Tp> || __adl_size<_Tp> || __sentinel_size<_Tp>
363 [[nodiscard, __gnu__::__always_inline__]]
365 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
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>)
374 return __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
382 template<
typename _Tp>
383 requires requires (_Tp& __t) { _Size{}(__t); }
384 [[nodiscard, __gnu__::__always_inline__]]
386 operator()(_Tp&& __t)
const noexcept(
noexcept(_Size{}(__t)))
388 auto __size = _Size{}(__t);
389 using __size_type =
decltype(__size);
391 if constexpr (integral<__size_type>)
394 if constexpr (__int_traits<__size_type>::__digits
395 < __int_traits<ptrdiff_t>::__digits)
396 return static_cast<ptrdiff_t
>(__size);
401 return __detail::__max_diff_type(__size);
405 template<
typename _Tp>
406 concept __member_empty =
requires(_Tp& __t) { bool(__t.empty()); };
408 template<
typename _Tp>
409 concept __size0_empty =
requires(_Tp& __t) { _Size{}(__t) == 0; };
411 template<
typename _Tp>
412 concept __eq_iter_empty =
requires(_Tp& __t)
414 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
416 { _Begin{}(__t) } -> forward_iterator;
418 bool(_Begin{}(__t) == _End{}(__t));
424 template<
typename _Tp>
425 static consteval bool
428 if constexpr (__member_empty<_Tp>)
430 else if constexpr (__size0_empty<_Tp>)
438 template<
typename _Tp>
439 requires __member_empty<_Tp> || __size0_empty<_Tp>
440 || __eq_iter_empty<_Tp>
441 [[nodiscard, __gnu__::__always_inline__]]
443 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
445 if constexpr (__member_empty<_Tp>)
446 return bool(__t.empty());
447 else if constexpr (__size0_empty<_Tp>)
448 return _Size{}(__t) == 0;
450 return bool(_Begin{}(__t) == _End{}(__t));
454 template<
typename _Tp>
455 concept __pointer_to_object = is_pointer_v<_Tp>
456 && is_object_v<remove_pointer_t<_Tp>>;
458 template<
typename _Tp>
459 concept __member_data =
requires(_Tp& __t)
461 { _GLIBCXX_AUTO_CAST(__t.data()) } -> __pointer_to_object;
464 template<
typename _Tp>
465 concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
470 template<
typename _Tp>
471 static consteval bool
474 if constexpr (__member_data<_Tp>)
481 template<__maybe_borrowed_range _Tp>
482 requires __member_data<_Tp> || __begin_data<_Tp>
483 [[nodiscard, __gnu__::__always_inline__]]
485 operator()(_Tp&& __t)
const noexcept(_S_noexcept<_Tp>())
487 if constexpr (__member_data<_Tp>)
496 inline namespace _Cpo
498 inline constexpr ranges::__access::_Begin begin{};
499 inline constexpr ranges::__access::_End end{};
500 inline constexpr ranges::__access::_RBegin rbegin{};
501 inline constexpr ranges::__access::_REnd rend{};
502 inline constexpr ranges::__access::_Size size{};
503 inline constexpr ranges::__access::_SSize ssize{};
504 inline constexpr ranges::__access::_Empty empty{};
505 inline constexpr ranges::__access::_Data data{};
509 template<
typename _Tp>
517 template<
typename _Tp>
519 =
range<_Tp> && __detail::__maybe_borrowed_range<_Tp>;
521 template<
typename _Tp>
522 using iterator_t = std::__detail::__range_iter_t<_Tp>;
524 template<range _Range>
527#if __glibcxx_ranges_as_const
530 template<range _Range>
531 using range_const_reference_t = iter_const_reference_t<iterator_t<_Range>>;
534 template<range _Range>
535 using range_difference_t = iter_difference_t<iterator_t<_Range>>;
537 template<range _Range>
538 using range_value_t = iter_value_t<iterator_t<_Range>>;
540 template<range _Range>
541 using range_reference_t = iter_reference_t<iterator_t<_Range>>;
543 template<range _Range>
544 using range_rvalue_reference_t
549 template<range _Range>
550 using range_common_reference_t
551 = iter_common_reference_t<iterator_t<_Range>>;
554 template<
typename _Tp>
556 &&
requires(_Tp& __t) { ranges::size(__t); };
558 template<sized_range _Range>
561#if __cplusplus > 202302L
562 template<
typename _Tp>
564 {
static_cast<char(*)[
size_t(ranges::size(__t)
>= 0)]>(
nullptr); };
566 template<__static_sized_range _Range>
567 consteval range_size_t<_Range>
570 auto __conjure = [](_Range& __r)
572 if constexpr (ranges::size(__r) <= size_t(-1))
575 return integral_constant<range_size_t<_Range>, ranges::size(__r)>{};
581 template<
typename _Derived>
582 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
587 template<
typename _Tp,
typename _Up>
588 requires (!same_as<_Tp, view_interface<_Up>>)
589 void __is_derived_from_view_interface_fn(
const _Tp&,
590 const view_interface<_Up>&);
594 template<
typename _Tp>
595 concept __is_derived_from_view_interface
596 =
requires (_Tp __t) { __is_derived_from_view_interface_fn(__t, __t); };
603 template<
typename _Tp>
605 || __detail::__is_derived_from_view_interface<_Tp>;
608 template<
typename _Tp>
615 template<
typename _Range,
typename _Tp>
620 template<
typename _Tp>
624 template<
typename _Tp>
629 template<
typename _Tp>
634 template<
typename _Tp>
639 template<
typename _Tp>
642 &&
requires(_Tp& __t)
648 template<
typename _Tp>
652#if __glibcxx_ranges_as_const
653 template<
typename _Tp>
654 concept constant_range
660#if __glibcxx_ranges_as_const
661 template<input_range _Range>
662 [[__gnu__::__always_inline__]]
664 __possibly_const_range(_Range& __r)
noexcept
669 return const_cast<const _Range&
>(__r);
675 template<
typename _To,
typename _Tp>
676 [[__gnu__::__always_inline__]]
677 constexpr decltype(
auto)
678 __as_const(_Tp& __t)
noexcept
680 static_assert(std::is_same_v<_To&, _Tp&>);
682 if constexpr (is_lvalue_reference_v<_To>)
683 return const_cast<const _Tp&
>(__t);
685 return static_cast<const _Tp&&
>(__t);
691#if __glibcxx_ranges_as_const
692 template<__maybe_borrowed_range _Tp>
695 operator()(_Tp&& __t)
const
696 noexcept(
noexcept(std::make_const_iterator
697 (ranges::begin(__access::__possibly_const_range(__t)))))
698 requires requires { std::make_const_iterator
699 (ranges::begin(__access::__possibly_const_range(__t))); }
701 auto& __r = __access::__possibly_const_range(__t);
702 return const_iterator<decltype(ranges::begin(__r))>(ranges::begin(__r));
705 template<
typename _Tp>
708 operator()(_Tp&& __e)
const
709 noexcept(
noexcept(_Begin{}(__access::__as_const<_Tp>(__e))))
710 requires requires { _Begin{}(__access::__as_const<_Tp>(__e)); }
712 return _Begin{}(__access::__as_const<_Tp>(__e));
719#if __glibcxx_ranges_as_const
720 template<__maybe_borrowed_range _Tp>
723 operator()(_Tp&& __t)
const
724 noexcept(
noexcept(std::make_const_sentinel
725 (ranges::end(__access::__possibly_const_range(__t)))))
726 requires requires { std::make_const_sentinel
727 (ranges::end(__access::__possibly_const_range(__t))); }
729 auto& __r = __access::__possibly_const_range(__t);
730 return const_sentinel<decltype(ranges::end(__r))>(ranges::end(__r));
733 template<
typename _Tp>
736 operator()(_Tp&& __e)
const
737 noexcept(
noexcept(_End{}(__access::__as_const<_Tp>(__e))))
738 requires requires { _End{}(__access::__as_const<_Tp>(__e)); }
740 return _End{}(__access::__as_const<_Tp>(__e));
747#if __glibcxx_ranges_as_const
748 template<__maybe_borrowed_range _Tp>
751 operator()(_Tp&& __t)
const
752 noexcept(
noexcept(std::make_const_iterator
753 (ranges::rbegin(__access::__possibly_const_range(__t)))))
754 requires requires { std::make_const_iterator
755 (ranges::rbegin(__access::__possibly_const_range(__t))); }
757 auto& __r = __access::__possibly_const_range(__t);
758 return const_iterator<decltype(ranges::rbegin(__r))>(ranges::rbegin(__r));
761 template<
typename _Tp>
764 operator()(_Tp&& __e)
const
765 noexcept(
noexcept(_RBegin{}(__access::__as_const<_Tp>(__e))))
766 requires requires { _RBegin{}(__access::__as_const<_Tp>(__e)); }
768 return _RBegin{}(__access::__as_const<_Tp>(__e));
775#if __glibcxx_ranges_as_const
776 template<__maybe_borrowed_range _Tp>
779 operator()(_Tp&& __t)
const
780 noexcept(
noexcept(std::make_const_sentinel
781 (ranges::rend(__access::__possibly_const_range(__t)))))
782 requires requires { std::make_const_sentinel
783 (ranges::rend(__access::__possibly_const_range(__t))); }
785 auto& __r = __access::__possibly_const_range(__t);
786 return const_sentinel<decltype(ranges::rend(__r))>(ranges::rend(__r));
789 template<
typename _Tp>
792 operator()(_Tp&& __e)
const
793 noexcept(
noexcept(_REnd{}(__access::__as_const<_Tp>(__e))))
794 requires requires { _REnd{}(__access::__as_const<_Tp>(__e)); }
796 return _REnd{}(__access::__as_const<_Tp>(__e));
803#if __glibcxx_ranges_as_const
804 template<__maybe_borrowed_range _Tp>
806 constexpr const auto*
807 operator()(_Tp&& __t)
const
808 noexcept(
noexcept(ranges::data(__access::__possibly_const_range(__t))))
809 requires requires { ranges::data(__access::__possibly_const_range(__t)); }
810 {
return ranges::data(__access::__possibly_const_range(__t)); }
812 template<
typename _Tp>
815 operator()(_Tp&& __e)
const
816 noexcept(
noexcept(_Data{}(__access::__as_const<_Tp>(__e))))
817 requires requires { _Data{}(__access::__as_const<_Tp>(__e)); }
819 return _Data{}(__access::__as_const<_Tp>(__e));
825 inline namespace _Cpo
827 inline constexpr ranges::__access::_CBegin
cbegin{};
828 inline constexpr ranges::__access::_CEnd
cend{};
829 inline constexpr ranges::__access::_CRBegin crbegin{};
830 inline constexpr ranges::__access::_CREnd crend{};
831 inline constexpr ranges::__access::_CData cdata{};
834#if __glibcxx_ranges_as_const
837 template<range _Range>
840 template<range _Range>
846 template<
typename _Tp>
847 inline constexpr bool __is_initializer_list =
false;
849 template<
typename _Tp>
850 inline constexpr bool __is_initializer_list<initializer_list<_Tp>> =
true;
854 template<
typename _Tp>
858 && (is_lvalue_reference_v<_Tp>
859 || (movable<remove_reference_t<_Tp>>
860 && !__detail::__is_initializer_list<remove_cvref_t<_Tp>>))));
864 struct __advance_fn final
866 template<input_or_output_iterator _It>
868 operator()(_It& __it, iter_difference_t<_It> __n)
const
870 if constexpr (random_access_iterator<_It>)
872 else if constexpr (bidirectional_iterator<_It>)
894 __glibcxx_assert(__n >= 0);
900 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
902 operator()(_It& __it, _Sent __bound)
const
906 else if constexpr (sized_sentinel_for<_Sent, _It>)
907 (*
this)(__it, __bound - __it);
910 while (__it != __bound)
915 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
916 constexpr iter_difference_t<_It>
917 operator()(_It& __it, iter_difference_t<_It> __n, _Sent __bound)
const
919 if constexpr (sized_sentinel_for<_Sent, _It>)
921 const iter_difference_t<_It> __diff = __bound - __it;
928 else if constexpr (random_access_iterator<_It>)
929 __it += iter_difference_t<_It>(0);
932 else if (__diff > 0 ? __n >= __diff : __n <= __diff)
934 (*this)(__it, __bound);
937 else if (__n != 0) [[likely]]
940 __glibcxx_assert((__n < 0) == (__diff < 0));
948 if constexpr (random_access_iterator<_It>)
949 __it += iter_difference_t<_It>(0);
953 else if (__n == 0 || __it == __bound)
957 iter_difference_t<_It> __m = 0;
963 while (__m != __n && __it != __bound);
968 iter_difference_t<_It> __m = 0;
974 while (__m != __n && __it != __bound);
980 __glibcxx_assert(__n >= 0);
988 inline constexpr __advance_fn advance{};
990 struct __distance_fn final
992 template<
typename _It, sentinel_for<_It> _Sent>
993 requires (!sized_sentinel_for<_Sent, _It>)
994 constexpr iter_difference_t<_It>
995 operator()[[nodiscard]](_It __first, _Sent __last)
const
997 iter_difference_t<_It> __n = 0;
998 while (__first != __last)
1010 template<
typename _It, sized_sentinel_for<decay_t<_It>> _Sent>
1011 [[nodiscard, __gnu__::__always_inline__]]
1012 constexpr iter_difference_t<decay_t<_It>>
1013 operator()(_It&& __first, _Sent __last)
const
1015 if constexpr (!is_array_v<remove_reference_t<_It>>)
1016 return __last - __first;
1021 template<range _Range>
1022 [[nodiscard, __gnu__::__always_inline__]]
1023 constexpr range_difference_t<_Range>
1024 operator()(_Range&& __r)
const
1026 if constexpr (sized_range<_Range>)
1027 return static_cast<range_difference_t<_Range>
>(ranges::size(__r));
1029 return (*
this)(ranges::begin(__r), ranges::end(__r));
1032 void operator&()
const =
delete;
1035 inline constexpr __distance_fn distance{};
1037 struct __next_fn final
1039 template<input_or_output_iterator _It>
1040 [[nodiscard, __gnu__::__always_inline__]]
1042 operator()(_It __x)
const
1048 template<input_or_output_iterator _It>
1049 [[nodiscard, __gnu__::__always_inline__]]
1051 operator()(_It __x, iter_difference_t<_It> __n)
const
1053 ranges::advance(__x, __n);
1057 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1058 [[nodiscard, __gnu__::__always_inline__]]
1060 operator()(_It __x, _Sent __bound)
const
1062 ranges::advance(__x, __bound);
1066 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1067 [[nodiscard, __gnu__::__always_inline__]]
1069 operator()(_It __x, iter_difference_t<_It> __n, _Sent __bound)
const
1071 ranges::advance(__x, __n, __bound);
1075 void operator&()
const =
delete;
1078 inline constexpr __next_fn next{};
1080 struct __prev_fn final
1082 template<b
idirectional_iterator _It>
1083 [[nodiscard, __gnu__::__always_inline__]]
1085 operator()(_It __x)
const
1091 template<b
idirectional_iterator _It>
1092 [[nodiscard, __gnu__::__always_inline__]]
1094 operator()(_It __x, iter_difference_t<_It> __n)
const
1096 ranges::advance(__x, -__n);
1100 template<b
idirectional_iterator _It>
1101 [[nodiscard, __gnu__::__always_inline__]]
1103 operator()(_It __x, iter_difference_t<_It> __n, _It __bound)
const
1105 ranges::advance(__x, -__n, __bound);
1109 void operator&()
const =
delete;
1112 inline constexpr __prev_fn prev{};
1117 constexpr dangling()
noexcept =
default;
1118 template<
typename... _Args>
1119 constexpr dangling(_Args&&...)
noexcept { }
1122 template<range _Range>
1123 using borrowed_iterator_t = __conditional_t<borrowed_range<_Range>,
1128#if __glibcxx_ranges_to_container
1129 struct from_range_t {
explicit from_range_t() =
default; };
1130 inline constexpr from_range_t from_range{};
1133#if __glibcxx_containers_ranges
1135 template<typename _T1, typename _T2>
1140 template<
typename _Rg,
typename _Tp>
1141 concept __container_compatible_range
1142 = ranges::input_range<_Rg>
1143 && convertible_to<ranges::range_reference_t<_Rg>, _Tp>;
1147 template<ranges::input_range _Range>
1148 using __range_key_type
1149 = remove_cvref_t<tuple_element_t<0, ranges::range_value_t<_Range>>>;
1151 template<ranges::input_range _Range>
1152 using __range_mapped_type
1153 = remove_cvref_t<tuple_element_t<1, ranges::range_value_t<_Range>>>;
1156 template<ranges::input_range _Range>
1157 using __range_to_alloc_type
1163_GLIBCXX_END_NAMESPACE_VERSION
1166#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.