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 constexpr __max_size_type
72 __to_unsigned_like(__max_size_type __t)
noexcept
75 constexpr __max_size_type
76 __to_unsigned_like(__max_diff_type __t)
noexcept
77 {
return __max_size_type(__t); }
79 template<
integral _Tp>
81 __to_unsigned_like(_Tp __t)
noexcept
84 template<
typename _Tp>
85 using __make_unsigned_like_t
89 template<
typename _Tp>
90 concept __maybe_borrowed_range
91 = is_lvalue_reference_v<_Tp>
92 || enable_borrowed_range<remove_cvref_t<_Tp>>;
99 using std::ranges::__detail::__maybe_borrowed_range;
100 using std::__detail::__range_iter_t;
105 template<
typename _Tp>
106 static constexpr bool
109 if constexpr (is_array_v<remove_reference_t<_Tp>>)
111 else if constexpr (__member_begin<_Tp>)
118 template<__maybe_borrowed_range _Tp>
119 requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
122 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
124 if constexpr (is_array_v<remove_reference_t<_Tp>>)
126 static_assert(is_lvalue_reference_v<_Tp>);
129 else if constexpr (__member_begin<_Tp>)
136 template<
typename _Tp>
137 concept __member_end =
requires(_Tp& __t)
139 { _GLIBCXX_AUTO_CAST(__t.end()) } -> sentinel_for<__range_iter_t<_Tp>>;
145 template<
typename _Tp>
146 concept __adl_end = __class_or_enum<remove_reference_t<_Tp>>
147 &&
requires(_Tp& __t)
149 { _GLIBCXX_AUTO_CAST(
end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
155 template<
typename _Tp>
156 static constexpr bool
159 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
161 else if constexpr (__member_end<_Tp>)
168 template<__maybe_borrowed_range _Tp>
169 requires is_bounded_array_v<remove_reference_t<_Tp>>
170 || __member_end<_Tp> || __adl_end<_Tp>
172 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
174 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
176 static_assert(is_lvalue_reference_v<_Tp>);
177 return __t + extent_v<remove_reference_t<_Tp>>;
179 else if constexpr (__member_end<_Tp>)
186 template<
typename _Tp>
187 concept __member_rbegin =
requires(_Tp& __t)
189 { _GLIBCXX_AUTO_CAST(__t.rbegin()) } -> input_or_output_iterator;
194 template<
typename _Tp>
195 concept __adl_rbegin = __class_or_enum<remove_reference_t<_Tp>>
196 &&
requires(_Tp& __t)
198 { _GLIBCXX_AUTO_CAST(
rbegin(__t)) } -> input_or_output_iterator;
201 template<
typename _Tp>
202 concept __reversable =
requires(_Tp& __t)
204 { _Begin{}(__t) } -> bidirectional_iterator;
205 { _End{}(__t) } -> same_as<
decltype(_Begin{}(__t))>;
211 template<
typename _Tp>
212 static constexpr bool
215 if constexpr (__member_rbegin<_Tp>)
217 else if constexpr (__adl_rbegin<_Tp>)
225 return is_nothrow_copy_constructible_v<_It>;
233 template<__maybe_borrowed_range _Tp>
234 requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
236 operator()[[nodiscard]](_Tp&& __t)
const
237 noexcept(_S_noexcept<_Tp&>())
239 if constexpr (__member_rbegin<_Tp>)
241 else if constexpr (__adl_rbegin<_Tp>)
248 template<
typename _Tp>
249 concept __member_rend =
requires(_Tp& __t)
251 { _GLIBCXX_AUTO_CAST(__t.rend()) }
255 void rend() =
delete;
257 template<
typename _Tp>
258 concept __adl_rend = __class_or_enum<remove_reference_t<_Tp>>
259 &&
requires(_Tp& __t)
261 { _GLIBCXX_AUTO_CAST(
rend(__t)) }
268 template<
typename _Tp>
269 static constexpr bool
272 if constexpr (__member_rend<_Tp>)
274 else if constexpr (__adl_rend<_Tp>)
282 return is_nothrow_copy_constructible_v<_It>;
290 template<__maybe_borrowed_range _Tp>
291 requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
293 operator()[[nodiscard]](_Tp&& __t)
const
294 noexcept(_S_noexcept<_Tp&>())
296 if constexpr (__member_rend<_Tp>)
298 else if constexpr (__adl_rend<_Tp>)
305 template<
typename _Tp>
306 concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
307 &&
requires(_Tp& __t)
309 { _GLIBCXX_AUTO_CAST(__t.size()) } -> __detail::__is_integer_like;
312 void size() =
delete;
314 template<
typename _Tp>
315 concept __adl_size = __class_or_enum<remove_reference_t<_Tp>>
316 && !disable_sized_range<remove_cvref_t<_Tp>>
317 &&
requires(_Tp& __t)
319 { _GLIBCXX_AUTO_CAST(
size(__t)) } -> __detail::__is_integer_like;
322 template<
typename _Tp>
323 concept __sentinel_size =
requires(_Tp& __t)
325 requires (!is_unbounded_array_v<remove_reference_t<_Tp>>);
327 { _Begin{}(__t) } -> forward_iterator;
329 { _End{}(__t) } -> sized_sentinel_for<
decltype(_Begin{}(__t))>;
331 __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
337 template<
typename _Tp>
338 static constexpr bool
341 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
343 else if constexpr (__member_size<_Tp>)
345 else if constexpr (__adl_size<_Tp>)
347 else if constexpr (__sentinel_size<_Tp>)
353 template<
typename _Tp>
354 requires is_bounded_array_v<remove_reference_t<_Tp>>
355 || __member_size<_Tp> || __adl_size<_Tp> || __sentinel_size<_Tp>
357 operator()[[nodiscard]](_Tp&& __t)
const noexcept(_S_noexcept<_Tp&>())
359 if constexpr (is_bounded_array_v<remove_reference_t<_Tp>>)
360 return extent_v<remove_reference_t<_Tp>>;
361 else if constexpr (__member_size<_Tp>)
363 else if constexpr (__adl_size<_Tp>)
365 else if constexpr (__sentinel_size<_Tp>)
366 return __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
374 template<
typename _Tp>
375 requires requires (_Tp& __t) { _Size{}(__t); }
377 operator()[[nodiscard]](_Tp&& __t)
const noexcept(
noexcept(_Size{}(__t)))
379 auto __size = _Size{}(__t);
380 using __size_type =
decltype(__size);
382 if constexpr (integral<__size_type>)
385 if constexpr (__int_traits<__size_type>::__digits
386 < __int_traits<ptrdiff_t>::__digits)
387 return static_cast<ptrdiff_t
>(__size);
389 return static_cast<make_signed_t<__size_type>
>(__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>)
421 else if constexpr (__size0_empty<_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 { _GLIBCXX_AUTO_CAST(__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>)
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>
516#if __glibcxx_ranges_as_const
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>>;
542 template<range _Range>
543 using range_common_reference_t
544 = iter_common_reference_t<iterator_t<_Range>>;
547 template<
typename _Tp>
548 concept sized_range = range<_Tp>
549 &&
requires(_Tp& __t) { ranges::size(__t); };
551 template<sized_range _Range>
554 template<
typename _Derived>
555 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
560 template<
typename _Tp,
typename _Up>
561 requires (!same_as<_Tp, view_interface<_Up>>)
562 void __is_derived_from_view_interface_fn(
const _Tp&,
563 const view_interface<_Up>&);
567 template<
typename _Tp>
568 concept __is_derived_from_view_interface
569 =
requires (_Tp __t) { __is_derived_from_view_interface_fn(__t, __t); };
573 struct view_base { };
576 template<
typename _Tp>
577 inline constexpr bool enable_view = derived_from<_Tp, view_base>
578 || __detail::__is_derived_from_view_interface<_Tp>;
581 template<
typename _Tp>
583 = range<_Tp> && movable<_Tp> && enable_view<_Tp>;
588 template<
typename _Range,
typename _Tp>
590 = range<_Range> && output_iterator<iterator_t<_Range>, _Tp>;
593 template<
typename _Tp>
594 concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp>>;
597 template<
typename _Tp>
598 concept forward_range
599 = input_range<_Tp> && forward_iterator<iterator_t<_Tp>>;
602 template<
typename _Tp>
603 concept bidirectional_range
604 = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp>>;
607 template<
typename _Tp>
608 concept random_access_range
609 = bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp>>;
612 template<
typename _Tp>
613 concept contiguous_range
614 = random_access_range<_Tp> && contiguous_iterator<iterator_t<_Tp>>
615 &&
requires(_Tp& __t)
617 { ranges::data(__t) } -> same_as<add_pointer_t<range_reference_t<_Tp>>>;
621 template<
typename _Tp>
623 = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
625#if __glibcxx_ranges_as_const
626 template<
typename _Tp>
627 concept constant_range
628 = input_range<_Tp> && std::__detail::__constant_iterator<iterator_t<_Tp>>;
633#if __glibcxx_ranges_as_const
634 template<input_range _Range>
636 __possibly_const_range(_Range& __r)
noexcept
640 if constexpr (input_range<const _Range>)
641 return const_cast<const _Range&
>(__r);
647 template<
typename _To,
typename _Tp>
648 constexpr decltype(
auto)
649 __as_const(_Tp& __t)
noexcept
651 static_assert(std::is_same_v<_To&, _Tp&>);
653 if constexpr (is_lvalue_reference_v<_To>)
654 return const_cast<const _Tp&
>(__t);
656 return static_cast<const _Tp&&
>(__t);
662#if __glibcxx_ranges_as_const
663 template<__maybe_borrowed_range _Tp>
666 operator()(_Tp&& __t)
const
667 noexcept(
noexcept(std::make_const_iterator
668 (ranges::begin(__access::__possibly_const_range(__t)))))
669 requires requires { std::make_const_iterator
670 (ranges::begin(__access::__possibly_const_range(__t))); }
672 auto& __r = __access::__possibly_const_range(__t);
673 return const_iterator_t<decltype(__r)>(ranges::begin(__r));
676 template<
typename _Tp>
679 operator()(_Tp&& __e)
const
680 noexcept(
noexcept(_Begin{}(__access::__as_const<_Tp>(__e))))
681 requires requires { _Begin{}(__access::__as_const<_Tp>(__e)); }
683 return _Begin{}(__access::__as_const<_Tp>(__e));
690#if __glibcxx_ranges_as_const
691 template<__maybe_borrowed_range _Tp>
694 operator()(_Tp&& __t)
const
695 noexcept(
noexcept(std::make_const_sentinel
696 (ranges::end(__access::__possibly_const_range(__t)))))
697 requires requires { std::make_const_sentinel
698 (ranges::end(__access::__possibly_const_range(__t))); }
700 auto& __r = __access::__possibly_const_range(__t);
701 return const_sentinel_t<decltype(__r)>(ranges::end(__r));
704 template<
typename _Tp>
707 operator()(_Tp&& __e)
const
708 noexcept(
noexcept(_End{}(__access::__as_const<_Tp>(__e))))
709 requires requires { _End{}(__access::__as_const<_Tp>(__e)); }
711 return _End{}(__access::__as_const<_Tp>(__e));
718#if __glibcxx_ranges_as_const
719 template<__maybe_borrowed_range _Tp>
722 operator()(_Tp&& __t)
const
723 noexcept(
noexcept(std::make_const_iterator
724 (ranges::rbegin(__access::__possibly_const_range(__t)))))
725 requires requires { std::make_const_iterator
726 (ranges::rbegin(__access::__possibly_const_range(__t))); }
728 auto& __r = __access::__possibly_const_range(__t);
729 return const_iterator<decltype(ranges::rbegin(__r))>(ranges::rbegin(__r));
732 template<
typename _Tp>
735 operator()(_Tp&& __e)
const
736 noexcept(
noexcept(_RBegin{}(__access::__as_const<_Tp>(__e))))
737 requires requires { _RBegin{}(__access::__as_const<_Tp>(__e)); }
739 return _RBegin{}(__access::__as_const<_Tp>(__e));
746#if __glibcxx_ranges_as_const
747 template<__maybe_borrowed_range _Tp>
750 operator()(_Tp&& __t)
const
751 noexcept(
noexcept(std::make_const_sentinel
752 (ranges::rend(__access::__possibly_const_range(__t)))))
753 requires requires { std::make_const_sentinel
754 (ranges::rend(__access::__possibly_const_range(__t))); }
756 auto& __r = __access::__possibly_const_range(__t);
757 return const_sentinel<decltype(ranges::rend(__r))>(ranges::rend(__r));
760 template<
typename _Tp>
763 operator()(_Tp&& __e)
const
764 noexcept(
noexcept(_REnd{}(__access::__as_const<_Tp>(__e))))
765 requires requires { _REnd{}(__access::__as_const<_Tp>(__e)); }
767 return _REnd{}(__access::__as_const<_Tp>(__e));
774#if __glibcxx_ranges_as_const
775 template<__maybe_borrowed_range _Tp>
777 constexpr const auto*
778 operator()(_Tp&& __t)
const
779 noexcept(
noexcept(ranges::data(__access::__possibly_const_range(__t))))
780 requires requires { ranges::data(__access::__possibly_const_range(__t)); }
781 {
return ranges::data(__access::__possibly_const_range(__t)); }
783 template<
typename _Tp>
786 operator()(_Tp&& __e)
const
787 noexcept(
noexcept(_Data{}(__access::__as_const<_Tp>(__e))))
788 requires requires { _Data{}(__access::__as_const<_Tp>(__e)); }
790 return _Data{}(__access::__as_const<_Tp>(__e));
796 inline namespace _Cpo
798 inline constexpr ranges::__access::_CBegin
cbegin{};
799 inline constexpr ranges::__access::_CEnd
cend{};
800 inline constexpr ranges::__access::_CRBegin
crbegin{};
801 inline constexpr ranges::__access::_CREnd
crend{};
802 inline constexpr ranges::__access::_CData cdata{};
807 template<
typename _Tp>
808 inline constexpr bool __is_initializer_list =
false;
810 template<
typename _Tp>
811 inline constexpr bool __is_initializer_list<initializer_list<_Tp>> =
true;
815 template<
typename _Tp>
816 concept viewable_range = range<_Tp>
817 && ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>)
818 || (!view<remove_cvref_t<_Tp>>
819 && (is_lvalue_reference_v<_Tp>
820 || (movable<remove_reference_t<_Tp>>
821 && !__detail::__is_initializer_list<remove_cvref_t<_Tp>>))));
825 struct __advance_fn final
827 template<input_or_output_iterator _It>
829 operator()(_It& __it, iter_difference_t<_It> __n)
const
831 if constexpr (random_access_iterator<_It>)
833 else if constexpr (bidirectional_iterator<_It>)
855 __glibcxx_assert(__n >= 0);
861 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
863 operator()(_It& __it, _Sent __bound)
const
865 if constexpr (assignable_from<_It&, _Sent>)
867 else if constexpr (sized_sentinel_for<_Sent, _It>)
868 (*
this)(__it, __bound - __it);
871 while (__it != __bound)
876 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
877 constexpr iter_difference_t<_It>
878 operator()(_It& __it, iter_difference_t<_It> __n, _Sent __bound)
const
880 if constexpr (sized_sentinel_for<_Sent, _It>)
882 const iter_difference_t<_It> __diff = __bound - __it;
887 if constexpr (assignable_from<_It&, _Sent>)
889 else if constexpr (random_access_iterator<_It>)
893 else if (__diff > 0 ? __n >= __diff : __n <= __diff)
895 (*this)(__it, __bound);
898 else if (__n != 0) [[likely]]
901 __glibcxx_assert((__n < 0) == (__diff < 0));
909 if constexpr (random_access_iterator<_It>)
914 else if (__n == 0 || __it == __bound)
918 iter_difference_t<_It> __m = 0;
924 while (__m != __n && __it != __bound);
927 else if constexpr (bidirectional_iterator<_It> && same_as<_It, _Sent>)
929 iter_difference_t<_It> __m = 0;
935 while (__m != __n && __it != __bound);
941 __glibcxx_assert(__n >= 0);
949 inline constexpr __advance_fn
advance{};
951 struct __distance_fn final
955 template<
typename _It, sentinel_for<_It> _Sent>
956 requires (!sized_sentinel_for<_Sent, _It>)
957 constexpr iter_difference_t<_It>
958 operator()[[nodiscard]](_It __first, _Sent __last)
const
960 iter_difference_t<_It> __n = 0;
961 while (__first != __last)
969 template<
typename _It, sized_sentinel_for<decay_t<_It>> _Sent>
971 constexpr iter_difference_t<decay_t<_It>>
972 operator()(_It&& __first, _Sent __last)
const
973 {
return __last -
static_cast<const decay_t<_It>&
>(__first); }
975 template<range _Range>
977 constexpr range_difference_t<_Range>
978 operator()(_Range&& __r)
const
980 if constexpr (sized_range<_Range>)
981 return static_cast<range_difference_t<_Range>
>(ranges::size(__r));
983 return (*
this)(ranges::begin(__r), ranges::end(__r));
989 inline constexpr __distance_fn
distance{};
991 struct __next_fn final
993 template<input_or_output_iterator _It>
996 operator()(_It __x)
const
1002 template<input_or_output_iterator _It>
1005 operator()(_It __x, iter_difference_t<_It> __n)
const
1007 ranges::advance(__x, __n);
1011 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1014 operator()(_It __x, _Sent __bound)
const
1016 ranges::advance(__x, __bound);
1020 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1023 operator()(_It __x, iter_difference_t<_It> __n, _Sent __bound)
const
1025 ranges::advance(__x, __n, __bound);
1032 inline constexpr __next_fn next{};
1034 struct __prev_fn final
1036 template<b
idirectional_iterator _It>
1039 operator()(_It __x)
const
1045 template<b
idirectional_iterator _It>
1048 operator()(_It __x, iter_difference_t<_It> __n)
const
1050 ranges::advance(__x, -__n);
1054 template<b
idirectional_iterator _It>
1057 operator()(_It __x, iter_difference_t<_It> __n, _It __bound)
const
1059 ranges::advance(__x, -__n, __bound);
1066 inline constexpr __prev_fn prev{};
1071 constexpr dangling() noexcept = default;
1072 template<typename... _Args>
1073 constexpr dangling(_Args&&...) noexcept { }
1076 template<range _Range>
1077 using borrowed_iterator_t = __conditional_t<borrowed_range<_Range>,
1082#if __glibcxx_ranges_to_container
1083 struct from_range_t {
explicit from_range_t() =
default; };
1084 inline constexpr from_range_t from_range{};
1087#if __glibcxx_containers_ranges
1089 template<typename _T1, typename _T2>
1094 template<
typename _Rg,
typename _Tp>
1095 concept __container_compatible_range
1096 = ranges::input_range<_Rg>
1097 && convertible_to<ranges::range_reference_t<_Rg>, _Tp>;
1101 template<ranges::input_range _Range>
1102 using __range_key_type
1103 = remove_cvref_t<tuple_element_t<0, ranges::range_value_t<_Range>>>;
1105 template<ranges::input_range _Range>
1106 using __range_mapped_type
1107 = remove_cvref_t<tuple_element_t<1, ranges::range_value_t<_Range>>>;
1110 template<ranges::input_range _Range>
1111 using __range_to_alloc_type
1117_GLIBCXX_END_NAMESPACE_VERSION
1120#pragma GCC diagnostic pop
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
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.
_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 rbegin(_Container &__cont) noexcept(noexcept(__cont.rbegin())) -> decltype(__cont.rbegin())
Return a reverse iterator pointing to the last 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 crbegin(const _Container &__cont) noexcept(noexcept(std::rbegin(__cont))) -> decltype(std::rbegin(__cont))
Return a reverse iterator pointing to the last element of the const container.
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 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 auto rend(_Container &__cont) noexcept(noexcept(__cont.rend())) -> decltype(__cont.rend())
Return a reverse iterator pointing one past the first element of the container.
constexpr bitset< _Nb > operator&(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
constexpr auto crend(const _Container &__cont) noexcept(noexcept(std::rend(__cont))) -> decltype(std::rend(__cont))
Return a reverse iterator pointing one past the first element of the const container.
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.
Struct holding two objects of arbitrary type.