30#ifndef _GLIBCXX_RANGES
31#define _GLIBCXX_RANGES 1
33#if __cplusplus > 201703L
36#pragma GCC system_header
50#if __cplusplus > 202002L
54#include <bits/binders.h>
58#define __glibcxx_want_algorithm_default_value_type
59#define __glibcxx_want_ranges
60#define __glibcxx_want_ranges_as_const
61#define __glibcxx_want_ranges_as_rvalue
62#define __glibcxx_want_ranges_cache_latest
63#define __glibcxx_want_ranges_cartesian_product
64#define __glibcxx_want_ranges_concat
65#define __glibcxx_want_ranges_chunk
66#define __glibcxx_want_ranges_chunk_by
67#define __glibcxx_want_ranges_enumerate
68#define __glibcxx_want_ranges_indices
69#define __glibcxx_want_ranges_join_with
70#define __glibcxx_want_ranges_repeat
71#define __glibcxx_want_ranges_slide
72#define __glibcxx_want_ranges_stride
73#define __glibcxx_want_ranges_to_container
74#define __glibcxx_want_ranges_to_input
75#define __glibcxx_want_ranges_zip
78#ifdef __glibcxx_generator
79# include <bits/elements_of.h>
88namespace std _GLIBCXX_VISIBILITY(default)
90_GLIBCXX_BEGIN_NAMESPACE_VERSION
105 template<
typename _Tp>
requires is_object_v<_Tp>
110 static constexpr _Tp*
begin() noexcept {
return nullptr; }
111 static constexpr _Tp*
end() noexcept {
return nullptr; }
112 static constexpr _Tp*
data() noexcept {
return nullptr; }
113 static constexpr size_t size() noexcept {
return 0; }
114 static constexpr bool empty() noexcept {
return true; }
117 template<
typename _Tp>
118 inline constexpr bool enable_borrowed_range<empty_view<_Tp>> =
true;
122#if __cpp_lib_ranges >= 202207L
124 template<
typename _Tp>
125 concept __boxable = move_constructible<_Tp> && is_object_v<_Tp>;
127 template<
typename _Tp>
128 concept __boxable = copy_constructible<_Tp> && is_object_v<_Tp>;
131 template<__boxable _Tp>
132 struct __box : std::optional<_Tp>
134 using std::optional<_Tp>::optional;
138 noexcept(is_nothrow_default_constructible_v<_Tp>)
139 requires default_initializable<_Tp>
140 : std::optional<_Tp>{std::in_place}
143 __box(
const __box&) =
default;
144 __box(__box&&) =
default;
146 using std::optional<_Tp>::operator=;
152 operator=(
const __box& __that)
153 noexcept(is_nothrow_copy_constructible_v<_Tp>)
154 requires (!copyable<_Tp>) && copy_constructible<_Tp>
159 this->emplace(*__that);
167 operator=(__box&& __that)
168 noexcept(is_nothrow_move_constructible_v<_Tp>)
169 requires (!movable<_Tp>)
182 template<
typename _Tp>
183 concept __boxable_copyable
184 = copy_constructible<_Tp>
185 && (copyable<_Tp> || (is_nothrow_move_constructible_v<_Tp>
186 && is_nothrow_copy_constructible_v<_Tp>));
187 template<
typename _Tp>
188 concept __boxable_movable
189 = (!copy_constructible<_Tp>)
190 && (movable<_Tp> || is_nothrow_move_constructible_v<_Tp>);
196 template<__boxable _Tp>
197 requires __boxable_copyable<_Tp> || __boxable_movable<_Tp>
201 [[no_unique_address]] _Tp _M_value = _Tp();
204 __box()
requires default_initializable<_Tp> = default;
207 __box(const _Tp& __t)
208 noexcept(is_nothrow_copy_constructible_v<_Tp>)
209 requires copy_constructible<_Tp>
215 noexcept(is_nothrow_move_constructible_v<_Tp>)
216 : _M_value(std::
move(__t))
219 template<
typename... _Args>
220 requires constructible_from<_Tp, _Args...>
222 __box(in_place_t, _Args&&... __args)
223 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
224 : _M_value(std::
forward<_Args>(__args)...)
227 __box(
const __box&) =
default;
228 __box(__box&&) =
default;
229 __box& operator=(
const __box&)
requires copyable<_Tp> =
default;
230 __box& operator=(__box&&)
requires movable<_Tp> = default;
235 operator=(const __box& __that) noexcept
236 requires (!copyable<_Tp>) && copy_constructible<_Tp>
238 static_assert(is_nothrow_copy_constructible_v<_Tp>);
249 operator=(__box&& __that)
noexcept
250 requires (!movable<_Tp>)
252 static_assert(is_nothrow_move_constructible_v<_Tp>);
262 has_value() const noexcept
277 constexpr const _Tp&&
282 operator->() noexcept
286 operator->() const noexcept
292#if __cpp_lib_ranges >= 202207L
293 template<move_constructible _Tp>
295 template<copy_constructible _Tp>
297 requires is_object_v<_Tp>
301 single_view()
requires default_initializable<_Tp> = default;
304 single_view(const _Tp& __t)
305 noexcept(is_nothrow_copy_constructible_v<_Tp>)
306 requires copy_constructible<_Tp>
311 single_view(_Tp&& __t)
312 noexcept(is_nothrow_move_constructible_v<_Tp>)
313 : _M_value(std::
move(__t))
318 template<
typename... _Args>
319 requires constructible_from<_Tp, _Args...>
321 single_view(in_place_t, _Args&&... __args)
322 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
323 : _M_value{in_place, std::
forward<_Args>(__args)...}
331 begin() const noexcept
336 {
return data() + 1; }
340 {
return data() + 1; }
344 static constexpr bool
348 static constexpr size_t
354 {
return _M_value.operator->(); }
357 data() const noexcept
358 {
return _M_value.operator->(); }
361 [[no_unique_address]] __detail::__box<_Tp> _M_value;
364 template<
typename _Tp>
365 single_view(_Tp) -> single_view<_Tp>;
369 template<
typename _Wp>
370 constexpr auto __to_signed_like(_Wp __w)
noexcept
372 if constexpr (!integral<_Wp>)
373 return iter_difference_t<_Wp>();
374 else if constexpr (
sizeof(iter_difference_t<_Wp>) >
sizeof(_Wp))
375 return iter_difference_t<_Wp>(__w);
376 else if constexpr (
sizeof(ptrdiff_t) >
sizeof(_Wp))
377 return ptrdiff_t(__w);
378 else if constexpr (
sizeof(
long long) >
sizeof(_Wp))
379 return (
long long)(__w);
380#ifdef __SIZEOF_INT128__
381 else if constexpr (__SIZEOF_INT128__ >
sizeof(_Wp))
382 return __int128(__w);
385 return __max_diff_type(__w);
388 template<
typename _Wp>
391 template<
typename _It>
392 concept __decrementable = incrementable<_It>
395 { --__i } -> same_as<_It&>;
396 { __i-- } -> same_as<_It>;
399 template<
typename _It>
400 concept __advanceable = __decrementable<_It> && totally_ordered<_It>
401 &&
requires( _It __i,
const _It __j,
const __iota_diff_t<_It> __n)
403 { __i += __n } -> same_as<_It&>;
404 { __i -= __n } -> same_as<_It&>;
408 { __j - __j } -> convertible_to<__iota_diff_t<_It>>;
411 template<
typename _Winc>
412 struct __iota_view_iter_cat
415 template<incrementable _Winc>
416 struct __iota_view_iter_cat<_Winc>
417 {
using iterator_category = input_iterator_tag; };
420 template<weakly_incrementable _Winc,
421 semiregular _Bound = unreachable_sentinel_t>
422 requires std::__detail::__weakly_eq_cmp_with<_Winc, _Bound>
429 struct _Iterator : __detail::__iota_view_iter_cat<_Winc>
435 using namespace __detail;
436 if constexpr (__advanceable<_Winc>)
437 return random_access_iterator_tag{};
438 else if constexpr (__decrementable<_Winc>)
439 return bidirectional_iterator_tag{};
440 else if constexpr (incrementable<_Winc>)
441 return forward_iterator_tag{};
443 return input_iterator_tag{};
447 using iterator_concept =
decltype(_S_iter_concept());
449 using value_type = _Winc;
450 using difference_type = __detail::__iota_diff_t<_Winc>;
452 _Iterator()
requires default_initializable<_Winc> = default;
455 _Iterator(_Winc __value)
456 : _M_value(__value) { }
459 operator*() const noexcept(is_nothrow_copy_constructible_v<_Winc>)
474 operator++(
int)
requires incrementable<_Winc>
482 operator--()
requires __detail::__decrementable<_Winc>
489 operator--(
int)
requires __detail::__decrementable<_Winc>
497 operator+=(difference_type __n)
requires __detail::__advanceable<_Winc>
499 using __detail::__is_integer_like;
500 using __detail::__is_signed_integer_like;
501 if constexpr (__is_integer_like<_Winc>
502 && !__is_signed_integer_like<_Winc>)
504 if (__n >= difference_type(0))
505 _M_value +=
static_cast<_Winc
>(__n);
507 _M_value -=
static_cast<_Winc
>(-__n);
515 operator-=(difference_type __n)
requires __detail::__advanceable<_Winc>
517 using __detail::__is_integer_like;
518 using __detail::__is_signed_integer_like;
519 if constexpr (__is_integer_like<_Winc>
520 && !__is_signed_integer_like<_Winc>)
522 if (__n >= difference_type(0))
523 _M_value -=
static_cast<_Winc
>(__n);
525 _M_value +=
static_cast<_Winc
>(-__n);
533 operator[](difference_type __n)
const
534 requires __detail::__advanceable<_Winc>
535 {
return _Winc(_M_value + __n); }
537 friend constexpr bool
538 operator==(
const _Iterator& __x,
const _Iterator& __y)
539 requires equality_comparable<_Winc>
540 {
return __x._M_value == __y._M_value; }
542 friend constexpr bool
543 operator<(
const _Iterator& __x,
const _Iterator& __y)
544 requires totally_ordered<_Winc>
545 {
return __x._M_value < __y._M_value; }
547 friend constexpr bool
548 operator>(
const _Iterator& __x,
const _Iterator& __y)
549 requires totally_ordered<_Winc>
550 {
return __y < __x; }
552 friend constexpr bool
553 operator<=(
const _Iterator& __x,
const _Iterator& __y)
554 requires totally_ordered<_Winc>
555 {
return !(__y < __x); }
557 friend constexpr bool
558 operator>=(
const _Iterator& __x,
const _Iterator& __y)
559 requires totally_ordered<_Winc>
560 {
return !(__x < __y); }
562#ifdef __cpp_lib_three_way_comparison
563 friend constexpr auto
564 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
565 requires totally_ordered<_Winc> && three_way_comparable<_Winc>
566 {
return __x._M_value <=> __y._M_value; }
569 friend constexpr _Iterator
570 operator+(_Iterator __i, difference_type __n)
571 requires __detail::__advanceable<_Winc>
577 friend constexpr _Iterator
578 operator+(difference_type __n, _Iterator __i)
579 requires __detail::__advanceable<_Winc>
580 {
return __i += __n; }
582 friend constexpr _Iterator
583 operator-(_Iterator __i, difference_type __n)
584 requires __detail::__advanceable<_Winc>
590 friend constexpr difference_type
591 operator-(
const _Iterator& __x,
const _Iterator& __y)
592 requires __detail::__advanceable<_Winc>
594 using __detail::__is_integer_like;
595 using __detail::__is_signed_integer_like;
596 using _Dt = difference_type;
597 if constexpr (__is_integer_like<_Winc>)
599 if constexpr (__is_signed_integer_like<_Winc>)
600 return _Dt(_Dt(__x._M_value) - _Dt(__y._M_value));
602 return (__y._M_value > __x._M_value)
603 ? _Dt(-_Dt(__y._M_value - __x._M_value))
604 : _Dt(__x._M_value - __y._M_value);
607 return __x._M_value - __y._M_value;
611 _Winc _M_value = _Winc();
621 _M_equal(
const _Iterator& __x)
const
622 {
return __x._M_value == _M_bound; }
625 _M_distance_from(
const _Iterator& __x)
const
626 {
return _M_bound - __x._M_value; }
628 _Bound _M_bound = _Bound();
631 _Sentinel() =
default;
634 _Sentinel(_Bound __bound)
635 : _M_bound(__bound) { }
637 friend constexpr bool
638 operator==(
const _Iterator& __x,
const _Sentinel& __y)
639 {
return __y._M_equal(__x); }
641 friend constexpr iter_difference_t<_Winc>
642 operator-(
const _Iterator& __x,
const _Sentinel& __y)
643 requires sized_sentinel_for<_Bound, _Winc>
644 {
return -__y._M_distance_from(__x); }
646 friend constexpr iter_difference_t<_Winc>
647 operator-(
const _Sentinel& __x,
const _Iterator& __y)
648 requires sized_sentinel_for<_Bound, _Winc>
649 {
return __x._M_distance_from(__y); }
654 _Winc _M_value = _Winc();
655 [[no_unique_address]] _Bound _M_bound = _Bound();
658 iota_view()
requires default_initializable<_Winc> = default;
661 iota_view(_Winc __value)
666 iota_view(type_identity_t<_Winc> __value,
667 type_identity_t<_Bound> __bound)
668 : _M_value(__value), _M_bound(__bound)
670 if constexpr (totally_ordered_with<_Winc, _Bound>)
671 __glibcxx_assert(
bool(__value <= __bound) );
675 iota_view(_Iterator __first, _Iterator __last)
676 requires same_as<_Winc, _Bound>
677 : iota_view(__first._M_value, __last._M_value)
681 iota_view(_Iterator __first, unreachable_sentinel_t __last)
682 requires same_as<_Bound, unreachable_sentinel_t>
683 : iota_view(__first._M_value, __last)
687 iota_view(_Iterator __first, _Sentinel __last)
688 requires (!same_as<_Winc, _Bound>) && (!same_as<_Bound, unreachable_sentinel_t>)
689 : iota_view(__first._M_value, __last._M_bound)
693 begin()
const {
return _Iterator{_M_value}; }
698 if constexpr (same_as<_Bound, unreachable_sentinel_t>)
699 return unreachable_sentinel;
701 return _Sentinel{_M_bound};
705 end() const requires same_as<_Winc, _Bound>
706 {
return _Iterator{_M_bound}; }
712 {
return _M_value == _M_bound; }
716 requires (same_as<_Winc, _Bound> && __detail::__advanceable<_Winc>)
717 || (integral<_Winc> && integral<_Bound>)
718 || sized_sentinel_for<_Bound, _Winc>
720 using __detail::__is_integer_like;
721 using __detail::__to_unsigned_like;
722 if constexpr (integral<_Winc> && integral<_Bound>)
725 return _Up(_M_bound) - _Up(_M_value);
727 else if constexpr (__is_integer_like<_Winc>)
728 return __to_unsigned_like(_M_bound) - __to_unsigned_like(_M_value);
730 return __to_unsigned_like(_M_bound - _M_value);
734 template<
typename _Winc,
typename _Bound>
735 requires (!__detail::__is_integer_like<_Winc>
736 || !__detail::__is_integer_like<_Bound>
737 || (__detail::__is_signed_integer_like<_Winc>
738 == __detail::__is_signed_integer_like<_Bound>))
739 iota_view(_Winc, _Bound) -> iota_view<_Winc, _Bound>;
741 template<
typename _Winc,
typename _Bound>
742 inline constexpr bool
743 enable_borrowed_range<iota_view<_Winc, _Bound>> =
true;
747 template<
typename _Tp>
748 inline constexpr empty_view<_Tp>
empty{};
752 template<
typename _Tp>
753 concept __can_single_view
759 template<__detail::__can_single_view _Tp>
761 operator() [[nodiscard]] (_Tp&& __e)
const
766 inline constexpr _Single single{};
770 template<
typename... _Args>
776 template<__detail::__can_iota_view _Tp>
778 operator() [[nodiscard]] (_Tp&& __e)
const
781 template<
typename _Tp,
typename _Up>
782 requires __detail::__can_iota_view<_Tp, _Up>
784 operator() [[nodiscard]] (_Tp&& __e, _Up&& __f)
const
788 inline constexpr _Iota
iota{};
790#ifdef __cpp_lib_ranges_indices
793 template<ranges::__detail::__is_
integer_like _Tp>
794 requires __detail::__can_iota_view<_Tp>
795 [[nodiscard]]
constexpr auto
796 operator() (_Tp __e)
const noexcept
797 {
return iota(_Tp{}, __e); }
800 inline constexpr _Indices indices{};
807 template<
typename _Val,
typename _CharT,
typename _Traits>
808 concept __stream_extractable
809 =
requires(basic_istream<_CharT, _Traits>& is, _Val& t) { is >> t; };
812 template<movable _Val,
typename _CharT,
813 typename _Traits = char_traits<_CharT>>
814 requires default_initializable<_Val>
815 && __detail::__stream_extractable<_Val, _CharT, _Traits>
816 class basic_istream_view
817 :
public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
821 basic_istream_view(basic_istream<_CharT, _Traits>& __stream)
828 *_M_stream >> _M_object;
829 return _Iterator{
this};
832 constexpr default_sentinel_t
837 basic_istream<_CharT, _Traits>* _M_stream;
838 _Val _M_object = _Val();
843 using iterator_concept = input_iterator_tag;
844 using difference_type = ptrdiff_t;
845 using value_type = _Val;
848 _Iterator(basic_istream_view* __parent) noexcept
849 : _M_parent(__parent)
852 _Iterator(
const _Iterator&) =
delete;
853 _Iterator(_Iterator&&) =
default;
854 _Iterator& operator=(
const _Iterator&) =
delete;
855 _Iterator& operator=(_Iterator&&) =
default;
860 *_M_parent->_M_stream >> _M_parent->_M_object;
870 {
return _M_parent->_M_object; }
873 operator==(
const _Iterator& __x, default_sentinel_t)
874 {
return __x._M_at_end(); }
877 basic_istream_view* _M_parent;
881 {
return !*_M_parent->_M_stream; }
887 template<
typename _Val>
888 using istream_view = basic_istream_view<_Val, char>;
890 template<
typename _Val>
891 using wistream_view = basic_istream_view<_Val, wchar_t>;
897 template<
typename _Tp,
typename _Up>
898 concept __can_istream_view =
requires (_Up __e) {
899 basic_istream_view<_Tp, typename _Up::char_type, typename _Up::traits_type>(__e);
903 template<
typename _Tp>
906 template<
typename _CharT,
typename _Traits>
908 operator() [[nodiscard]] (basic_istream<_CharT, _Traits>& __e)
const
909 requires __detail::__can_istream_view<_Tp, remove_reference_t<
decltype(__e)>>
910 {
return basic_istream_view<_Tp, _CharT, _Traits>(__e); }
913 template<
typename _Tp>
914 inline constexpr _Istream<_Tp>
istream;
922 template<
typename _Tp,
int _Disc>
931 template<
bool _Present,
typename _Tp,
int _Disc = 0>
932 using __maybe_present_t = __conditional_t<_Present, _Tp, _Absent<_Tp, _Disc>>;
935 template<
bool _Const,
typename _Tp>
936 using __maybe_const_t = __conditional_t<_Const, const _Tp, _Tp>;
941using __detail::__maybe_const_t;
943namespace views::__adaptor
946 template<
typename _Adaptor,
typename... _Args>
947 concept __adaptor_invocable
952 template<
typename _Adaptor,
typename... _Args>
953 concept __adaptor_partial_app_viable = (_Adaptor::_S_arity > 1)
954 && (
sizeof...(_Args) == _Adaptor::_S_arity - 1)
955 && (constructible_from<decay_t<_Args>, _Args> && ...);
957 template<
typename _Adaptor,
typename... _Args>
960 template<
typename _Lhs,
typename _Rhs>
968 template<
typename _Derived>
969 struct _RangeAdaptorClosure;
971 template<
typename _Tp,
typename _Up>
972 requires (!same_as<_Tp, _RangeAdaptorClosure<_Up>>)
973 void __is_range_adaptor_closure_fn
974 (
const _Tp&,
const _RangeAdaptorClosure<_Up>&);
976 template<
typename _Tp>
977 concept __is_range_adaptor_closure
978 =
requires (_Tp __t) { __adaptor::__is_range_adaptor_closure_fn(__t, __t); };
980#pragma GCC diagnostic push
981#pragma GCC diagnostic ignored "-Wdangling-reference"
983 template<
typename _Self,
typename _Range>
984 requires __is_range_adaptor_closure<_Self>
985 && __adaptor_invocable<_Self, _Range>
992 template<
typename _Lhs,
typename _Rhs>
993 requires __is_range_adaptor_closure<_Lhs>
994 && __is_range_adaptor_closure<_Rhs>
1001#pragma GCC diagnostic pop
1003 template<
typename _Derived>
1004 struct _RangeAdaptorClosure
1010 template<
typename _Self,
typename _Range>
1011 requires __is_range_adaptor_closure<_Self>
1012 && __adaptor_invocable<_Self, _Range>
1013 friend constexpr auto
1014 operator|(_Range&& __r, _Self&& __self);
1016 template<
typename _Lhs,
typename _Rhs>
1017 requires __is_range_adaptor_closure<_Lhs>
1018 && __is_range_adaptor_closure<_Rhs>
1019 friend constexpr auto
1034 template<
typename _Derived>
1035 struct _RangeAdaptor
1039 template<
typename... _Args>
1040 requires __adaptor_partial_app_viable<_Derived, _Args...>
1042 operator()(_Args&&... __args)
const
1051 template<
typename _Adaptor>
1052 concept __closure_has_simple_call_op = _Adaptor::_S_has_simple_call_op;
1056 template<
typename _Adaptor,
typename... _Args>
1057 concept __adaptor_has_simple_extra_args = _Adaptor::_S_has_simple_extra_args
1058 || _Adaptor::template _S_has_simple_extra_args<_Args...>;
1062 template<
typename _Adaptor,
typename... _Args>
1063 struct _Partial : _RangeAdaptorClosure<_Partial<_Adaptor, _Args...>>
1065 using _Binder = _Bind_back_t<_Adaptor, _Args...>;
1066 [[no_unique_address]] _Binder _M_binder;
1070 template<
typename... _Ts>
1072 _Partial(
int, _Ts&&... __args)
1073 : _M_binder(0, _Adaptor(), std::
forward<_Ts>(__args)...)
1078#if __cpp_explicit_this_parameter
1079 template<
typename _Self,
typename _Range>
1080 requires __adaptor_invocable<_Adaptor, _Range, __like_t<_Self, _Args>...>
1082 operator()(
this _Self&& __self, _Range&& __r)
1084 return _Binder::_S_call(__like_t<_Self, _Partial>(__self)._M_binder,
1088 template<
typename _Range>
1089 requires __adaptor_invocable<_Adaptor, _Range,
const _Args&...>
1091 operator()(_Range&& __r)
const &
1094 template<
typename _Range>
1095 requires __adaptor_invocable<_Adaptor, _Range, _Args...>
1097 operator()(_Range&& __r) &&
1100 template<
typename _Range>
1102 operator()(_Range&& __r)
const && =
delete;
1110 template<
typename _Adaptor,
typename... _Args>
1111 requires __adaptor_has_simple_extra_args<_Adaptor, _Args...>
1112 && (is_trivially_copy_constructible_v<_Args> && ...)
1113 struct _Partial<_Adaptor, _Args...> : _RangeAdaptorClosure<_Partial<_Adaptor, _Args...>>
1115 using _Binder = _Bind_back_t<_Adaptor, _Args...>;
1116 [[no_unique_address]] _Binder _M_binder;
1118 template<
typename... _Ts>
1120 _Partial(
int, _Ts&&... __args)
1121 : _M_binder(0, _Adaptor(), std::
forward<_Ts>(__args)...)
1126 template<
typename _Range>
1127 requires __adaptor_invocable<_Adaptor, _Range,
const _Args&...>
1129 operator()(_Range&& __r)
const
1132 static constexpr bool _S_has_simple_call_op =
true;
1135 template<
typename _Lhs,
typename _Rhs,
typename _Range>
1136 concept __pipe_invocable
1141 template<
typename _Lhs,
typename _Rhs>
1142 struct _Pipe : _RangeAdaptorClosure<_Pipe<_Lhs, _Rhs>>
1144 [[no_unique_address]] _Lhs _M_lhs;
1145 [[no_unique_address]] _Rhs _M_rhs;
1147 template<
typename _Tp,
typename _Up>
1149 _Pipe(_Tp&& __lhs, _Up&& __rhs)
1150 : _M_lhs(std::
forward<_Tp>(__lhs)), _M_rhs(std::
forward<_Up>(__rhs))
1155#if __cpp_explicit_this_parameter
1156 template<
typename _Self,
typename _Range>
1157 requires __pipe_invocable<__like_t<_Self, _Lhs>, __like_t<_Self, _Rhs>, _Range>
1159 operator()(
this _Self&& __self, _Range&& __r)
1161 return (__like_t<_Self, _Pipe>(__self)._M_rhs
1162 (__like_t<_Self, _Pipe>(__self)._M_lhs
1166 template<
typename _Range>
1167 requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
1169 operator()(_Range&& __r)
const &
1172 template<
typename _Range>
1173 requires __pipe_invocable<_Lhs, _Rhs, _Range>
1175 operator()(_Range&& __r) &&
1178 template<
typename _Range>
1180 operator()(_Range&& __r)
const && =
delete;
1188 template<
typename _Lhs,
typename _Rhs>
1189 requires __closure_has_simple_call_op<_Lhs>
1190 && __closure_has_simple_call_op<_Rhs>
1191 struct _Pipe<_Lhs, _Rhs> : _RangeAdaptorClosure<_Pipe<_Lhs, _Rhs>>
1193 [[no_unique_address]] _Lhs _M_lhs;
1194 [[no_unique_address]] _Rhs _M_rhs;
1196 template<
typename _Tp,
typename _Up>
1198 _Pipe(_Tp&& __lhs, _Up&& __rhs)
1199 : _M_lhs(std::
forward<_Tp>(__lhs)), _M_rhs(std::
forward<_Up>(__rhs))
1202 template<
typename _Range>
1203 requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
1205 operator()(_Range&& __r)
const
1208 static constexpr bool _S_has_simple_call_op =
true;
1212#if __cpp_lib_ranges >= 202202L
1214 template<
typename _Derived>
1215 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
1216 class range_adaptor_closure
1217 :
public views::__adaptor::_RangeAdaptorClosure<_Derived>
1221 template<range _Range>
requires is_object_v<_Range>
1227 static void _S_fun(_Range&);
1228 static void _S_fun(_Range&&) =
delete;
1231 template<__detail::__different_from<ref_view> _Tp>
1232 requires convertible_to<_Tp, _Range&>
1233 &&
requires { _S_fun(declval<_Tp>()); }
1244 constexpr iterator_t<_Range>
1246 {
return ranges::begin(*_M_r); }
1248 constexpr sentinel_t<_Range>
1250 {
return ranges::end(*_M_r); }
1253 empty() const requires requires { ranges::empty(*_M_r); }
1254 {
return ranges::empty(*_M_r); }
1257 size() const requires sized_range<_Range>
1258 {
return ranges::size(*_M_r); }
1261 data() const requires contiguous_range<_Range>
1262 {
return ranges::data(*_M_r); }
1265 template<
typename _Range>
1266 ref_view(_Range&) -> ref_view<_Range>;
1268 template<
typename _Tp>
1269 inline constexpr bool enable_borrowed_range<ref_view<_Tp>> =
true;
1271 template<range _Range>
1272 requires movable<_Range>
1273 && (!__detail::__is_initializer_list<remove_cv_t<_Range>>)
1277 _Range _M_r = _Range();
1280 owning_view()
requires default_initializable<_Range> = default;
1283 owning_view(_Range&& __t)
1284 noexcept(is_nothrow_move_constructible_v<_Range>)
1285 : _M_r(std::
move(__t))
1288 owning_view(owning_view&&) =
default;
1289 owning_view& operator=(owning_view&&) =
default;
1295 constexpr const _Range&
1296 base() const& noexcept
1303 constexpr const _Range&&
1304 base() const&& noexcept
1307 constexpr iterator_t<_Range>
1309 {
return ranges::begin(_M_r); }
1311 constexpr sentinel_t<_Range>
1313 {
return ranges::end(_M_r); }
1316 begin() const requires range<const _Range>
1317 {
return ranges::begin(_M_r); }
1320 end() const requires range<const _Range>
1321 {
return ranges::end(_M_r); }
1324 empty()
requires requires { ranges::empty(_M_r); }
1325 {
return ranges::empty(_M_r); }
1328 empty() const requires requires { ranges::empty(_M_r); }
1329 {
return ranges::empty(_M_r); }
1332 size()
requires sized_range<_Range>
1333 {
return ranges::size(_M_r); }
1336 size() const requires sized_range<const _Range>
1337 {
return ranges::size(_M_r); }
1340 data()
requires contiguous_range<_Range>
1341 {
return ranges::data(_M_r); }
1344 data() const requires contiguous_range<const _Range>
1345 {
return ranges::data(_M_r); }
1348 template<
typename _Tp>
1349 inline constexpr bool enable_borrowed_range<owning_view<_Tp>>
1350 = enable_borrowed_range<_Tp>;
1356 template<
typename _Range>
1359 template<
typename _Range>
1363 struct _All : __adaptor::_RangeAdaptorClosure<_All>
1365 template<
typename _Range>
1366 static constexpr bool
1369 if constexpr (view<decay_t<_Range>>)
1370 return is_nothrow_constructible_v<decay_t<_Range>, _Range>;
1371 else if constexpr (__detail::__can_ref_view<_Range>)
1377 template<viewable_range _Range>
1378 requires view<decay_t<_Range>>
1379 || __detail::__can_ref_view<_Range>
1380 || __detail::__can_owning_view<_Range>
1382 operator() [[nodiscard]] (_Range&& __r)
const
1383 noexcept(_S_noexcept<_Range>())
1385 if constexpr (view<decay_t<_Range>>)
1387 else if constexpr (__detail::__can_ref_view<_Range>)
1393 static constexpr bool _S_has_simple_call_op =
true;
1396 inline constexpr _All all;
1398 template<viewable_range _Range>
1404 template<
typename _Tp>
1405 struct __non_propagating_cache
1413 template<
typename _Tp>
1414 requires is_object_v<_Tp>
1415 struct __non_propagating_cache<_Tp>
1416 :
protected _Optional_base<_Tp>
1418 __non_propagating_cache() =
default;
1421 __non_propagating_cache(
const __non_propagating_cache&)
noexcept
1425 __non_propagating_cache(__non_propagating_cache&& __other)
noexcept
1426 { __other._M_reset(); }
1428 constexpr __non_propagating_cache&
1429 operator=(
const __non_propagating_cache& __other)
noexcept
1436 constexpr __non_propagating_cache&
1437 operator=(__non_propagating_cache&& __other)
noexcept
1444 constexpr __non_propagating_cache&
1445 operator=(_Tp __val)
1448 this->_M_payload._M_construct(
std::move(__val));
1453 operator bool() const noexcept
1454 {
return this->_M_is_engaged(); }
1458 {
return this->_M_get(); }
1460 constexpr const _Tp&
1462 {
return this->_M_get(); }
1464 template<
typename _Iter>
1466 _M_emplace_deref(
const _Iter& __i)
1469 auto __f = [] (
auto& __x) {
return *__x; };
1470 this->_M_payload._M_apply(_Optional_func{__f}, __i);
1471 return this->_M_get();
1474 using _Optional_base<_Tp>::_M_reset;
1477 template<range _Range>
1478 struct _CachedPosition
1481 _M_has_value()
const
1484 constexpr iterator_t<_Range>
1485 _M_get(
const _Range&)
const
1487 __glibcxx_assert(
false);
1488 __builtin_unreachable();
1492 _M_set(
const _Range&,
const iterator_t<_Range>&)
const
1496 template<forward_range _Range>
1497 struct _CachedPosition<_Range>
1498 :
protected __non_propagating_cache<iterator_t<_Range>>
1501 _M_has_value()
const
1502 {
return this->_M_is_engaged(); }
1504 constexpr iterator_t<_Range>
1505 _M_get(
const _Range&)
const
1507 __glibcxx_assert(_M_has_value());
1512 _M_set(
const _Range&,
const iterator_t<_Range>& __it)
1514 __glibcxx_assert(!_M_has_value());
1517 this->_M_payload._M_engaged =
true;
1521 template<random_access_range _Range>
1522 struct _CachedPosition<_Range>
1525 range_difference_t<_Range> _M_offset = -1;
1528 _CachedPosition() =
default;
1531 _CachedPosition(
const _CachedPosition&) =
default;
1534 _CachedPosition(_CachedPosition&& __other)
noexcept
1537 constexpr _CachedPosition&
1538 operator=(
const _CachedPosition&) =
default;
1540 constexpr _CachedPosition&
1541 operator=(_CachedPosition&& __other)
noexcept
1544 _M_offset = __other._M_offset;
1545 __other._M_offset = -1;
1550 _M_has_value()
const
1551 {
return _M_offset >= 0; }
1553 constexpr iterator_t<_Range>
1554 _M_get(_Range& __r)
const
1556 __glibcxx_assert(_M_has_value());
1557 return ranges::begin(__r) + _M_offset;
1561 _M_set(_Range& __r,
const iterator_t<_Range>& __it)
1563 __glibcxx_assert(!_M_has_value());
1564 _M_offset = __it - ranges::begin(__r);
1571 template<
typename _Base>
1572 struct __filter_view_iter_cat
1575 template<forward_range _Base>
1576 struct __filter_view_iter_cat<_Base>
1582 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
1583 if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
1584 return bidirectional_iterator_tag{};
1585 else if constexpr (derived_from<_Cat, forward_iterator_tag>)
1586 return forward_iterator_tag{};
1591 using iterator_category =
decltype(_S_iter_cat());
1595 template<input_range _Vp,
1596 indirect_unary_predicate<iterator_t<_Vp>> _Pred>
1597 requires view<_Vp> && is_object_v<_Pred>
1598 class filter_view :
public view_interface<filter_view<_Vp, _Pred>>
1603 struct _Iterator : __detail::__filter_view_iter_cat<_Vp>
1606 static constexpr auto
1609 if constexpr (bidirectional_range<_Vp>)
1610 return bidirectional_iterator_tag{};
1611 else if constexpr (forward_range<_Vp>)
1612 return forward_iterator_tag{};
1614 return input_iterator_tag{};
1619 using _Vp_iter = iterator_t<_Vp>;
1621 _Vp_iter _M_current = _Vp_iter();
1622 filter_view* _M_parent =
nullptr;
1625 using iterator_concept =
decltype(_S_iter_concept());
1627 using value_type = range_value_t<_Vp>;
1628 using difference_type = range_difference_t<_Vp>;
1630 _Iterator()
requires default_initializable<_Vp_iter> = default;
1633 _Iterator(filter_view* __parent, _Vp_iter __current)
1634 : _M_current(std::move(__current)),
1638 constexpr const _Vp_iter&
1639 base() const & noexcept
1640 {
return _M_current; }
1646 constexpr range_reference_t<_Vp>
1648 {
return *_M_current; }
1652 requires __detail::__has_arrow<_Vp_iter>
1653 && copyable<_Vp_iter>
1654 {
return _M_current; }
1656 constexpr _Iterator&
1659 _M_current = ranges::find_if(
std::move(++_M_current),
1660 ranges::end(_M_parent->_M_base),
1670 operator++(
int)
requires forward_range<_Vp>
1677 constexpr _Iterator&
1678 operator--()
requires bidirectional_range<_Vp>
1687 operator--(
int)
requires bidirectional_range<_Vp>
1694 friend constexpr bool
1695 operator==(
const _Iterator& __x,
const _Iterator& __y)
1696 requires equality_comparable<_Vp_iter>
1697 {
return __x._M_current == __y._M_current; }
1699 friend constexpr range_rvalue_reference_t<_Vp>
1700 iter_move(
const _Iterator& __i)
1701 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
1702 {
return ranges::iter_move(__i._M_current); }
1704 friend constexpr void
1705 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
1706 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
1707 requires indirectly_swappable<_Vp_iter>
1708 { ranges::iter_swap(__x._M_current, __y._M_current); }
1714 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
1717 __equal(
const _Iterator& __i)
const
1718 {
return __i._M_current == _M_end; }
1721 _Sentinel() =
default;
1724 _Sentinel(filter_view* __parent)
1725 : _M_end(ranges::
end(__parent->_M_base))
1728 constexpr sentinel_t<_Vp>
1732 friend constexpr bool
1733 operator==(
const _Iterator& __x,
const _Sentinel& __y)
1734 {
return __y.__equal(__x); }
1737 _Vp _M_base = _Vp();
1738 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
1739 [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
1742 filter_view()
requires (default_initializable<_Vp>
1743 && default_initializable<_Pred>)
1747 filter_view(_Vp __base, _Pred __pred)
1752 base() const& requires copy_constructible<_Vp>
1759 constexpr const _Pred&
1761 {
return *_M_pred; }
1766 if (_M_cached_begin._M_has_value())
1767 return {
this, _M_cached_begin._M_get(_M_base)};
1769 __glibcxx_assert(_M_pred.has_value());
1770 auto __it = ranges::find_if(ranges::begin(_M_base),
1771 ranges::end(_M_base),
1773 _M_cached_begin._M_set(_M_base, __it);
1780 if constexpr (common_range<_Vp>)
1781 return _Iterator{
this, ranges::end(_M_base)};
1783 return _Sentinel{
this};
1787 template<
typename _Range,
typename _Pred>
1788 filter_view(_Range&&, _Pred) -> filter_view<views::all_t<_Range>, _Pred>;
1794 template<
typename _Range,
typename _Pred>
1795 concept __can_filter_view
1799 struct _Filter : __adaptor::_RangeAdaptor<_Filter>
1801 template<viewable_range _Range,
typename _Pred>
1802 requires __detail::__can_filter_view<_Range, _Pred>
1804 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
1809 using _RangeAdaptor<_Filter>::operator();
1810 static constexpr int _S_arity = 2;
1811 static constexpr bool _S_has_simple_extra_args =
true;
1814 inline constexpr _Filter filter;
1817#if __cpp_lib_ranges >= 202207L
1818 template<input_range _Vp, move_constructible _Fp>
1820 template<input_range _Vp, copy_constructible _Fp>
1822 requires view<_Vp> && is_object_v<_Fp>
1823 && regular_invocable<_Fp&, range_reference_t<_Vp>>
1824 && std::__detail::__can_reference<invoke_result_t<_Fp&,
1825 range_reference_t<_Vp>>>
1826 class transform_view :
public view_interface<transform_view<_Vp, _Fp>>
1829 template<
bool _Const>
1830 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
1832 template<
bool _Const>
1836 template<
bool _Const>
1837 requires forward_range<_Base<_Const>>
1838 struct __iter_cat<_Const>
1847 using _Base = transform_view::_Base<_Const>;
1848 using _Res = invoke_result_t<__maybe_const_t<_Const, _Fp>&,
1849 range_reference_t<_Base>>;
1852 if constexpr (is_reference_v<_Res>)
1855 =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
1856 if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
1857 return random_access_iterator_tag{};
1862 return input_iterator_tag{};
1865 using iterator_category =
decltype(_S_iter_cat());
1868 template<
bool _Const>
1871 template<
bool _Const>
1872 struct _Iterator : __iter_cat<_Const>
1875 using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
1876 using _Base = transform_view::_Base<_Const>;
1881 if constexpr (random_access_range<_Base>)
1882 return random_access_iterator_tag{};
1883 else if constexpr (bidirectional_range<_Base>)
1884 return bidirectional_iterator_tag{};
1885 else if constexpr (forward_range<_Base>)
1886 return forward_iterator_tag{};
1888 return input_iterator_tag{};
1891 using _Base_iter = iterator_t<_Base>;
1893 _Base_iter _M_current = _Base_iter();
1894 _Parent* _M_parent =
nullptr;
1897 using iterator_concept =
decltype(_S_iter_concept());
1900 = remove_cvref_t<invoke_result_t<__maybe_const_t<_Const, _Fp>&,
1901 range_reference_t<_Base>>>;
1902 using difference_type = range_difference_t<_Base>;
1904 _Iterator()
requires default_initializable<_Base_iter> = default;
1907 _Iterator(_Parent* __parent, _Base_iter __current)
1908 : _M_current(std::move(__current)),
1913 _Iterator(_Iterator<!_Const> __i)
1915 && convertible_to<iterator_t<_Vp>, _Base_iter>
1916 : _M_current(
std::move(__i._M_current)), _M_parent(__i._M_parent)
1919 constexpr const _Base_iter&
1920 base() const & noexcept
1921 {
return _M_current; }
1923 constexpr _Base_iter
1927 constexpr decltype(
auto)
1929 noexcept(
noexcept(
std::__invoke(*_M_parent->_M_fun, *_M_current)))
1932 constexpr _Iterator&
1944 operator++(
int)
requires forward_range<_Base>
1951 constexpr _Iterator&
1952 operator--()
requires bidirectional_range<_Base>
1959 operator--(
int)
requires bidirectional_range<_Base>
1966 constexpr _Iterator&
1967 operator+=(difference_type __n)
requires random_access_range<_Base>
1973 constexpr _Iterator&
1974 operator-=(difference_type __n)
requires random_access_range<_Base>
1980 constexpr decltype(
auto)
1981 operator[](difference_type __n)
const
1982 requires random_access_range<_Base>
1983 {
return std::__invoke(*_M_parent->_M_fun, _M_current[__n]); }
1985 friend constexpr bool
1986 operator==(
const _Iterator& __x,
const _Iterator& __y)
1987 requires equality_comparable<_Base_iter>
1988 {
return __x._M_current == __y._M_current; }
1990 friend constexpr bool
1991 operator<(
const _Iterator& __x,
const _Iterator& __y)
1992 requires random_access_range<_Base>
1993 {
return __x._M_current < __y._M_current; }
1995 friend constexpr bool
1996 operator>(
const _Iterator& __x,
const _Iterator& __y)
1997 requires random_access_range<_Base>
1998 {
return __y < __x; }
2000 friend constexpr bool
2001 operator<=(
const _Iterator& __x,
const _Iterator& __y)
2002 requires random_access_range<_Base>
2003 {
return !(__y < __x); }
2005 friend constexpr bool
2006 operator>=(
const _Iterator& __x,
const _Iterator& __y)
2007 requires random_access_range<_Base>
2008 {
return !(__x < __y); }
2010#ifdef __cpp_lib_three_way_comparison
2011 friend constexpr auto
2012 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
2013 requires random_access_range<_Base>
2014 && three_way_comparable<_Base_iter>
2015 {
return __x._M_current <=> __y._M_current; }
2018 friend constexpr _Iterator
2019 operator+(_Iterator __i, difference_type __n)
2020 requires random_access_range<_Base>
2021 {
return {__i._M_parent, __i._M_current + __n}; }
2023 friend constexpr _Iterator
2024 operator+(difference_type __n, _Iterator __i)
2025 requires random_access_range<_Base>
2026 {
return {__i._M_parent, __i._M_current + __n}; }
2028 friend constexpr _Iterator
2029 operator-(_Iterator __i, difference_type __n)
2030 requires random_access_range<_Base>
2031 {
return {__i._M_parent, __i._M_current - __n}; }
2035 friend constexpr difference_type
2036 operator-(
const _Iterator& __x,
const _Iterator& __y)
2037 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
2038 {
return __x._M_current - __y._M_current; }
2040 friend constexpr decltype(
auto)
2041 iter_move(
const _Iterator& __i)
noexcept(
noexcept(*__i))
2043 if constexpr (is_lvalue_reference_v<
decltype(*__i)>)
2049 friend _Iterator<!_Const>;
2050 template<
bool>
friend struct _Sentinel;
2053 template<
bool _Const>
2057 using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
2058 using _Base = transform_view::_Base<_Const>;
2060 template<
bool _Const2>
2062 __distance_from(
const _Iterator<_Const2>& __i)
const
2063 {
return _M_end - __i._M_current; }
2065 template<
bool _Const2>
2067 __equal(
const _Iterator<_Const2>& __i)
const
2068 {
return __i._M_current == _M_end; }
2070 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2073 _Sentinel() =
default;
2076 _Sentinel(sentinel_t<_Base> __end)
2081 _Sentinel(_Sentinel<!_Const> __i)
2083 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2087 constexpr sentinel_t<_Base>
2091 template<
bool _Const2>
2092 requires sentinel_for<sentinel_t<_Base>,
2093 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
2094 friend constexpr bool
2095 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
2096 {
return __y.__equal(__x); }
2098 template<
bool _Const2,
2099 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
2100 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2101 friend constexpr range_difference_t<_Base2>
2102 operator-(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
2103 {
return -__y.__distance_from(__x); }
2105 template<
bool _Const2,
2106 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
2107 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2108 friend constexpr range_difference_t<_Base2>
2109 operator-(
const _Sentinel& __y,
const _Iterator<_Const2>& __x)
2110 {
return __y.__distance_from(__x); }
2112 friend _Sentinel<!_Const>;
2115 _Vp _M_base = _Vp();
2116 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
2119 transform_view()
requires (default_initializable<_Vp>
2120 && default_initializable<_Fp>)
2124 transform_view(_Vp __base, _Fp __fun)
2129 base() const& requires copy_constructible<_Vp>
2130 {
return _M_base ; }
2136 constexpr _Iterator<false>
2138 {
return _Iterator<false>{
this, ranges::begin(_M_base)}; }
2140 constexpr _Iterator<true>
2142 requires range<const _Vp>
2143 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2144 {
return _Iterator<true>{
this, ranges::begin(_M_base)}; }
2146 constexpr _Sentinel<false>
2148 {
return _Sentinel<false>{ranges::end(_M_base)}; }
2150 constexpr _Iterator<false>
2151 end()
requires common_range<_Vp>
2152 {
return _Iterator<false>{
this, ranges::end(_M_base)}; }
2154 constexpr _Sentinel<true>
2156 requires range<const _Vp>
2157 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2158 {
return _Sentinel<true>{ranges::end(_M_base)}; }
2160 constexpr _Iterator<true>
2162 requires common_range<const _Vp>
2163 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2164 {
return _Iterator<true>{
this, ranges::end(_M_base)}; }
2167 size()
requires sized_range<_Vp>
2168 {
return ranges::size(_M_base); }
2171 size() const requires sized_range<const _Vp>
2172 {
return ranges::size(_M_base); }
2175 template<
typename _Range,
typename _Fp>
2176 transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>;
2182 template<
typename _Range,
typename _Fp>
2183 concept __can_transform_view
2187 struct _Transform : __adaptor::_RangeAdaptor<_Transform>
2189 template<viewable_range _Range,
typename _Fp>
2190 requires __detail::__can_transform_view<_Range, _Fp>
2192 operator() [[nodiscard]] (_Range&& __r, _Fp&& __f)
const
2197 using _RangeAdaptor<_Transform>::operator();
2198 static constexpr int _S_arity = 2;
2199 static constexpr bool _S_has_simple_extra_args =
true;
2202 inline constexpr _Transform transform;
2209 template<
bool _Const>
2210 using _CI = counted_iterator<
2211 iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>;
2213 template<
bool _Const>
2217 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2218 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2221 _Sentinel() =
default;
2224 _Sentinel(sentinel_t<_Base> __end)
2229 _Sentinel(_Sentinel<!_Const> __s)
2230 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2234 constexpr sentinel_t<_Base>
2238 friend constexpr bool
2239 operator==(
const _CI<_Const>& __y,
const _Sentinel& __x)
2240 {
return __y.count() == 0 || __y.base() == __x._M_end; }
2242 template<
bool _OtherConst = !_Const,
2243 typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
2244 requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2245 friend constexpr bool
2246 operator==(
const _CI<_OtherConst>& __y,
const _Sentinel& __x)
2247 {
return __y.count() == 0 || __y.base() == __x._M_end; }
2249 friend _Sentinel<!_Const>;
2252 _Vp _M_base = _Vp();
2253 range_difference_t<_Vp> _M_count = 0;
2256 take_view()
requires default_initializable<_Vp> = default;
2259 take_view(_Vp __base, range_difference_t<_Vp> __count)
2260 : _M_base(std::move(__base)), _M_count(std::move(__count))
2264 base() const& requires copy_constructible<_Vp>
2272 begin()
requires (!__detail::__simple_view<_Vp>)
2274 if constexpr (sized_range<_Vp>)
2276 if constexpr (random_access_range<_Vp>)
2277 return ranges::begin(_M_base);
2281 return counted_iterator(ranges::begin(_M_base), __sz);
2285 return counted_iterator(ranges::begin(_M_base), _M_count);
2289 begin() const requires range<const _Vp>
2291 if constexpr (sized_range<const _Vp>)
2293 if constexpr (random_access_range<const _Vp>)
2294 return ranges::begin(_M_base);
2298 return counted_iterator(ranges::begin(_M_base), __sz);
2302 return counted_iterator(ranges::begin(_M_base), _M_count);
2306 end()
requires (!__detail::__simple_view<_Vp>)
2308 if constexpr (sized_range<_Vp>)
2310 if constexpr (random_access_range<_Vp>)
2311 return ranges::begin(_M_base) +
size();
2316 return _Sentinel<false>{ranges::end(_M_base)};
2320 end() const requires range<const _Vp>
2322 if constexpr (sized_range<const _Vp>)
2324 if constexpr (random_access_range<const _Vp>)
2325 return ranges::begin(_M_base) +
size();
2330 return _Sentinel<true>{ranges::end(_M_base)};
2334 size()
requires sized_range<_Vp>
2336 auto __n = ranges::size(_M_base);
2337 return std::min(__n,
static_cast<decltype(__n)
>(_M_count));
2341 size() const requires sized_range<const _Vp>
2343 auto __n = ranges::size(_M_base);
2344 return std::min(__n,
static_cast<decltype(__n)
>(_M_count));
2351 template<
typename _Range>
2352 take_view(_Range&&, range_difference_t<_Range>)
2353 -> take_view<views::all_t<_Range>>;
2355 template<
typename _Tp>
2356 inline constexpr bool enable_borrowed_range<take_view<_Tp>>
2357 = enable_borrowed_range<_Tp>;
2363 template<
typename _Range>
2364 inline constexpr bool __is_empty_view =
false;
2366 template<
typename _Tp>
2367 inline constexpr bool __is_empty_view<empty_view<_Tp>> =
true;
2369 template<
typename _Range>
2370 inline constexpr bool __is_basic_string_view =
false;
2372 template<
typename _CharT,
typename _Traits>
2373 inline constexpr bool __is_basic_string_view<basic_string_view<_CharT, _Traits>>
2376 using ranges::__detail::__is_subrange;
2378 template<
typename _Range>
2379 inline constexpr bool __is_iota_view =
false;
2381 template<
typename _Winc,
typename _Bound>
2382 inline constexpr bool __is_iota_view<iota_view<_Winc, _Bound>> =
true;
2384 template<
typename _Range>
2385 inline constexpr bool __is_repeat_view =
false;
2387 template<
typename _Range>
2389 __take_of_repeat_view(_Range&&, range_difference_t<_Range>);
2391 template<
typename _Range,
typename _Dp>
2392 concept __can_take_view
2396 struct _Take : __adaptor::_RangeAdaptor<_Take>
2398 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
2399 requires __detail::__can_take_view<_Range, _Dp>
2401 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
2403 using _Tp = remove_cvref_t<_Range>;
2404 if constexpr (__detail::__is_empty_view<_Tp>)
2406#ifdef __cpp_lib_optional_range_support
2407 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
2410 else if constexpr (random_access_range<_Tp>
2412 && (std::__detail::__is_span<_Tp>
2413 || __detail::__is_basic_string_view<_Tp>
2414 || __detail::__is_subrange<_Tp>
2415 || __detail::__is_iota_view<_Tp>))
2418 auto __begin = ranges::begin(__r);
2419 auto __end = __begin + __n;
2420 if constexpr (std::__detail::__is_span<_Tp>)
2421 return span<typename _Tp::element_type>(__begin, __end);
2422 else if constexpr (__detail::__is_basic_string_view<_Tp>)
2423 return _Tp(__begin, __end);
2424 else if constexpr (__detail::__is_subrange<_Tp>)
2425 return subrange<iterator_t<_Tp>>(__begin, __end);
2427 return iota_view(*__begin, *__end);
2429 else if constexpr (__detail::__is_repeat_view<_Tp>)
2435 using _RangeAdaptor<_Take>::operator();
2436 static constexpr int _S_arity = 2;
2440 template<
typename _Tp>
2441 static constexpr bool _S_has_simple_extra_args
2442 = ranges::__detail::__is_integer_like<_Tp>;
2445 inline constexpr _Take take;
2448 template<view _Vp,
typename _Pred>
2449 requires input_range<_Vp> && is_object_v<_Pred>
2450 && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
2451 class take_while_view :
public view_interface<take_while_view<_Vp, _Pred>>
2453 template<
bool _Const>
2457 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2459 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2460 const _Pred* _M_pred =
nullptr;
2463 _Sentinel() =
default;
2466 _Sentinel(sentinel_t<_Base> __end,
const _Pred* __pred)
2467 : _M_end(__end), _M_pred(__pred)
2471 _Sentinel(_Sentinel<!_Const> __s)
2472 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2473 : _M_end(__s._M_end), _M_pred(__s._M_pred)
2476 constexpr sentinel_t<_Base>
2477 base()
const {
return _M_end; }
2479 friend constexpr bool
2480 operator==(
const iterator_t<_Base>& __x,
const _Sentinel& __y)
2481 {
return __y._M_end == __x || !
std::__invoke(*__y._M_pred, *__x); }
2483 template<
bool _OtherConst = !_Const,
2484 typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
2485 requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2486 friend constexpr bool
2487 operator==(
const iterator_t<_Base2>& __x,
const _Sentinel& __y)
2488 {
return __y._M_end == __x || !
std::__invoke(*__y._M_pred, *__x); }
2490 friend _Sentinel<!_Const>;
2493 _Vp _M_base = _Vp();
2494 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
2497 take_while_view()
requires (default_initializable<_Vp>
2498 && default_initializable<_Pred>)
2502 take_while_view(_Vp __base, _Pred __pred)
2507 base() const& requires copy_constructible<_Vp>
2514 constexpr const _Pred&
2516 {
return *_M_pred; }
2519 begin()
requires (!__detail::__simple_view<_Vp>)
2520 {
return ranges::begin(_M_base); }
2523 begin() const requires range<const _Vp>
2524 && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
2525 {
return ranges::begin(_M_base); }
2528 end()
requires (!__detail::__simple_view<_Vp>)
2529 {
return _Sentinel<false>(ranges::end(_M_base),
2533 end() const requires range<const _Vp>
2534 && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
2535 {
return _Sentinel<true>(ranges::end(_M_base),
2539 template<
typename _Range,
typename _Pred>
2540 take_while_view(_Range&&, _Pred)
2541 -> take_while_view<views::all_t<_Range>, _Pred>;
2547 template<
typename _Range,
typename _Pred>
2548 concept __can_take_while_view
2552 struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile>
2554 template<viewable_range _Range,
typename _Pred>
2555 requires __detail::__can_take_while_view<_Range, _Pred>
2557 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
2562 using _RangeAdaptor<_TakeWhile>::operator();
2563 static constexpr int _S_arity = 2;
2564 static constexpr bool _S_has_simple_extra_args =
true;
2567 inline constexpr _TakeWhile take_while;
2574 _Vp _M_base = _Vp();
2575 range_difference_t<_Vp> _M_count = 0;
2579 static constexpr bool _S_needs_cached_begin
2580 = !(random_access_range<const _Vp> && sized_range<const _Vp>);
2581 [[no_unique_address]]
2582 __detail::__maybe_present_t<_S_needs_cached_begin,
2583 __detail::_CachedPosition<_Vp>>
2587 drop_view()
requires default_initializable<_Vp> = default;
2590 drop_view(_Vp __base, range_difference_t<_Vp> __count)
2591 : _M_base(std::move(__base)), _M_count(__count)
2592 { __glibcxx_assert(__count >= 0); }
2595 base() const& requires copy_constructible<_Vp>
2605 requires (!(__detail::__simple_view<_Vp>
2606 && random_access_range<const _Vp>
2607 && sized_range<const _Vp>))
2609 if constexpr (_S_needs_cached_begin)
2610 if (_M_cached_begin._M_has_value())
2611 return _M_cached_begin._M_get(_M_base);
2613 auto __it = ranges::next(ranges::begin(_M_base),
2614 _M_count, ranges::end(_M_base));
2615 if constexpr (_S_needs_cached_begin)
2616 _M_cached_begin._M_set(_M_base, __it);
2624 requires random_access_range<const _Vp> && sized_range<const _Vp>
2626 return ranges::begin(_M_base) + ranges::min(ranges::distance(_M_base),
2631 end()
requires (!__detail::__simple_view<_Vp>)
2632 {
return ranges::end(_M_base); }
2635 end() const requires range<const _Vp>
2636 {
return ranges::end(_M_base); }
2639 size()
requires sized_range<_Vp>
2641 const auto __s = ranges::size(_M_base);
2642 const auto __c =
static_cast<decltype(__s)
>(_M_count);
2643 return __s < __c ? 0 : __s - __c;
2647 size() const requires sized_range<const _Vp>
2649 const auto __s = ranges::size(_M_base);
2650 const auto __c =
static_cast<decltype(__s)
>(_M_count);
2651 return __s < __c ? 0 : __s - __c;
2655 template<
typename _Range>
2656 drop_view(_Range&&, range_difference_t<_Range>)
2657 -> drop_view<views::all_t<_Range>>;
2659 template<
typename _Tp>
2660 inline constexpr bool enable_borrowed_range<drop_view<_Tp>>
2661 = enable_borrowed_range<_Tp>;
2667 template<
typename _Range>
2669 __drop_of_repeat_view(_Range&&, range_difference_t<_Range>);
2671 template<
typename _Range,
typename _Dp>
2672 concept __can_drop_view
2676 struct _Drop : __adaptor::_RangeAdaptor<_Drop>
2678 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
2679 requires __detail::__can_drop_view<_Range, _Dp>
2681 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
2683 using _Tp = remove_cvref_t<_Range>;
2684 if constexpr (__detail::__is_empty_view<_Tp>)
2686#ifdef __cpp_lib_optional_range_support
2687 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
2690 else if constexpr (random_access_range<_Tp>
2692 && (std::__detail::__is_span<_Tp>
2693 || __detail::__is_basic_string_view<_Tp>
2694 || __detail::__is_iota_view<_Tp>
2695 || __detail::__is_subrange<_Tp>))
2698 auto __begin = ranges::begin(__r) + __n;
2699 auto __end = ranges::end(__r);
2700 if constexpr (std::__detail::__is_span<_Tp>)
2701 return span<typename _Tp::element_type>(__begin, __end);
2702 else if constexpr (__detail::__is_subrange<_Tp>)
2704 if constexpr (_Tp::_S_store_size)
2706 using ranges::__detail::__to_unsigned_like;
2707 auto __m = ranges::distance(__r) - __n;
2708 return _Tp(__begin, __end, __to_unsigned_like(__m));
2711 return _Tp(__begin, __end);
2714 return _Tp(__begin, __end);
2716 else if constexpr (__detail::__is_repeat_view<_Tp>)
2722 using _RangeAdaptor<_Drop>::operator();
2723 static constexpr int _S_arity = 2;
2724 template<
typename _Tp>
2725 static constexpr bool _S_has_simple_extra_args
2726 = _Take::_S_has_simple_extra_args<_Tp>;
2729 inline constexpr _Drop drop;
2732 template<view _Vp,
typename _Pred>
2733 requires input_range<_Vp> && is_object_v<_Pred>
2734 && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
2735 class drop_while_view :
public view_interface<drop_while_view<_Vp, _Pred>>
2738 _Vp _M_base = _Vp();
2739 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
2740 [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
2743 drop_while_view()
requires (default_initializable<_Vp>
2744 && default_initializable<_Pred>)
2748 drop_while_view(_Vp __base, _Pred __pred)
2753 base() const& requires copy_constructible<_Vp>
2760 constexpr const _Pred&
2762 {
return *_M_pred; }
2767 if (_M_cached_begin._M_has_value())
2768 return _M_cached_begin._M_get(_M_base);
2770 __glibcxx_assert(_M_pred.has_value());
2771 auto __it = ranges::find_if_not(ranges::begin(_M_base),
2772 ranges::end(_M_base),
2774 _M_cached_begin._M_set(_M_base, __it);
2780 {
return ranges::end(_M_base); }
2783 template<
typename _Range,
typename _Pred>
2784 drop_while_view(_Range&&, _Pred)
2785 -> drop_while_view<views::all_t<_Range>, _Pred>;
2787 template<
typename _Tp,
typename _Pred>
2788 inline constexpr bool enable_borrowed_range<drop_while_view<_Tp, _Pred>>
2789 = enable_borrowed_range<_Tp>;
2795 template<
typename _Range,
typename _Pred>
2796 concept __can_drop_while_view
2800 struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile>
2802 template<viewable_range _Range,
typename _Pred>
2803 requires __detail::__can_drop_while_view<_Range, _Pred>
2805 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
2811 using _RangeAdaptor<_DropWhile>::operator();
2812 static constexpr int _S_arity = 2;
2813 static constexpr bool _S_has_simple_extra_args =
true;
2816 inline constexpr _DropWhile drop_while;
2821 template<
typename _Tp>
2823 __as_lvalue(_Tp&& __t)
2824 {
return static_cast<_Tp&
>(__t); }
2827 template<input_range _Vp>
2828 requires view<_Vp> && input_range<range_reference_t<_Vp>>
2832 using _InnerRange = range_reference_t<_Vp>;
2834 template<
bool _Const>
2835 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2837 template<
bool _Const>
2838 using _Outer_iter = iterator_t<_Base<_Const>>;
2840 template<
bool _Const>
2841 using _Inner_iter = iterator_t<range_reference_t<_Base<_Const>>>;
2843 template<
bool _Const>
2844 static constexpr bool _S_ref_is_glvalue
2845 = is_reference_v<range_reference_t<_Base<_Const>>>;
2847 template<
bool _Const>
2851 template<
bool _Const>
2852 requires _S_ref_is_glvalue<_Const>
2853 && forward_range<_Base<_Const>>
2854 && forward_range<range_reference_t<_Base<_Const>>>
2855 struct __iter_cat<_Const>
2858 static constexpr auto
2861 using _Outer_iter = join_view::_Outer_iter<_Const>;
2862 using _Inner_iter = join_view::_Inner_iter<_Const>;
2863 using _OuterCat =
typename iterator_traits<_Outer_iter>::iterator_category;
2864 using _InnerCat =
typename iterator_traits<_Inner_iter>::iterator_category;
2865 if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
2866 && derived_from<_InnerCat, bidirectional_iterator_tag>
2867 && common_range<range_reference_t<_Base<_Const>>>)
2868 return bidirectional_iterator_tag{};
2869 else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
2870 && derived_from<_InnerCat, forward_iterator_tag>)
2871 return forward_iterator_tag{};
2873 return input_iterator_tag{};
2876 using iterator_category =
decltype(_S_iter_cat());
2879 template<
bool _Const>
2882 template<
bool _Const>
2883 struct _Iterator : __iter_cat<_Const>
2886 using _Parent = __detail::__maybe_const_t<_Const, join_view>;
2887 using _Base = join_view::_Base<_Const>;
2891 static constexpr bool _S_ref_is_glvalue
2892 = join_view::_S_ref_is_glvalue<_Const>;
2897 auto __update_inner = [
this] (
const iterator_t<_Base>& __x) ->
auto&& {
2898 if constexpr (_S_ref_is_glvalue)
2901 return _M_parent->_M_inner._M_emplace_deref(__x);
2904 _Outer_iter& __outer = _M_get_outer();
2905 for (; __outer != ranges::end(_M_parent->_M_base); ++__outer)
2907 auto&& __inner = __update_inner(__outer);
2908 _M_inner = ranges::begin(__inner);
2909 if (_M_inner != ranges::end(__inner))
2913 if constexpr (_S_ref_is_glvalue)
2915 if constexpr (forward_iterator<_Inner_iter>)
2916 _M_inner = _Inner_iter();
2922 static constexpr auto
2925 if constexpr (_S_ref_is_glvalue
2926 && bidirectional_range<_Base>
2927 && bidirectional_range<range_reference_t<_Base>>
2928 && common_range<range_reference_t<_Base>>)
2929 return bidirectional_iterator_tag{};
2930 else if constexpr (_S_ref_is_glvalue
2931 && forward_range<_Base>
2932 && forward_range<range_reference_t<_Base>>)
2933 return forward_iterator_tag{};
2935 return input_iterator_tag{};
2938 using _Outer_iter = join_view::_Outer_iter<_Const>;
2939 using _Inner_iter = join_view::_Inner_iter<_Const>;
2941 constexpr _Outer_iter&
2944 if constexpr (forward_range<_Base>)
2947 return *_M_parent->_M_outer;
2950 constexpr const _Outer_iter&
2951 _M_get_outer()
const
2953 if constexpr (forward_range<_Base>)
2956 return *_M_parent->_M_outer;
2959 constexpr _Inner_iter&
2960 _M_get_inner() noexcept
2962 if constexpr (forward_iterator<_Inner_iter>)
2968 constexpr const _Inner_iter&
2969 _M_get_inner() const noexcept
2971 if constexpr (forward_iterator<_Inner_iter>)
2978 _Iterator(_Parent* __parent, _Outer_iter __outer)
requires forward_range<_Base>
2979 : _M_outer(
std::move(__outer)), _M_parent(__parent)
2983 _Iterator(_Parent* __parent)
requires (!forward_range<_Base>)
2984 : _M_parent(__parent)
2987 [[no_unique_address]]
2988 __detail::__maybe_present_t<forward_range<_Base>, _Outer_iter> _M_outer
2989 =
decltype(_M_outer)();
2990 __conditional_t<forward_iterator<_Inner_iter>,
2991 _Inner_iter, optional<_Inner_iter>> _M_inner
2992 =
decltype(_M_inner)();
2993 _Parent* _M_parent =
nullptr;
2996 using iterator_concept =
decltype(_S_iter_concept());
2998 using value_type = range_value_t<range_reference_t<_Base>>;
2999 using difference_type
3000 = common_type_t<range_difference_t<_Base>,
3001 range_difference_t<range_reference_t<_Base>>>;
3003 _Iterator() =
default;
3006 _Iterator(_Iterator<!_Const> __i)
3008 && convertible_to<iterator_t<_Vp>, _Outer_iter>
3009 && convertible_to<iterator_t<_InnerRange>, _Inner_iter>
3011 _M_parent(__i._M_parent)
3014 constexpr decltype(
auto)
3016 {
return *_M_get_inner(); }
3020 constexpr _Inner_iter
3022 requires __detail::__has_arrow<_Inner_iter>
3023 && copyable<_Inner_iter>
3024 {
return _M_get_inner(); }
3026 constexpr _Iterator&
3029 auto&& __inner_range = [
this] () ->
auto&& {
3030 if constexpr (_S_ref_is_glvalue)
3031 return *_M_get_outer();
3033 return *_M_parent->_M_inner;
3035 if (++_M_get_inner() == ranges::end(__inner_range))
3049 requires _S_ref_is_glvalue && forward_range<_Base>
3050 && forward_range<range_reference_t<_Base>>
3057 constexpr _Iterator&
3059 requires _S_ref_is_glvalue && bidirectional_range<_Base>
3060 && bidirectional_range<range_reference_t<_Base>>
3061 && common_range<range_reference_t<_Base>>
3063 if (_M_outer == ranges::end(_M_parent->_M_base))
3064 _M_inner = ranges::end(__detail::__as_lvalue(*--_M_outer));
3065 while (_M_get_inner() == ranges::begin(__detail::__as_lvalue(*_M_outer)))
3066 _M_get_inner() = ranges::end(__detail::__as_lvalue(*--_M_outer));
3073 requires _S_ref_is_glvalue && bidirectional_range<_Base>
3074 && bidirectional_range<range_reference_t<_Base>>
3075 && common_range<range_reference_t<_Base>>
3082 friend constexpr bool
3083 operator==(
const _Iterator& __x,
const _Iterator& __y)
3084 requires _S_ref_is_glvalue
3085 && forward_range<_Base>
3086 && equality_comparable<_Inner_iter>
3088 return (__x._M_outer == __y._M_outer
3089 && __x._M_inner == __y._M_inner);
3092 friend constexpr decltype(
auto)
3093 iter_move(
const _Iterator& __i)
3094 noexcept(
noexcept(ranges::iter_move(__i._M_get_inner())))
3095 {
return ranges::iter_move(__i._M_get_inner()); }
3097 friend constexpr void
3098 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
3099 noexcept(
noexcept(ranges::iter_swap(__x._M_get_inner(), __y._M_get_inner())))
3100 requires indirectly_swappable<_Inner_iter>
3101 {
return ranges::iter_swap(__x._M_get_inner(), __y._M_get_inner()); }
3103 friend _Iterator<!_Const>;
3104 template<
bool>
friend struct _Sentinel;
3107 template<
bool _Const>
3111 using _Parent = __detail::__maybe_const_t<_Const, join_view>;
3112 using _Base = join_view::_Base<_Const>;
3114 template<
bool _Const2>
3116 __equal(
const _Iterator<_Const2>& __i)
const
3117 {
return __i._M_get_outer() == _M_end; }
3119 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
3122 _Sentinel() =
default;
3125 _Sentinel(_Parent* __parent)
3126 : _M_end(ranges::
end(__parent->_M_base))
3130 _Sentinel(_Sentinel<!_Const> __s)
3131 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
3135 template<
bool _Const2>
3136 requires sentinel_for<sentinel_t<_Base>,
3137 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
3138 friend constexpr bool
3139 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
3140 {
return __y.__equal(__x); }
3142 friend _Sentinel<!_Const>;
3145 _Vp _M_base = _Vp();
3146 [[no_unique_address]]
3147 __detail::__maybe_present_t<!forward_range<_Vp>,
3148 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_outer;
3149 [[no_unique_address]]
3150 __detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner;
3153 join_view()
requires default_initializable<_Vp> = default;
3156 join_view(_Vp __base)
3157 : _M_base(std::move(__base))
3161 base() const& requires copy_constructible<_Vp>
3171 if constexpr (forward_range<_Vp>)
3173 constexpr bool __use_const
3174 = (__detail::__simple_view<_Vp>
3175 && is_reference_v<range_reference_t<_Vp>>);
3176 return _Iterator<__use_const>{
this, ranges::begin(_M_base)};
3180 _M_outer = ranges::begin(_M_base);
3181 return _Iterator<false>{
this};
3187 requires forward_range<const _Vp>
3188 && is_reference_v<range_reference_t<const _Vp>>
3189 && input_range<range_reference_t<const _Vp>>
3191 return _Iterator<true>{
this, ranges::begin(_M_base)};
3197 if constexpr (forward_range<_Vp> && is_reference_v<_InnerRange>
3198 && forward_range<_InnerRange>
3199 && common_range<_Vp> && common_range<_InnerRange>)
3200 return _Iterator<__detail::__simple_view<_Vp>>{
this,
3201 ranges::end(_M_base)};
3203 return _Sentinel<__detail::__simple_view<_Vp>>{
this};
3208 requires forward_range<const _Vp>
3209 && is_reference_v<range_reference_t<const _Vp>>
3210 && input_range<range_reference_t<const _Vp>>
3212 if constexpr (is_reference_v<range_reference_t<const _Vp>>
3213 && forward_range<range_reference_t<const _Vp>>
3214 && common_range<const _Vp>
3215 && common_range<range_reference_t<const _Vp>>)
3216 return _Iterator<true>{
this, ranges::end(_M_base)};
3218 return _Sentinel<true>{
this};
3222 template<
typename _Range>
3223 explicit join_view(_Range&&) -> join_view<views::all_t<_Range>>;
3229 template<
typename _Range>
3230 concept __can_join_view
3234 struct _Join : __adaptor::_RangeAdaptorClosure<_Join>
3236 template<viewable_range _Range>
3237 requires __detail::__can_join_view<_Range>
3239 operator() [[nodiscard]] (_Range&& __r)
const
3246 static constexpr bool _S_has_simple_call_op =
true;
3249 inline constexpr _Join join;
3255 struct __require_constant;
3257 template<
typename _Range>
3258 concept __tiny_range = sized_range<_Range>
3260 {
typename __require_constant<remove_reference_t<_Range>::size()>; }
3261 && (remove_reference_t<_Range>::size() <= 1);
3263 template<
typename _Base>
3264 struct __lazy_split_view_outer_iter_cat
3267 template<forward_range _Base>
3268 struct __lazy_split_view_outer_iter_cat<_Base>
3269 {
using iterator_category = input_iterator_tag; };
3271 template<
typename _Base>
3272 struct __lazy_split_view_inner_iter_cat
3275 template<forward_range _Base>
3276 struct __lazy_split_view_inner_iter_cat<_Base>
3279 static constexpr auto
3282 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
3283 if constexpr (derived_from<_Cat, forward_iterator_tag>)
3284 return forward_iterator_tag{};
3289 using iterator_category =
decltype(_S_iter_cat());
3293 template<input_range _Vp, forward_range _Pattern>
3294 requires view<_Vp> && view<_Pattern>
3295 && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
3297 && (forward_range<_Vp> || __detail::__tiny_range<_Pattern>)
3298 class lazy_split_view : public
view_interface<lazy_split_view<_Vp, _Pattern>>
3301 template<
bool _Const>
3302 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
3304 template<
bool _Const>
3307 template<
bool _Const>
3309 : __detail::__lazy_split_view_outer_iter_cat<_Base<_Const>>
3312 using _Parent = __detail::__maybe_const_t<_Const, lazy_split_view>;
3313 using _Base = lazy_split_view::_Base<_Const>;
3317 {
return __current() == ranges::end(_M_parent->_M_base) && !_M_trailing_empty; }
3324 __current() noexcept
3326 if constexpr (forward_range<_Vp>)
3329 return *_M_parent->_M_current;
3333 __current() const noexcept
3335 if constexpr (forward_range<_Vp>)
3338 return *_M_parent->_M_current;
3341 _Parent* _M_parent =
nullptr;
3343 [[no_unique_address]]
3344 __detail::__maybe_present_t<forward_range<_Vp>,
3345 iterator_t<_Base>> _M_current
3346 =
decltype(_M_current)();
3347 bool _M_trailing_empty =
false;
3350 using iterator_concept = __conditional_t<forward_range<_Base>,
3351 forward_iterator_tag,
3352 input_iterator_tag>;
3354 using difference_type = range_difference_t<_Base>;
3356 struct value_type : view_interface<value_type>
3359 _OuterIter _M_i = _OuterIter();
3365 value_type(_OuterIter __i)
3366 : _M_i(std::
move(__i))
3372 constexpr _InnerIter<_Const>
3374 {
return _InnerIter<_Const>{_M_i}; }
3376 constexpr default_sentinel_t
3377 end() const noexcept
3381 _OuterIter() =
default;
3384 _OuterIter(_Parent* __parent)
requires (!forward_range<_Base>)
3385 : _M_parent(__parent)
3389 _OuterIter(_Parent* __parent, iterator_t<_Base> __current)
3390 requires forward_range<_Base>
3391 : _M_parent(__parent),
3396 _OuterIter(_OuterIter<!_Const> __i)
3398 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
3399 : _M_parent(__i._M_parent), _M_current(
std::move(__i._M_current)),
3400 _M_trailing_empty(__i._M_trailing_empty)
3403 constexpr value_type
3405 {
return value_type{*
this}; }
3407 constexpr _OuterIter&
3412 const auto __end = ranges::end(_M_parent->_M_base);
3413 if (__current() == __end)
3415 _M_trailing_empty =
false;
3418 const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern};
3419 if (__pbegin == __pend)
3421 else if constexpr (__detail::__tiny_range<_Pattern>)
3423 __current() = ranges::find(
std::move(__current()), __end,
3425 if (__current() != __end)
3428 if (__current() == __end)
3429 _M_trailing_empty =
true;
3436 = ranges::mismatch(__current(), __end, __pbegin, __pend);
3440 if (__current() == __end)
3441 _M_trailing_empty =
true;
3444 }
while (++__current() != __end);
3448 constexpr decltype(
auto)
3451 if constexpr (forward_range<_Base>)
3461 friend constexpr bool
3462 operator==(
const _OuterIter& __x,
const _OuterIter& __y)
3463 requires forward_range<_Base>
3465 return __x._M_current == __y._M_current
3466 && __x._M_trailing_empty == __y._M_trailing_empty;
3469 friend constexpr bool
3470 operator==(
const _OuterIter& __x, default_sentinel_t)
3471 {
return __x.__at_end(); };
3473 friend _OuterIter<!_Const>;
3474 friend _InnerIter<_Const>;
3477 template<
bool _Const>
3479 : __detail::__lazy_split_view_inner_iter_cat<_Base<_Const>>
3482 using _Base = lazy_split_view::_Base<_Const>;
3487 auto [__pcur, __pend] = subrange{_M_i._M_parent->_M_pattern};
3488 auto __end = ranges::end(_M_i._M_parent->_M_base);
3489 if constexpr (__detail::__tiny_range<_Pattern>)
3491 const auto& __cur = _M_i_current();
3494 if (__pcur == __pend)
3495 return _M_incremented;
3496 return *__cur == *__pcur;
3500 auto __cur = _M_i_current();
3503 if (__pcur == __pend)
3504 return _M_incremented;
3507 if (*__cur != *__pcur)
3509 if (++__pcur == __pend)
3511 }
while (++__cur != __end);
3517 _M_i_current() noexcept
3518 {
return _M_i.__current(); }
3521 _M_i_current() const noexcept
3522 {
return _M_i.__current(); }
3524 _OuterIter<_Const> _M_i = _OuterIter<_Const>();
3525 bool _M_incremented =
false;
3528 using iterator_concept
3529 =
typename _OuterIter<_Const>::iterator_concept;
3531 using value_type = range_value_t<_Base>;
3532 using difference_type = range_difference_t<_Base>;
3534 _InnerIter() =
default;
3537 _InnerIter(_OuterIter<_Const> __i)
3538 : _M_i(std::
move(__i))
3541 constexpr const iterator_t<_Base>&
3542 base() const& noexcept
3543 {
return _M_i_current(); }
3545 constexpr iterator_t<_Base>
3546 base() &&
requires forward_range<_Vp>
3549 constexpr decltype(
auto)
3551 {
return *_M_i_current(); }
3553 constexpr _InnerIter&
3556 _M_incremented =
true;
3557 if constexpr (!forward_range<_Base>)
3558 if constexpr (_Pattern::size() == 0)
3564 constexpr decltype(
auto)
3567 if constexpr (forward_range<_Base>)
3577 friend constexpr bool
3578 operator==(
const _InnerIter& __x,
const _InnerIter& __y)
3579 requires forward_range<_Base>
3580 {
return __x._M_i == __y._M_i; }
3582 friend constexpr bool
3583 operator==(
const _InnerIter& __x, default_sentinel_t)
3584 {
return __x.__at_end(); }
3586 friend constexpr decltype(
auto)
3587 iter_move(
const _InnerIter& __i)
3588 noexcept(
noexcept(ranges::iter_move(__i._M_i_current())))
3589 {
return ranges::iter_move(__i._M_i_current()); }
3591 friend constexpr void
3592 iter_swap(
const _InnerIter& __x,
const _InnerIter& __y)
3593 noexcept(
noexcept(ranges::iter_swap(__x._M_i_current(),
3594 __y._M_i_current())))
3595 requires indirectly_swappable<iterator_t<_Base>>
3596 { ranges::iter_swap(__x._M_i_current(), __y._M_i_current()); }
3599 _Vp _M_base = _Vp();
3600 _Pattern _M_pattern = _Pattern();
3601 [[no_unique_address]]
3602 __detail::__maybe_present_t<!forward_range<_Vp>,
3603 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_current;
3607 lazy_split_view()
requires (default_initializable<_Vp>
3608 && default_initializable<_Pattern>)
3612 lazy_split_view(_Vp __base, _Pattern __pattern)
3616 template<input_range _Range>
3617 requires constructible_from<_Vp, views::all_t<_Range>>
3618 && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
3620 lazy_split_view(_Range&& __r, range_value_t<_Range> __e)
3621 : _M_base(views::all(
std::
forward<_Range>(__r))),
3622 _M_pattern(views::single(
std::
move(__e)))
3626 base() const& requires copy_constructible<_Vp>
3636 if constexpr (forward_range<_Vp>)
3638 constexpr bool __simple
3639 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
3640 return _OuterIter<__simple>{
this, ranges::begin(_M_base)};
3644 _M_current = ranges::begin(_M_base);
3645 return _OuterIter<false>{
this};
3650 begin() const requires forward_range<_Vp> && forward_range<const _Vp>
3652 return _OuterIter<true>{
this, ranges::begin(_M_base)};
3656 end()
requires forward_range<_Vp> && common_range<_Vp>
3658 constexpr bool __simple
3659 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
3660 return _OuterIter<__simple>{
this, ranges::end(_M_base)};
3666 if constexpr (forward_range<_Vp>
3667 && forward_range<const _Vp>
3668 && common_range<const _Vp>)
3669 return _OuterIter<true>{
this, ranges::end(_M_base)};
3675 template<
typename _Range,
typename _Pattern>
3676 lazy_split_view(_Range&&, _Pattern&&)
3677 -> lazy_split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
3679 template<input_range _Range>
3680 lazy_split_view(_Range&&, range_value_t<_Range>)
3681 -> lazy_split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>;
3687 template<
typename _Range,
typename _Pattern>
3688 concept __can_lazy_split_view
3692 struct _LazySplit : __adaptor::_RangeAdaptor<_LazySplit>
3694 template<viewable_range _Range,
typename _Pattern>
3695 requires __detail::__can_lazy_split_view<_Range, _Pattern>
3697 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
3702 using _RangeAdaptor<_LazySplit>::operator();
3703 static constexpr int _S_arity = 2;
3708 template<
typename _Pattern>
3709 static constexpr bool _S_has_simple_extra_args
3710 = is_scalar_v<_Pattern> || (view<_Pattern>
3711 && copy_constructible<_Pattern>);
3714 inline constexpr _LazySplit lazy_split;
3717 template<forward_range _Vp, forward_range _Pattern>
3718 requires view<_Vp> && view<_Pattern>
3719 && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
3721 class split_view :
public view_interface<split_view<_Vp, _Pattern>>
3724 _Vp _M_base = _Vp();
3725 _Pattern _M_pattern = _Pattern();
3726 __detail::__non_propagating_cache<subrange<iterator_t<_Vp>>> _M_cached_begin;
3732 split_view()
requires (default_initializable<_Vp>
3733 && default_initializable<_Pattern>)
3737 split_view(_Vp __base, _Pattern __pattern)
3741 template<forward_range _Range>
3742 requires constructible_from<_Vp, views::all_t<_Range>>
3743 && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
3745 split_view(_Range&& __r, range_value_t<_Range> __e)
3746 : _M_base(views::all(std::
forward<_Range>(__r))),
3747 _M_pattern(views::single(std::
move(__e)))
3751 base() const& requires copy_constructible<_Vp>
3761 if (!_M_cached_begin)
3762 _M_cached_begin = _M_find_next(ranges::begin(_M_base));
3763 return {
this, ranges::begin(_M_base), *_M_cached_begin};
3769 if constexpr (common_range<_Vp>)
3770 return _Iterator{
this, ranges::end(_M_base), {}};
3772 return _Sentinel{
this};
3775 constexpr subrange<iterator_t<_Vp>>
3776 _M_find_next(iterator_t<_Vp> __it)
3778 auto [__b, __e] = ranges::search(subrange(__it, ranges::end(_M_base)), _M_pattern);
3779 if (__b != ranges::end(_M_base) && ranges::empty(_M_pattern))
3791 split_view* _M_parent =
nullptr;
3792 iterator_t<_Vp> _M_cur = iterator_t<_Vp>();
3793 subrange<iterator_t<_Vp>> _M_next = subrange<iterator_t<_Vp>>();
3794 bool _M_trailing_empty =
false;
3796 friend struct _Sentinel;
3799 using iterator_concept = forward_iterator_tag;
3800 using iterator_category = input_iterator_tag;
3801 using value_type = subrange<iterator_t<_Vp>>;
3802 using difference_type = range_difference_t<_Vp>;
3804 _Iterator() =
default;
3807 _Iterator(split_view* __parent,
3808 iterator_t<_Vp> __current,
3809 subrange<iterator_t<_Vp>> __next)
3810 : _M_parent(__parent),
3811 _M_cur(std::
move(__current)),
3812 _M_next(std::
move(__next))
3815 constexpr iterator_t<_Vp>
3819 constexpr value_type
3821 {
return {_M_cur, _M_next.begin()}; }
3823 constexpr _Iterator&
3826 _M_cur = _M_next.begin();
3827 if (_M_cur != ranges::end(_M_parent->_M_base))
3829 _M_cur = _M_next.end();
3830 if (_M_cur == ranges::end(_M_parent->_M_base))
3832 _M_trailing_empty =
true;
3833 _M_next = {_M_cur, _M_cur};
3836 _M_next = _M_parent->_M_find_next(_M_cur);
3839 _M_trailing_empty =
false;
3851 friend constexpr bool
3852 operator==(
const _Iterator& __x,
const _Iterator& __y)
3854 return __x._M_cur == __y._M_cur
3855 && __x._M_trailing_empty == __y._M_trailing_empty;
3862 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
3865 _M_equal(
const _Iterator& __x)
const
3866 {
return __x._M_cur == _M_end && !__x._M_trailing_empty; }
3869 _Sentinel() =
default;
3872 _Sentinel(split_view* __parent)
3873 : _M_end(ranges::
end(__parent->_M_base))
3876 friend constexpr bool
3877 operator==(
const _Iterator& __x,
const _Sentinel& __y)
3878 {
return __y._M_equal(__x); }
3882 template<
typename _Range,
typename _Pattern>
3883 split_view(_Range&&, _Pattern&&)
3884 -> split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
3886 template<forward_range _Range>
3887 split_view(_Range&&, range_value_t<_Range>)
3888 -> split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>;
3894 template<
typename _Range,
typename _Pattern>
3895 concept __can_split_view
3899 struct _Split : __adaptor::_RangeAdaptor<_Split>
3901 template<viewable_range _Range,
typename _Pattern>
3902 requires __detail::__can_split_view<_Range, _Pattern>
3904 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
3909 using _RangeAdaptor<_Split>::operator();
3910 static constexpr int _S_arity = 2;
3911 template<
typename _Pattern>
3912 static constexpr bool _S_has_simple_extra_args
3913 = _LazySplit::_S_has_simple_extra_args<_Pattern>;
3916 inline constexpr _Split split;
3923 template<input_or_output_iterator _Iter>
3925 operator() [[nodiscard]] (_Iter __i, iter_difference_t<_Iter> __n)
const
3927 if constexpr (contiguous_iterator<_Iter>)
3929 else if constexpr (random_access_iterator<_Iter>)
3930 return subrange(__i, __i + __n);
3932 return subrange(counted_iterator(
std::move(__i), __n),
3937 inline constexpr _Counted counted{};
3941 requires (!common_range<_Vp>) && copyable<iterator_t<_Vp>>
3942 class common_view : public view_interface<common_view<_Vp>>
3945 _Vp _M_base = _Vp();
3948 common_view()
requires default_initializable<_Vp> = default;
3951 common_view(_Vp __r)
3952 : _M_base(
std::move(__r))
3956 base() const& requires copy_constructible<_Vp>
3966 begin()
requires (!__detail::__simple_view<_Vp>)
3968 if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
3969 return ranges::begin(_M_base);
3971 return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
3972 (ranges::begin(_M_base));
3976 begin() const requires range<const _Vp>
3978 if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
3979 return ranges::begin(_M_base);
3981 return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
3982 (ranges::begin(_M_base));
3986 end()
requires (!__detail::__simple_view<_Vp>)
3988 if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
3989 return ranges::begin(_M_base) + ranges::size(_M_base);
3991 return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
3992 (ranges::end(_M_base));
3996 end() const requires range<const _Vp>
3998 if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
3999 return ranges::begin(_M_base) + ranges::size(_M_base);
4001 return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
4002 (ranges::end(_M_base));
4006 size()
requires sized_range<_Vp>
4007 {
return ranges::size(_M_base); }
4010 size() const requires sized_range<const _Vp>
4011 {
return ranges::size(_M_base); }
4014 template<
typename _Range>
4015 common_view(_Range&&) -> common_view<views::all_t<_Range>>;
4017 template<
typename _Tp>
4018 inline constexpr bool enable_borrowed_range<common_view<_Tp>>
4019 = enable_borrowed_range<_Tp>;
4025 template<
typename _Range>
4026 concept __already_common = common_range<_Range>
4029 template<
typename _Range>
4030 concept __can_common_view
4034 struct _Common : __adaptor::_RangeAdaptorClosure<_Common>
4036 template<viewable_range _Range>
4037 requires __detail::__already_common<_Range>
4038 || __detail::__can_common_view<_Range>
4040 operator() [[nodiscard]] (_Range&& __r)
const
4042 if constexpr (__detail::__already_common<_Range>)
4048 static constexpr bool _S_has_simple_call_op =
true;
4051 inline constexpr _Common common;
4055 requires bidirectional_range<_Vp>
4056 class reverse_view :
public view_interface<reverse_view<_Vp>>
4059 static constexpr bool _S_needs_cached_begin
4060 = !common_range<_Vp> && !(random_access_range<_Vp>
4061 && sized_sentinel_for<sentinel_t<_Vp>,
4064 _Vp _M_base = _Vp();
4065 [[no_unique_address]]
4066 __detail::__maybe_present_t<_S_needs_cached_begin,
4067 __detail::_CachedPosition<_Vp>>
4071 reverse_view()
requires default_initializable<_Vp> = default;
4074 reverse_view(_Vp __r)
4075 : _M_base(std::move(__r))
4079 base() const& requires copy_constructible<_Vp>
4086 constexpr reverse_iterator<iterator_t<_Vp>>
4089 if constexpr (_S_needs_cached_begin)
4090 if (_M_cached_begin._M_has_value())
4093 auto __it = ranges::next(ranges::begin(_M_base), ranges::end(_M_base));
4094 if constexpr (_S_needs_cached_begin)
4095 _M_cached_begin._M_set(_M_base, __it);
4100 begin()
requires common_range<_Vp>
4104 begin() const requires common_range<const _Vp>
4107 constexpr reverse_iterator<iterator_t<_Vp>>
4112 end() const requires common_range<const _Vp>
4116 size()
requires sized_range<_Vp>
4117 {
return ranges::size(_M_base); }
4120 size() const requires sized_range<const _Vp>
4121 {
return ranges::size(_M_base); }
4124 template<
typename _Range>
4125 reverse_view(_Range&&) -> reverse_view<views::all_t<_Range>>;
4127 template<
typename _Tp>
4128 inline constexpr bool enable_borrowed_range<reverse_view<_Tp>>
4129 = enable_borrowed_range<_Tp>;
4136 inline constexpr bool __is_reversible_subrange =
false;
4138 template<
typename _Iter, subrange_kind _Kind>
4139 inline constexpr bool
4140 __is_reversible_subrange<subrange<reverse_iterator<_Iter>,
4141 reverse_iterator<_Iter>,
4145 inline constexpr bool __is_reverse_view =
false;
4147 template<
typename _Vp>
4148 inline constexpr bool __is_reverse_view<reverse_view<_Vp>> =
true;
4150 template<
typename _Range>
4151 concept __can_reverse_view
4155 struct _Reverse : __adaptor::_RangeAdaptorClosure<_Reverse>
4157 template<viewable_range _Range>
4158 requires __detail::__is_reverse_view<remove_cvref_t<_Range>>
4159 || __detail::__is_reversible_subrange<remove_cvref_t<_Range>>
4160 || __detail::__can_reverse_view<_Range>
4162 operator() [[nodiscard]] (_Range&& __r)
const
4164 using _Tp = remove_cvref_t<_Range>;
4165 if constexpr (__detail::__is_reverse_view<_Tp>)
4167#ifdef __cpp_lib_optional_range_support
4168 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
4171 else if constexpr (__detail::__is_reversible_subrange<_Tp>)
4173 using _Iter =
decltype(ranges::begin(__r).base());
4174 if constexpr (sized_range<_Tp>)
4175 return subrange<_Iter, _Iter, subrange_kind::sized>
4176 {__r.end().base(), __r.begin().base(), __r.size()};
4178 return subrange<_Iter, _Iter, subrange_kind::unsized>
4179 {__r.end().base(), __r.begin().base()};
4185 static constexpr bool _S_has_simple_call_op =
true;
4188 inline constexpr _Reverse reverse;
4193#if __cpp_lib_tuple_like
4194 template<
typename _Tp,
size_t _Nm>
4195 concept __has_tuple_element = __tuple_like<_Tp> && _Nm < tuple_size_v<_Tp>;
4197 template<
typename _Tp,
size_t _Nm>
4198 concept __has_tuple_element =
requires(_Tp __t)
4200 typename tuple_size<_Tp>::type;
4201 requires _Nm < tuple_size_v<_Tp>;
4202 typename tuple_element_t<_Nm, _Tp>;
4203 { std::get<_Nm>(__t) }
4204 -> convertible_to<const tuple_element_t<_Nm, _Tp>&>;
4208 template<
typename _Tp,
size_t _Nm>
4209 concept __returnable_element
4210 = is_reference_v<_Tp> || move_constructible<tuple_element_t<_Nm, _Tp>>;
4213 template<input_range _Vp,
size_t _Nm>
4215 && __detail::__has_tuple_element<range_value_t<_Vp>, _Nm>
4216 && __detail::__has_tuple_element<remove_reference_t<range_reference_t<_Vp>>,
4218 && __detail::__returnable_element<range_reference_t<_Vp>, _Nm>
4219 class elements_view :
public view_interface<elements_view<_Vp, _Nm>>
4222 elements_view()
requires default_initializable<_Vp> = default;
4225 elements_view(_Vp __base)
4226 : _M_base(std::move(__base))
4230 base() const& requires copy_constructible<_Vp>
4238 begin()
requires (!__detail::__simple_view<_Vp>)
4239 {
return _Iterator<false>(ranges::begin(_M_base)); }
4242 begin() const requires range<const _Vp>
4243 {
return _Iterator<true>(ranges::begin(_M_base)); }
4246 end()
requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>)
4247 {
return _Sentinel<false>{ranges::end(_M_base)}; }
4250 end()
requires (!__detail::__simple_view<_Vp> && common_range<_Vp>)
4251 {
return _Iterator<false>{ranges::end(_M_base)}; }
4254 end() const requires range<const _Vp>
4255 {
return _Sentinel<true>{ranges::end(_M_base)}; }
4258 end() const requires common_range<const _Vp>
4259 {
return _Iterator<true>{ranges::end(_M_base)}; }
4262 size()
requires sized_range<_Vp>
4263 {
return ranges::size(_M_base); }
4266 size() const requires sized_range<const _Vp>
4267 {
return ranges::size(_M_base); }
4270 template<
bool _Const>
4271 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
4273 template<
bool _Const>
4277 template<
bool _Const>
4278 requires forward_range<_Base<_Const>>
4279 struct __iter_cat<_Const>
4282 static auto _S_iter_cat()
4284 using _Base = elements_view::_Base<_Const>;
4285 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
4286 using _Res =
decltype((std::get<_Nm>(*
std::declval<iterator_t<_Base>>())));
4287 if constexpr (!is_lvalue_reference_v<_Res>)
4288 return input_iterator_tag{};
4289 else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
4290 return random_access_iterator_tag{};
4295 using iterator_category =
decltype(_S_iter_cat());
4298 template<
bool _Const>
4301 template<
bool _Const>
4302 struct _Iterator : __iter_cat<_Const>
4305 using _Base = elements_view::_Base<_Const>;
4307 iterator_t<_Base> _M_current = iterator_t<_Base>();
4309 static constexpr decltype(
auto)
4310 _S_get_element(
const iterator_t<_Base>& __i)
4312 if constexpr (is_reference_v<range_reference_t<_Base>>)
4313 return std::get<_Nm>(*__i);
4316 using _Et = remove_cv_t<tuple_element_t<_Nm, range_reference_t<_Base>>>;
4317 return static_cast<_Et
>(std::get<_Nm>(*__i));
4324 if constexpr (random_access_range<_Base>)
4325 return random_access_iterator_tag{};
4326 else if constexpr (bidirectional_range<_Base>)
4327 return bidirectional_iterator_tag{};
4328 else if constexpr (forward_range<_Base>)
4329 return forward_iterator_tag{};
4331 return input_iterator_tag{};
4334 friend _Iterator<!_Const>;
4337 using iterator_concept =
decltype(_S_iter_concept());
4340 = remove_cvref_t<tuple_element_t<_Nm, range_value_t<_Base>>>;
4341 using difference_type = range_difference_t<_Base>;
4343 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
4346 _Iterator(iterator_t<_Base> __current)
4347 : _M_current(std::move(__current))
4351 _Iterator(_Iterator<!_Const> __i)
4352 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
4356 constexpr const iterator_t<_Base>&
4357 base() const& noexcept
4358 {
return _M_current; }
4360 constexpr iterator_t<_Base>
4364 constexpr decltype(
auto)
4366 {
return _S_get_element(_M_current); }
4368 constexpr _Iterator&
4380 operator++(
int)
requires forward_range<_Base>
4387 constexpr _Iterator&
4388 operator--()
requires bidirectional_range<_Base>
4395 operator--(
int)
requires bidirectional_range<_Base>
4402 constexpr _Iterator&
4403 operator+=(difference_type __n)
4404 requires random_access_range<_Base>
4410 constexpr _Iterator&
4411 operator-=(difference_type __n)
4412 requires random_access_range<_Base>
4418 constexpr decltype(
auto)
4419 operator[](difference_type __n)
const
4420 requires random_access_range<_Base>
4421 {
return _S_get_element(_M_current + __n); }
4423 friend constexpr bool
4424 operator==(
const _Iterator& __x,
const _Iterator& __y)
4425 requires equality_comparable<iterator_t<_Base>>
4426 {
return __x._M_current == __y._M_current; }
4428 friend constexpr bool
4429 operator<(
const _Iterator& __x,
const _Iterator& __y)
4430 requires random_access_range<_Base>
4431 {
return __x._M_current < __y._M_current; }
4433 friend constexpr bool
4434 operator>(
const _Iterator& __x,
const _Iterator& __y)
4435 requires random_access_range<_Base>
4436 {
return __y._M_current < __x._M_current; }
4438 friend constexpr bool
4439 operator<=(
const _Iterator& __x,
const _Iterator& __y)
4440 requires random_access_range<_Base>
4441 {
return !(__y._M_current > __x._M_current); }
4443 friend constexpr bool
4444 operator>=(
const _Iterator& __x,
const _Iterator& __y)
4445 requires random_access_range<_Base>
4446 {
return !(__x._M_current > __y._M_current); }
4448#ifdef __cpp_lib_three_way_comparison
4449 friend constexpr auto
4450 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
4451 requires random_access_range<_Base>
4452 && three_way_comparable<iterator_t<_Base>>
4453 {
return __x._M_current <=> __y._M_current; }
4456 friend constexpr _Iterator
4457 operator+(
const _Iterator& __x, difference_type __y)
4458 requires random_access_range<_Base>
4459 {
return _Iterator{__x} += __y; }
4461 friend constexpr _Iterator
4462 operator+(difference_type __x,
const _Iterator& __y)
4463 requires random_access_range<_Base>
4464 {
return __y + __x; }
4466 friend constexpr _Iterator
4467 operator-(
const _Iterator& __x, difference_type __y)
4468 requires random_access_range<_Base>
4469 {
return _Iterator{__x} -= __y; }
4473 friend constexpr difference_type
4474 operator-(
const _Iterator& __x,
const _Iterator& __y)
4475 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
4476 {
return __x._M_current - __y._M_current; }
4478 template <
bool>
friend struct _Sentinel;
4481 template<
bool _Const>
4485 template<
bool _Const2>
4487 _M_equal(
const _Iterator<_Const2>& __x)
const
4488 {
return __x._M_current == _M_end; }
4490 template<
bool _Const2>
4492 _M_distance_from(
const _Iterator<_Const2>& __i)
const
4493 {
return _M_end - __i._M_current; }
4495 using _Base = elements_view::_Base<_Const>;
4496 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
4499 _Sentinel() =
default;
4502 _Sentinel(sentinel_t<_Base> __end)
4503 : _M_end(std::
move(__end))
4507 _Sentinel(_Sentinel<!_Const> __other)
4509 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
4513 constexpr sentinel_t<_Base>
4517 template<
bool _Const2>
4518 requires sentinel_for<sentinel_t<_Base>,
4519 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
4520 friend constexpr bool
4521 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
4522 {
return __y._M_equal(__x); }
4524 template<
bool _Const2,
4525 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
4526 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
4527 friend constexpr range_difference_t<_Base2>
4528 operator-(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
4529 {
return -__y._M_distance_from(__x); }
4531 template<
bool _Const2,
4532 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
4533 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
4534 friend constexpr range_difference_t<_Base2>
4535 operator-(
const _Sentinel& __x,
const _Iterator<_Const2>& __y)
4536 {
return __x._M_distance_from(__y); }
4538 friend _Sentinel<!_Const>;
4541 _Vp _M_base = _Vp();
4544 template<
typename _Tp,
size_t _Nm>
4545 inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>>
4546 = enable_borrowed_range<_Tp>;
4550 template<
typename _Range>
4551 using keys_view = elements_view<_Range, 0>;
4553 template<
typename _Range>
4554 using values_view = elements_view<_Range, 1>;
4560 template<
size_t _Nm,
typename _Range>
4561 concept __can_elements_view
4565 template<
size_t _Nm>
4566 struct _Elements : __adaptor::_RangeAdaptorClosure<_Elements<_Nm>>
4568 template<viewable_range _Range>
4569 requires __detail::__can_elements_view<_Nm, _Range>
4571 operator() [[nodiscard]] (_Range&& __r)
const
4576 static constexpr bool _S_has_simple_call_op =
true;
4579 template<
size_t _Nm>
4580 inline constexpr _Elements<_Nm> elements;
4581 inline constexpr auto keys = elements<0>;
4582 inline constexpr auto values = elements<1>;
4585#ifdef __cpp_lib_ranges_zip
4588 template<
typename... _Rs>
4589 concept __zip_is_common = (
sizeof...(_Rs) == 1 && (common_range<_Rs> && ...))
4590 || (!(bidirectional_range<_Rs> && ...) && (common_range<_Rs> && ...))
4591 || ((random_access_range<_Rs> && ...) && (sized_range<_Rs> && ...));
4593 template<
typename _Fp,
typename _Tuple>
4595 __tuple_transform(_Fp&& __f, _Tuple&& __tuple)
4597 return std::apply([&]<
typename... _Ts>(_Ts&&... __elts) {
4598 return tuple<invoke_result_t<_Fp&, _Ts>...>
4603 template<
typename _Fp,
typename _Tuple>
4605 __tuple_for_each(_Fp&& __f, _Tuple&& __tuple)
4607 std::apply([&]<
typename... _Ts>(_Ts&&... __elts) {
4613 template<input_range... _Vs>
4614 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
4615 class zip_view : public view_interface<zip_view<_Vs...>>
4617 tuple<_Vs...> _M_views;
4619 template<
bool>
class _Iterator;
4620 template<
bool>
class _Sentinel;
4623 zip_view() =
default;
4626 zip_view(_Vs... __views)
4627 : _M_views(
std::
move(__views)...)
4631 begin()
requires (!(__detail::__simple_view<_Vs> && ...))
4632 {
return _Iterator<false>(__detail::__tuple_transform(ranges::begin, _M_views)); }
4635 begin() const requires (range<const _Vs> && ...)
4636 {
return _Iterator<true>(__detail::__tuple_transform(ranges::begin, _M_views)); }
4639 end()
requires (!(__detail::__simple_view<_Vs> && ...))
4641 if constexpr (!__detail::__zip_is_common<_Vs...>)
4642 return _Sentinel<false>(__detail::__tuple_transform(ranges::end, _M_views));
4643 else if constexpr ((random_access_range<_Vs> && ...))
4644 return begin() + iter_difference_t<_Iterator<false>>(
size());
4646 return _Iterator<false>(__detail::__tuple_transform(ranges::end, _M_views));
4650 end() const requires (range<const _Vs> && ...)
4652 if constexpr (!__detail::__zip_is_common<
const _Vs...>)
4653 return _Sentinel<true>(__detail::__tuple_transform(ranges::end, _M_views));
4654 else if constexpr ((random_access_range<const _Vs> && ...))
4655 return begin() + iter_difference_t<_Iterator<true>>(
size());
4657 return _Iterator<true>(__detail::__tuple_transform(ranges::end, _M_views));
4661 size()
requires (sized_range<_Vs> && ...)
4663 return std::apply([](
auto... sizes) {
4664 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(sizes)...>>;
4665 return ranges::min({_CT(sizes)...});
4666 }, __detail::__tuple_transform(ranges::size, _M_views));
4670 size() const requires (sized_range<const _Vs> && ...)
4672 return std::apply([](
auto... sizes) {
4673 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(sizes)...>>;
4674 return ranges::min({_CT(sizes)...});
4675 }, __detail::__tuple_transform(ranges::size, _M_views));
4679 template<
typename... _Rs>
4680 zip_view(_Rs&&...) -> zip_view<views::all_t<_Rs>...>;
4682 template<
typename... _Views>
4683 inline constexpr bool enable_borrowed_range<zip_view<_Views...>>
4684 = (enable_borrowed_range<_Views> && ...);
4688 template<
bool _Const,
typename... _Vs>
4689 concept __all_random_access
4690 = (random_access_range<__maybe_const_t<_Const, _Vs>> && ...);
4692 template<
bool _Const,
typename... _Vs>
4693 concept __all_bidirectional
4694 = (bidirectional_range<__maybe_const_t<_Const, _Vs>> && ...);
4696 template<
bool _Const,
typename... _Vs>
4697 concept __all_forward
4698 = (forward_range<__maybe_const_t<_Const, _Vs>> && ...);
4700 template<
bool _Const,
typename... _Views>
4701 struct __zip_view_iter_cat
4704 template<
bool _Const,
typename... _Views>
4705 requires __all_forward<_Const, _Views...>
4706 struct __zip_view_iter_cat<_Const, _Views...>
4707 {
using iterator_category = input_iterator_tag; };
4710 template<input_range... _Vs>
4711 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
4712 template<bool _Const>
4713 class zip_view<_Vs...>::_Iterator
4714 : public __detail::__zip_view_iter_cat<_Const, _Vs...>
4716#ifdef _GLIBCXX_CLANG
4719 tuple<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_current;
4722 _Iterator(
decltype(_M_current) __current)
4723 : _M_current(
std::
move(__current))
4729 if constexpr (__detail::__all_random_access<_Const, _Vs...>)
4730 return random_access_iterator_tag{};
4731 else if constexpr (__detail::__all_bidirectional<_Const, _Vs...>)
4732 return bidirectional_iterator_tag{};
4733 else if constexpr (__detail::__all_forward<_Const, _Vs...>)
4734 return forward_iterator_tag{};
4736 return input_iterator_tag{};
4739#ifndef _GLIBCXX_CLANG
4740 template<move_constructible _Fp, input_range... _Ws>
4741 requires (view<_Ws> && ...) && (
sizeof...(_Ws) > 0) && is_object_v<_Fp>
4742 && regular_invocable<_Fp&, range_reference_t<_Ws>...>
4743 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Ws>...>>
4744 friend class zip_transform_view;
4749 using iterator_concept =
decltype(_S_iter_concept());
4751 = tuple<range_value_t<__detail::__maybe_const_t<_Const, _Vs>>...>;
4752 using difference_type
4753 = common_type_t<range_difference_t<__detail::__maybe_const_t<_Const, _Vs>>...>;
4755 _Iterator() =
default;
4758 _Iterator(_Iterator<!_Const> __i)
4760 && (convertible_to<iterator_t<_Vs>,
4761 iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4762 : _M_current(
std::
move(__i._M_current))
4768 auto __f = [](
auto& __i) ->
decltype(
auto) {
4771 return __detail::__tuple_transform(__f, _M_current);
4774 constexpr _Iterator&
4777 __detail::__tuple_for_each([](
auto& __i) { ++__i; }, _M_current);
4787 requires __detail::__all_forward<_Const, _Vs...>
4794 constexpr _Iterator&
4796 requires __detail::__all_bidirectional<_Const, _Vs...>
4798 __detail::__tuple_for_each([](
auto& __i) { --__i; }, _M_current);
4804 requires __detail::__all_bidirectional<_Const, _Vs...>
4811 constexpr _Iterator&
4812 operator+=(difference_type __x)
4813 requires __detail::__all_random_access<_Const, _Vs...>
4815 auto __f = [&]<
typename _It>(_It& __i) {
4816 __i += iter_difference_t<_It>(__x);
4818 __detail::__tuple_for_each(__f, _M_current);
4822 constexpr _Iterator&
4823 operator-=(difference_type __x)
4824 requires __detail::__all_random_access<_Const, _Vs...>
4826 auto __f = [&]<
typename _It>(_It& __i) {
4827 __i -= iter_difference_t<_It>(__x);
4829 __detail::__tuple_for_each(__f, _M_current);
4834 operator[](difference_type __n)
const
4835 requires __detail::__all_random_access<_Const, _Vs...>
4837 auto __f = [&]<
typename _It>(_It& __i) ->
decltype(
auto) {
4838 return __i[iter_difference_t<_It>(__n)];
4840 return __detail::__tuple_transform(__f, _M_current);
4843 friend constexpr bool
4844 operator==(
const _Iterator& __x,
const _Iterator& __y)
4845 requires (equality_comparable<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4847 if constexpr (__detail::__all_bidirectional<_Const, _Vs...>)
4848 return __x._M_current == __y._M_current;
4851 return ((std::get<_Is>(__x._M_current) == std::get<_Is>(__y._M_current)) || ...);
4855 friend constexpr auto
4856 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
4857 requires __detail::__all_random_access<_Const, _Vs...>
4858 {
return __x._M_current <=> __y._M_current; }
4860 friend constexpr _Iterator
4861 operator+(
const _Iterator& __i, difference_type __n)
4862 requires __detail::__all_random_access<_Const, _Vs...>
4869 friend constexpr _Iterator
4870 operator+(difference_type __n,
const _Iterator& __i)
4871 requires __detail::__all_random_access<_Const, _Vs...>
4878 friend constexpr _Iterator
4879 operator-(
const _Iterator& __i, difference_type __n)
4880 requires __detail::__all_random_access<_Const, _Vs...>
4887 friend constexpr difference_type
4888 operator-(
const _Iterator& __x,
const _Iterator& __y)
4889 requires (sized_sentinel_for<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>,
4890 iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4893 return ranges::min({difference_type(std::get<_Is>(__x._M_current)
4894 - std::get<_Is>(__y._M_current))...},
4896 [](difference_type __i) {
4897 return __detail::__to_unsigned_like(__i < 0 ? -__i : __i);
4902 friend constexpr auto
4903 iter_move(
const _Iterator& __i)
4904 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
4906 friend constexpr void
4907 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
4908 requires (indirectly_swappable<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4911 (ranges::iter_swap(std::get<_Is>(__l._M_current), std::get<_Is>(__r._M_current)), ...);
4915 friend class zip_view;
4918 template<input_range... _Vs>
4919 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
4920 template<bool _Const>
4921 class zip_view<_Vs...>::_Sentinel
4923 tuple<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_end;
4926 _Sentinel(
decltype(_M_end) __end)
4930 friend class zip_view;
4933 _Sentinel() =
default;
4936 _Sentinel(_Sentinel<!_Const> __i)
4938 && (convertible_to<sentinel_t<_Vs>,
4939 sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4940 : _M_end(
std::
move(__i._M_end))
4943 template<
bool _OtherConst>
4944 requires (sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
4945 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
4946 friend constexpr bool
4947 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
4950 return ((std::get<_Is>(__x._M_current) == std::get<_Is>(__y._M_end)) || ...);
4954 template<
bool _OtherConst>
4955 requires (sized_sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
4956 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
4957 friend constexpr auto
4958 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
4961 = common_type_t<range_difference_t<__detail::__maybe_const_t<_OtherConst, _Vs>>...>;
4963 return ranges::min({_Ret(std::get<_Is>(__x._M_current) - std::get<_Is>(__y._M_end))...},
4966 return __detail::__to_unsigned_like(__i < 0 ? -__i : __i);
4971 template<
bool _OtherConst>
4972 requires (sized_sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
4973 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
4974 friend constexpr auto
4975 operator-(
const _Sentinel& __y,
const _Iterator<_OtherConst>& __x)
4976 {
return -(__x - __y); }
4983 template<
typename... _Ts>
4984 concept __can_zip_view
4990 template<
typename... _Ts>
4991 requires (
sizeof...(_Ts) == 0 || __detail::__can_zip_view<_Ts...>)
4993 operator() [[nodiscard]] (_Ts&&... __ts)
const
4995 if constexpr (
sizeof...(_Ts) == 0)
4996 return views::empty<tuple<>>;
5002 inline constexpr _Zip zip;
5007 template<
typename _Range,
bool _Const>
5008 using __range_iter_cat
5009 =
typename iterator_traits<iterator_t<__maybe_const_t<_Const, _Range>>>::iterator_category;
5012 template<move_constructible _Fp, input_range... _Vs>
5013 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5014 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5015 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5016 class zip_transform_view : public view_interface<zip_transform_view<_Fp, _Vs...>>
5018 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
5019 zip_view<_Vs...> _M_zip;
5021 using _InnerView = zip_view<_Vs...>;
5023 template<
bool _Const>
5024 using __ziperator = iterator_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5026 template<
bool _Const>
5027 using __zentinel = sentinel_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5029 template<
bool _Const>
5030 using _Base = __detail::__maybe_const_t<_Const, _InnerView>;
5032 template<
bool _Const>
5036 template<
bool _Const>
5037 requires forward_range<_Base<_Const>>
5038 struct __iter_cat<_Const>
5044 using __detail::__maybe_const_t;
5045 using __detail::__range_iter_cat;
5046 using _Res = invoke_result_t<__maybe_const_t<_Const, _Fp>&,
5047 range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
5050 if constexpr (!is_reference_v<_Res>)
5051 return input_iterator_tag{};
5052 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5053 random_access_iterator_tag> && ...))
5054 return random_access_iterator_tag{};
5055 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5056 bidirectional_iterator_tag> && ...))
5057 return bidirectional_iterator_tag{};
5058 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5059 forward_iterator_tag> && ...))
5060 return forward_iterator_tag{};
5062 return input_iterator_tag{};
5065 using iterator_category =
decltype(_S_iter_cat());
5068 template<
bool>
class _Iterator;
5069 template<
bool>
class _Sentinel;
5072 zip_transform_view() =
default;
5075 zip_transform_view(_Fp __fun, _Vs... __views)
5081 {
return _Iterator<false>(*
this, _M_zip.begin()); }
5085 requires range<const _InnerView>
5086 && regular_invocable<const _Fp&, range_reference_t<const _Vs>...>
5087 {
return _Iterator<true>(*
this, _M_zip.begin()); }
5092 if constexpr (common_range<_InnerView>)
5093 return _Iterator<false>(*
this, _M_zip.end());
5095 return _Sentinel<false>(_M_zip.end());
5100 requires range<const _InnerView>
5101 && regular_invocable<const _Fp&, range_reference_t<const _Vs>...>
5103 if constexpr (common_range<const _InnerView>)
5104 return _Iterator<true>(*
this, _M_zip.end());
5106 return _Sentinel<true>(_M_zip.end());
5110 size()
requires sized_range<_InnerView>
5111 {
return _M_zip.size(); }
5114 size() const requires sized_range<const _InnerView>
5115 {
return _M_zip.size(); }
5118 template<
class _Fp,
class... Rs>
5119 zip_transform_view(_Fp, Rs&&...) -> zip_transform_view<_Fp, views::all_t<Rs>...>;
5121 template<move_constructible _Fp, input_range... _Vs>
5122 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5123 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5124 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5125 template<bool _Const>
5126 class zip_transform_view<_Fp, _Vs...>::_Iterator : public __iter_cat<_Const>
5128 using _Parent = __detail::__maybe_const_t<_Const, zip_transform_view>;
5130 _Parent* _M_parent =
nullptr;
5131 __ziperator<_Const> _M_inner;
5134 _Iterator(_Parent& __parent, __ziperator<_Const> __inner)
5138 friend class zip_transform_view;
5142 using iterator_concept =
typename __ziperator<_Const>::iterator_concept;
5144 = remove_cvref_t<invoke_result_t<__detail::__maybe_const_t<_Const, _Fp>&,
5145 range_reference_t<__detail::__maybe_const_t<_Const, _Vs>>...>>;
5146 using difference_type = range_difference_t<_Base<_Const>>;
5148 _Iterator() =
default;
5151 _Iterator(_Iterator<!_Const> __i)
5152 requires _Const && convertible_to<__ziperator<false>, __ziperator<_Const>>
5153 : _M_parent(__i._M_parent), _M_inner(
std::move(__i._M_inner))
5156 constexpr decltype(
auto)
5159 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
5161 }, _M_inner._M_current);
5164 constexpr _Iterator&
5176 operator++(
int)
requires forward_range<_Base<_Const>>
5183 constexpr _Iterator&
5184 operator--()
requires bidirectional_range<_Base<_Const>>
5191 operator--(
int)
requires bidirectional_range<_Base<_Const>>
5198 constexpr _Iterator&
5199 operator+=(difference_type __x)
requires random_access_range<_Base<_Const>>
5205 constexpr _Iterator&
5206 operator-=(difference_type __x)
requires random_access_range<_Base<_Const>>
5212 constexpr decltype(
auto)
5213 operator[](difference_type __n)
const requires random_access_range<_Base<_Const>>
5215 return std::apply([&]<
typename... _Is>(
const _Is&... __iters) ->
decltype(
auto) {
5216 return std::__invoke(*_M_parent->_M_fun, __iters[iter_difference_t<_Is>(__n)]...);
5217 }, _M_inner._M_current);
5220 friend constexpr bool
5221 operator==(
const _Iterator& __x,
const _Iterator& __y)
5222 requires equality_comparable<__ziperator<_Const>>
5223 {
return __x._M_inner == __y._M_inner; }
5225 friend constexpr auto
5226 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5227 requires random_access_range<_Base<_Const>>
5228 {
return __x._M_inner <=> __y._M_inner; }
5230 friend constexpr _Iterator
5231 operator+(
const _Iterator& __i, difference_type __n)
5232 requires random_access_range<_Base<_Const>>
5233 {
return _Iterator(*__i._M_parent, __i._M_inner + __n); }
5235 friend constexpr _Iterator
5236 operator+(difference_type __n,
const _Iterator& __i)
5237 requires random_access_range<_Base<_Const>>
5238 {
return _Iterator(*__i._M_parent, __i._M_inner + __n); }
5240 friend constexpr _Iterator
5241 operator-(
const _Iterator& __i, difference_type __n)
5242 requires random_access_range<_Base<_Const>>
5243 {
return _Iterator(*__i._M_parent, __i._M_inner - __n); }
5245 friend constexpr difference_type
5246 operator-(
const _Iterator& __x,
const _Iterator& __y)
5247 requires sized_sentinel_for<__ziperator<_Const>, __ziperator<_Const>>
5248 {
return __x._M_inner - __y._M_inner; }
5251 template<move_constructible _Fp, input_range... _Vs>
5252 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5253 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5254 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5255 template<bool _Const>
5256 class zip_transform_view<_Fp, _Vs...>::_Sentinel
5258 __zentinel<_Const> _M_inner;
5261 _Sentinel(__zentinel<_Const> __inner)
5265 friend class zip_transform_view;
5268 _Sentinel() =
default;
5271 _Sentinel(_Sentinel<!_Const> __i)
5272 requires _Const && convertible_to<__zentinel<false>, __zentinel<_Const>>
5276 template<
bool _OtherConst>
5277 requires sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5278 friend constexpr bool
5279 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5280 {
return __x._M_inner == __y._M_inner; }
5282 template<
bool _OtherConst>
5283 requires sized_sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5284 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
5285 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5286 {
return __x._M_inner - __y._M_inner; }
5288 template<
bool _OtherConst>
5289 requires sized_sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5290 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
5291 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
5292 {
return __x._M_inner - __y._M_inner; }
5299 template<
typename _Fp,
typename... _Ts>
5300 concept __can_zip_transform_view
5304 struct _ZipTransform
5306 template<
typename _Fp>
5307 requires move_constructible<decay_t<_Fp>> && regular_invocable<decay_t<_Fp>&>
5308 && is_object_v<decay_t<invoke_result_t<decay_t<_Fp>&>>>
5310 operator() [[nodiscard]] (_Fp&&)
const
5312 return views::empty<decay_t<invoke_result_t<decay_t<_Fp>&>>>;
5315 template<
typename _Fp,
typename... _Ts>
5316 requires (
sizeof...(_Ts) != 0) && __detail::__can_zip_transform_view<_Fp, _Ts...>
5318 operator() [[nodiscard]] (_Fp&& __f, _Ts&&... __ts)
const
5324 inline constexpr _ZipTransform zip_transform;
5327 template<forward_range _Vp,
size_t _Nm>
5328 requires view<_Vp> && (_Nm > 0)
5329 class adjacent_view : public view_interface<adjacent_view<_Vp, _Nm>>
5331 _Vp _M_base = _Vp();
5333 template<
bool>
class _Iterator;
5334 template<
bool>
class _Sentinel;
5336 struct __as_sentinel
5340 adjacent_view()
requires default_initializable<_Vp> = default;
5343 adjacent_view(_Vp __base)
5344 : _M_base(
std::move(__base))
5350 base() const & requires copy_constructible<_Vp>
5358 begin()
requires (!__detail::__simple_view<_Vp>)
5359 {
return _Iterator<false>(ranges::begin(_M_base), ranges::end(_M_base)); }
5362 begin() const requires range<const _Vp>
5363 {
return _Iterator<true>(ranges::begin(_M_base), ranges::end(_M_base)); }
5366 end()
requires (!__detail::__simple_view<_Vp>)
5368 if constexpr (common_range<_Vp>)
5369 return _Iterator<false>(__as_sentinel{}, ranges::begin(_M_base), ranges::end(_M_base));
5371 return _Sentinel<false>(ranges::end(_M_base));
5375 end() const requires range<const _Vp>
5377 if constexpr (common_range<const _Vp>)
5378 return _Iterator<true>(__as_sentinel{}, ranges::begin(_M_base), ranges::end(_M_base));
5380 return _Sentinel<true>(ranges::end(_M_base));
5384 size()
requires sized_range<_Vp>
5386 using _ST =
decltype(ranges::size(_M_base));
5387 using _CT = common_type_t<_ST, size_t>;
5388 auto __sz =
static_cast<_CT
>(ranges::size(_M_base));
5390 return static_cast<_ST
>(__sz);
5394 size() const requires sized_range<const _Vp>
5396 using _ST =
decltype(ranges::size(_M_base));
5397 using _CT = common_type_t<_ST, size_t>;
5398 auto __sz =
static_cast<_CT
>(ranges::size(_M_base));
5400 return static_cast<_ST
>(__sz);
5404 template<
typename _Vp,
size_t _Nm>
5405 inline constexpr bool enable_borrowed_range<adjacent_view<_Vp, _Nm>>
5406 = enable_borrowed_range<_Vp>;
5411 template<
typename _Tp,
size_t _Nm>
5412 using __repeated_tuple =
typename __make_tuple<array<_Tp, _Nm>>::__type;
5416 template<
typename _Fp,
size_t _Nm>
5419 template<
typename... _Ts>
5420 static invoke_result_t<_Fp, _Ts...>
5421 __tuple_apply(
const tuple<_Ts...>&);
5423 template<
typename _Tp>
5424 decltype(__tuple_apply(
std::declval<__repeated_tuple<_Tp, _Nm>>()))
5429 template<forward_range _Vp,
size_t _Nm>
5430 requires view<_Vp> && (_Nm > 0)
5431 template<bool _Const>
5432 class adjacent_view<_Vp, _Nm>::_Iterator
5434#ifdef _GLIBCXX_CLANG
5437 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5438 array<iterator_t<_Base>, _Nm> _M_current = array<iterator_t<_Base>, _Nm>();
5441 _Iterator(iterator_t<_Base> __first, sentinel_t<_Base> __last)
5443 for (
auto& __i : _M_current)
5446 ranges::advance(__first, 1, __last);
5451 _Iterator(__as_sentinel, iterator_t<_Base> __first, iterator_t<_Base> __last)
5453 if constexpr (!bidirectional_range<_Base>)
5454 for (
auto& __it : _M_current)
5457 for (
size_t __i = 0; __i < _Nm; ++__i)
5459 _M_current[_Nm - 1 - __i] = __last;
5460 ranges::advance(__last, -1, __first);
5467 if constexpr (random_access_range<_Base>)
5468 return random_access_iterator_tag{};
5469 else if constexpr (bidirectional_range<_Base>)
5470 return bidirectional_iterator_tag{};
5472 return forward_iterator_tag{};
5475 friend class adjacent_view;
5477#ifndef _GLIBCXX_CLANG
5478 template<forward_range _Wp, move_constructible _Fp,
size_t _Mm>
5479 requires view<_Wp> && (_Mm > 0) && is_object_v<_Fp>
5480 && regular_invocable<__detail::__unarize<_Fp&, _Mm>, range_reference_t<_Wp>>
5481 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Mm>,
5482 range_reference_t<_Wp>>>
5483 friend class adjacent_transform_view;
5487 using iterator_category = input_iterator_tag;
5488 using iterator_concept =
decltype(_S_iter_concept());
5489 using value_type = __detail::__repeated_tuple<range_value_t<_Base>, _Nm>;
5490 using difference_type = range_difference_t<_Base>;
5492 _Iterator() =
default;
5495 _Iterator(_Iterator<!_Const> __i)
5496 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
5498 for (
size_t __j = 0; __j < _Nm; ++__j)
5499 _M_current[__j] =
std::move(__i._M_current[__j]);
5505 auto __f = [](
auto& __i) ->
decltype(
auto) {
return *__i; };
5506 return __detail::__tuple_transform(__f, _M_current);
5509 constexpr _Iterator&
5512 for (
auto& __i : _M_current)
5525 constexpr _Iterator&
5526 operator--()
requires bidirectional_range<_Base>
5528 for (
auto& __i : _M_current)
5534 operator--(
int)
requires bidirectional_range<_Base>
5541 constexpr _Iterator&
5542 operator+=(difference_type __x)
5543 requires random_access_range<_Base>
5545 for (
auto& __i : _M_current)
5550 constexpr _Iterator&
5551 operator-=(difference_type __x)
5552 requires random_access_range<_Base>
5554 for (
auto& __i : _M_current)
5560 operator[](difference_type __n)
const
5561 requires random_access_range<_Base>
5563 auto __f = [&](
auto& __i) ->
decltype(
auto) {
return __i[__n]; };
5564 return __detail::__tuple_transform(__f, _M_current);
5567 friend constexpr bool
5568 operator==(
const _Iterator& __x,
const _Iterator& __y)
5569 {
return __x._M_current.back() == __y._M_current.back(); }
5571 friend constexpr bool
5572 operator<(
const _Iterator& __x,
const _Iterator& __y)
5573 requires random_access_range<_Base>
5574 {
return __x._M_current.back() < __y._M_current.back(); }
5576 friend constexpr bool
5577 operator>(
const _Iterator& __x,
const _Iterator& __y)
5578 requires random_access_range<_Base>
5579 {
return __y < __x; }
5581 friend constexpr bool
5582 operator<=(
const _Iterator& __x,
const _Iterator& __y)
5583 requires random_access_range<_Base>
5584 {
return !(__y < __x); }
5586 friend constexpr bool
5587 operator>=(
const _Iterator& __x,
const _Iterator& __y)
5588 requires random_access_range<_Base>
5589 {
return !(__x < __y); }
5591 friend constexpr auto
5592 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5593 requires random_access_range<_Base>
5594 && three_way_comparable<iterator_t<_Base>>
5595 {
return __x._M_current.back() <=> __y._M_current.back(); }
5597 friend constexpr _Iterator
5598 operator+(
const _Iterator& __i, difference_type __n)
5599 requires random_access_range<_Base>
5606 friend constexpr _Iterator
5607 operator+(difference_type __n,
const _Iterator& __i)
5608 requires random_access_range<_Base>
5615 friend constexpr _Iterator
5616 operator-(
const _Iterator& __i, difference_type __n)
5617 requires random_access_range<_Base>
5624 friend constexpr difference_type
5625 operator-(
const _Iterator& __x,
const _Iterator& __y)
5626 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
5627 {
return __x._M_current.back() - __y._M_current.back(); }
5629 friend constexpr auto
5630 iter_move(
const _Iterator& __i)
5631 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
5633 friend constexpr void
5634 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
5635 requires indirectly_swappable<iterator_t<_Base>>
5637 for (
size_t __i = 0; __i < _Nm; __i++)
5638 ranges::iter_swap(__l._M_current[__i], __r._M_current[__i]);
5642 template<forward_range _Vp,
size_t _Nm>
5643 requires view<_Vp> && (_Nm > 0)
5644 template<bool _Const>
5645 class adjacent_view<_Vp, _Nm>::_Sentinel
5647 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5649 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
5652 _Sentinel(sentinel_t<_Base> __end)
5656 friend class adjacent_view;
5659 _Sentinel() =
default;
5662 _Sentinel(_Sentinel<!_Const> __i)
5663 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
5667 template<
bool _OtherConst>
5668 requires sentinel_for<sentinel_t<_Base>,
5669 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5670 friend constexpr bool
5671 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5672 {
return __x._M_current.back() == __y._M_end; }
5674 template<
bool _OtherConst>
5675 requires sized_sentinel_for<sentinel_t<_Base>,
5676 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5677 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _Vp>>
5678 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5679 {
return __x._M_current.back() - __y._M_end; }
5681 template<
bool _OtherConst>
5682 requires sized_sentinel_for<sentinel_t<_Base>,
5683 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5684 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _Vp>>
5685 operator-(
const _Sentinel& __y,
const _Iterator<_OtherConst>& __x)
5686 {
return __y._M_end - __x._M_current.back(); }
5693 template<
size_t _Nm,
typename _Range>
5694 concept __can_adjacent_view
5698 template<
size_t _Nm>
5699 struct _Adjacent : __adaptor::_RangeAdaptorClosure<_Adjacent<_Nm>>
5701 template<viewable_range _Range>
5702 requires (_Nm == 0) || __detail::__can_adjacent_view<_Nm, _Range>
5704 operator() [[nodiscard]] (_Range&& __r)
const
5706 if constexpr (_Nm == 0)
5707 return views::empty<tuple<>>;
5713 template<
size_t _Nm>
5714 inline constexpr _Adjacent<_Nm> adjacent;
5716 inline constexpr auto pairwise = adjacent<2>;
5719 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
5720 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
5721 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
5722 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
5723 range_reference_t<_Vp>>>
5724 class adjacent_transform_view : public view_interface<adjacent_transform_view<_Vp, _Fp, _Nm>>
5726 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
5727 adjacent_view<_Vp, _Nm> _M_inner;
5729 using _InnerView = adjacent_view<_Vp, _Nm>;
5731 template<
bool _Const>
5732 using _InnerIter = iterator_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5734 template<
bool _Const>
5735 using _InnerSent = sentinel_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5737 template<
bool>
class _Iterator;
5738 template<
bool>
class _Sentinel;
5741 adjacent_transform_view() =
default;
5744 adjacent_transform_view(_Vp __base, _Fp __fun)
5752 base() const & requires copy_constructible<_Vp>
5753 {
return _M_inner.base(); }
5761 {
return _Iterator<false>(*
this, _M_inner.begin()); }
5765 requires range<const _InnerView>
5766 && regular_invocable<__detail::__unarize<const _Fp&, _Nm>,
5767 range_reference_t<const _Vp>>
5768 {
return _Iterator<true>(*
this, _M_inner.begin()); }
5773 if constexpr (common_range<_InnerView>)
5774 return _Iterator<false>(*
this, _M_inner.end());
5776 return _Sentinel<false>(_M_inner.end());
5781 requires range<const _InnerView>
5782 && regular_invocable<__detail::__unarize<const _Fp&, _Nm>,
5783 range_reference_t<const _Vp>>
5785 if constexpr (common_range<const _InnerView>)
5786 return _Iterator<true>(*
this, _M_inner.end());
5788 return _Sentinel<true>(_M_inner.end());
5792 size()
requires sized_range<_InnerView>
5793 {
return _M_inner.size(); }
5796 size() const requires sized_range<const _InnerView>
5797 {
return _M_inner.size(); }
5800 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
5801 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
5802 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
5803 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
5804 range_reference_t<_Vp>>>
5805 template<bool _Const>
5806 class adjacent_transform_view<_Vp, _Fp, _Nm>::_Iterator
5808 using _Parent = __detail::__maybe_const_t<_Const, adjacent_transform_view>;
5809 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5811 _Parent* _M_parent =
nullptr;
5812 _InnerIter<_Const> _M_inner;
5815 _Iterator(_Parent& __parent, _InnerIter<_Const> __inner)
5822 using __detail::__maybe_const_t;
5823 using __detail::__unarize;
5824 using _Res = invoke_result_t<__unarize<__maybe_const_t<_Const, _Fp>&, _Nm>,
5825 range_reference_t<_Base>>;
5826 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
5829 if constexpr (!is_reference_v<_Res>)
5830 return input_iterator_tag{};
5831 else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
5832 return random_access_iterator_tag{};
5833 else if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
5834 return bidirectional_iterator_tag{};
5835 else if constexpr (derived_from<_Cat, forward_iterator_tag>)
5836 return forward_iterator_tag{};
5838 return input_iterator_tag{};
5841 friend class adjacent_transform_view;
5844 using iterator_category =
decltype(_S_iter_cat());
5845 using iterator_concept =
typename _InnerIter<_Const>::iterator_concept;
5847 = remove_cvref_t<invoke_result_t
5848 <__detail::__unarize<__detail::__maybe_const_t<_Const, _Fp>&, _Nm>,
5849 range_reference_t<_Base>>>;
5850 using difference_type = range_difference_t<_Base>;
5852 _Iterator() =
default;
5855 _Iterator(_Iterator<!_Const> __i)
5856 requires _Const && convertible_to<_InnerIter<false>, _InnerIter<_Const>>
5857 : _M_parent(__i._M_parent), _M_inner(
std::move(__i._M_inner))
5860 constexpr decltype(
auto)
5863 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
5865 }, _M_inner._M_current);
5868 constexpr _Iterator&
5883 constexpr _Iterator&
5884 operator--()
requires bidirectional_range<_Base>
5891 operator--(
int)
requires bidirectional_range<_Base>
5898 constexpr _Iterator&
5899 operator+=(difference_type __x)
requires random_access_range<_Base>
5905 constexpr _Iterator&
5906 operator-=(difference_type __x)
requires random_access_range<_Base>
5912 constexpr decltype(
auto)
5913 operator[](difference_type __n)
const requires random_access_range<_Base>
5915 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
5917 }, _M_inner._M_current);
5920 friend constexpr bool
5921 operator==(
const _Iterator& __x,
const _Iterator& __y)
5922 {
return __x._M_inner == __y._M_inner; }
5924 friend constexpr bool
5925 operator<(
const _Iterator& __x,
const _Iterator& __y)
5926 requires random_access_range<_Base>
5927 {
return __x._M_inner < __y._M_inner; }
5929 friend constexpr bool
5930 operator>(
const _Iterator& __x,
const _Iterator& __y)
5931 requires random_access_range<_Base>
5932 {
return __x._M_inner > __y._M_inner; }
5934 friend constexpr bool
5935 operator<=(
const _Iterator& __x,
const _Iterator& __y)
5936 requires random_access_range<_Base>
5937 {
return __x._M_inner <= __y._M_inner; }
5939 friend constexpr bool
5940 operator>=(
const _Iterator& __x,
const _Iterator& __y)
5941 requires random_access_range<_Base>
5942 {
return __x._M_inner >= __y._M_inner; }
5944 friend constexpr auto
5945 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5946 requires random_access_range<_Base> &&
5947 three_way_comparable<_InnerIter<_Const>>
5948 {
return __x._M_inner <=> __y._M_inner; }
5950 friend constexpr _Iterator
5951 operator+(
const _Iterator& __i, difference_type __n)
5952 requires random_access_range<_Base>
5953 {
return _Iterator(*__i._M_parent, __i._M_inner + __n); }
5955 friend constexpr _Iterator
5956 operator+(difference_type __n,
const _Iterator& __i)
5957 requires random_access_range<_Base>
5958 {
return _Iterator(*__i._M_parent, __i._M_inner + __n); }
5960 friend constexpr _Iterator
5961 operator-(
const _Iterator& __i, difference_type __n)
5962 requires random_access_range<_Base>
5963 {
return _Iterator(*__i._M_parent, __i._M_inner - __n); }
5965 friend constexpr difference_type
5966 operator-(
const _Iterator& __x,
const _Iterator& __y)
5967 requires sized_sentinel_for<_InnerIter<_Const>, _InnerIter<_Const>>
5968 {
return __x._M_inner - __y._M_inner; }
5971 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
5972 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
5973 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
5974 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
5975 range_reference_t<_Vp>>>
5976 template<bool _Const>
5977 class adjacent_transform_view<_Vp, _Fp, _Nm>::_Sentinel
5979 _InnerSent<_Const> _M_inner;
5982 _Sentinel(_InnerSent<_Const> __inner)
5986 friend class adjacent_transform_view;
5989 _Sentinel() =
default;
5992 _Sentinel(_Sentinel<!_Const> __i)
5993 requires _Const && convertible_to<_InnerSent<false>, _InnerSent<_Const>>
5997 template<
bool _OtherConst>
5998 requires sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
5999 friend constexpr bool
6000 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
6001 {
return __x._M_inner == __y._M_inner; }
6003 template<
bool _OtherConst>
6004 requires sized_sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
6005 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
6006 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
6007 {
return __x._M_inner - __y._M_inner; }
6009 template<
bool _OtherConst>
6010 requires sized_sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
6011 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
6012 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
6013 {
return __x._M_inner - __y._M_inner; }
6020 template<
size_t _Nm,
typename _Range,
typename _Fp>
6021 concept __can_adjacent_transform_view
6022 =
requires { adjacent_transform_view<all_t<_Range>, decay_t<_Fp>, _Nm>
6026 template<
size_t _Nm>
6027 struct _AdjacentTransform : __adaptor::_RangeAdaptor<_AdjacentTransform<_Nm>>
6029 template<viewable_range _Range,
typename _Fp>
6030 requires (_Nm == 0) || __detail::__can_adjacent_transform_view<_Nm, _Range, _Fp>
6032 operator() [[nodiscard]] (_Range&& __r, _Fp&& __f)
const
6034 if constexpr (_Nm == 0)
6037 return adjacent_transform_view<all_t<_Range>, decay_t<_Fp>, _Nm>
6041 using __adaptor::_RangeAdaptor<_AdjacentTransform>::operator();
6042 static constexpr int _S_arity = 2;
6043 static constexpr bool _S_has_simple_extra_args =
true;
6046 template<
size_t _Nm>
6047 inline constexpr _AdjacentTransform<_Nm> adjacent_transform;
6049 inline constexpr auto pairwise_transform = adjacent_transform<2>;
6053#ifdef __cpp_lib_ranges_chunk
6056 template<
typename _Tp>
6057 constexpr _Tp __div_ceil(_Tp __num, _Tp __denom)
6059 _Tp __r = __num / __denom;
6060 if (__num % __denom)
6067 requires input_range<_Vp>
6068 class chunk_view :
public view_interface<chunk_view<_Vp>>
6071 range_difference_t<_Vp> _M_n;
6072 range_difference_t<_Vp> _M_remainder = 0;
6073 __detail::__non_propagating_cache<iterator_t<_Vp>> _M_current;
6080 chunk_view(_Vp __base, range_difference_t<_Vp> __n)
6082 { __glibcxx_assert(__n >= 0); }
6085 base() const & requires copy_constructible<_Vp>
6092 constexpr _OuterIter
6095 _M_current = ranges::begin(_M_base);
6096 _M_remainder = _M_n;
6097 return _OuterIter(*
this);
6100 constexpr default_sentinel_t
6101 end() const noexcept
6105 size()
requires sized_range<_Vp>
6107 return __detail::__to_unsigned_like(__detail::__div_ceil
6108 (ranges::distance(_M_base), _M_n));
6112 size() const requires sized_range<const _Vp>
6114 return __detail::__to_unsigned_like(__detail::__div_ceil
6115 (ranges::distance(_M_base), _M_n));
6119 template<
typename _Range>
6120 chunk_view(_Range&&, range_difference_t<_Range>) -> chunk_view<views::all_t<_Range>>;
6123 requires input_range<_Vp>
6124 class chunk_view<_Vp>::_OuterIter
6126 chunk_view* _M_parent;
6129 _OuterIter(chunk_view& __parent) noexcept
6136 using iterator_concept = input_iterator_tag;
6137 using difference_type = range_difference_t<_Vp>;
6141 _OuterIter(_OuterIter&&) =
default;
6142 _OuterIter& operator=(_OuterIter&&) =
default;
6144 constexpr value_type
6147 __glibcxx_assert(*
this != default_sentinel);
6148 return value_type(*_M_parent);
6151 constexpr _OuterIter&
6154 __glibcxx_assert(*
this != default_sentinel);
6155 ranges::advance(*_M_parent->_M_current, _M_parent->_M_remainder,
6156 ranges::end(_M_parent->_M_base));
6157 _M_parent->_M_remainder = _M_parent->_M_n;
6165 friend constexpr bool
6166 operator==(
const _OuterIter& __x, default_sentinel_t)
6168 return *__x._M_parent->_M_current == ranges::end(__x._M_parent->_M_base)
6169 && __x._M_parent->_M_remainder != 0;
6172 friend constexpr difference_type
6173 operator-(default_sentinel_t,
const _OuterIter& __x)
6174 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6176 const auto __dist = ranges::end(__x._M_parent->_M_base) - *__x._M_parent->_M_current;
6178 if (__dist < __x._M_parent->_M_remainder)
6179 return __dist == 0 ? 0 : 1;
6181 return 1 + __detail::__div_ceil(__dist - __x._M_parent->_M_remainder,
6182 __x._M_parent->_M_n);
6185 friend constexpr difference_type
6186 operator-(
const _OuterIter& __x, default_sentinel_t __y)
6187 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6188 {
return -(__y - __x); }
6192 requires input_range<_Vp>
6193 struct chunk_view<_Vp>::_OuterIter::value_type : view_interface<value_type>
6196 chunk_view* _M_parent;
6199 value_type(chunk_view& __parent) noexcept
6206 constexpr _InnerIter
6207 begin() const noexcept
6208 {
return _InnerIter(*_M_parent); }
6210 constexpr default_sentinel_t
6211 end() const noexcept
6216 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6218 return __detail::__to_unsigned_like
6219 (ranges::min(_M_parent->_M_remainder,
6220 ranges::end(_M_parent->_M_base) - *_M_parent->_M_current));
6225 requires input_range<_Vp>
6226 class chunk_view<_Vp>::_InnerIter
6228 chunk_view* _M_parent;
6231 _InnerIter(chunk_view& __parent) noexcept
6235 friend _OuterIter::value_type;
6238 using iterator_concept = input_iterator_tag;
6239 using difference_type = range_difference_t<_Vp>;
6240 using value_type = range_value_t<_Vp>;
6242 _InnerIter(_InnerIter&&) =
default;
6243 _InnerIter& operator=(_InnerIter&&) =
default;
6245 constexpr const iterator_t<_Vp>&
6247 {
return *_M_parent->_M_current; }
6249 constexpr range_reference_t<_Vp>
6252 __glibcxx_assert(*
this != default_sentinel);
6253 return **_M_parent->_M_current;
6256 constexpr _InnerIter&
6259 __glibcxx_assert(*
this != default_sentinel);
6260 ++*_M_parent->_M_current;
6261 if (*_M_parent->_M_current == ranges::end(_M_parent->_M_base))
6262 _M_parent->_M_remainder = 0;
6264 --_M_parent->_M_remainder;
6272 friend constexpr bool
6273 operator==(
const _InnerIter& __x, default_sentinel_t)
noexcept
6274 {
return __x._M_parent->_M_remainder == 0; }
6276 friend constexpr difference_type
6277 operator-(default_sentinel_t,
const _InnerIter& __x)
6278 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6280 return ranges::min(__x._M_parent->_M_remainder,
6281 ranges::end(__x._M_parent->_M_base) - *__x._M_parent->_M_current);
6284 friend constexpr difference_type
6285 operator-(
const _InnerIter& __x, default_sentinel_t __y)
6286 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6287 {
return -(__y - __x); }
6291 friend constexpr range_rvalue_reference_t<_Vp>
6292 iter_move(
const _InnerIter& __i)
6293 noexcept(
noexcept(ranges::iter_move(*__i._M_parent->_M_current)))
6294 {
return ranges::iter_move(*__i._M_parent->_M_current); }
6296 friend constexpr void
6297 iter_swap(
const _InnerIter& __x,
const _InnerIter& __y)
6298 noexcept(
noexcept(ranges::iter_swap(*__x._M_parent->_M_current,
6299 *__x._M_parent->_M_current)))
6300 requires indirectly_swappable<iterator_t<_Vp>>
6301 {
return ranges::iter_swap(*__x._M_parent->_M_current, *__y._M_parent->_M_current); }
6305 requires forward_range<_Vp>
6306 class chunk_view<_Vp> :
public view_interface<chunk_view<_Vp>>
6309 range_difference_t<_Vp> _M_n;
6310 template<
bool>
class _Iterator;
6314 chunk_view(_Vp __base, range_difference_t<_Vp> __n)
6316 { __glibcxx_assert(__n > 0); }
6319 base() const & requires copy_constructible<_Vp>
6327 begin()
requires (!__detail::__simple_view<_Vp>)
6328 {
return _Iterator<false>(
this, ranges::begin(_M_base)); }
6331 begin() const requires forward_range<const _Vp>
6332 {
return _Iterator<true>(
this, ranges::begin(_M_base)); }
6335 end()
requires (!__detail::__simple_view<_Vp>)
6337 if constexpr (common_range<_Vp> && sized_range<_Vp>)
6339 auto __missing = (_M_n - ranges::distance(_M_base) % _M_n) % _M_n;
6340 return _Iterator<false>(
this, ranges::end(_M_base), __missing);
6342 else if constexpr (common_range<_Vp> && !bidirectional_range<_Vp>)
6343 return _Iterator<false>(
this, ranges::end(_M_base));
6349 end() const requires forward_range<const _Vp>
6351 if constexpr (common_range<const _Vp> && sized_range<const _Vp>)
6353 auto __missing = (_M_n - ranges::distance(_M_base) % _M_n) % _M_n;
6354 return _Iterator<true>(
this, ranges::end(_M_base), __missing);
6356 else if constexpr (common_range<const _Vp> && !bidirectional_range<const _Vp>)
6357 return _Iterator<true>(
this, ranges::end(_M_base));
6363 size()
requires sized_range<_Vp>
6365 return __detail::__to_unsigned_like(__detail::__div_ceil
6366 (ranges::distance(_M_base), _M_n));
6370 size() const requires sized_range<const _Vp>
6372 return __detail::__to_unsigned_like(__detail::__div_ceil
6373 (ranges::distance(_M_base), _M_n));
6377 template<
typename _Vp>
6378 inline constexpr bool enable_borrowed_range<chunk_view<_Vp>>
6379 = forward_range<_Vp> && enable_borrowed_range<_Vp>;
6382 requires forward_range<_Vp>
6383 template<
bool _Const>
6384 class chunk_view<_Vp>::_Iterator
6386 using _Parent = __detail::__maybe_const_t<_Const, chunk_view>;
6387 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
6389 iterator_t<_Base> _M_current = iterator_t<_Base>();
6390 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
6391 range_difference_t<_Base> _M_n = 0;
6392 range_difference_t<_Base> _M_missing = 0;
6395 _Iterator(_Parent* __parent, iterator_t<_Base> __current,
6396 range_difference_t<_Base> __missing = 0)
6397 : _M_current(__current), _M_end(ranges::
end(__parent->_M_base)),
6398 _M_n(__parent->_M_n), _M_missing(__missing)
6404 if constexpr (random_access_range<_Base>)
6405 return random_access_iterator_tag{};
6406 else if constexpr (bidirectional_range<_Base>)
6407 return bidirectional_iterator_tag{};
6409 return forward_iterator_tag{};
6415 using iterator_category = input_iterator_tag;
6416 using iterator_concept =
decltype(_S_iter_cat());
6417 using value_type =
decltype(views::take(subrange(_M_current, _M_end), _M_n));
6418 using difference_type = range_difference_t<_Base>;
6420 _Iterator() =
default;
6422 constexpr _Iterator(_Iterator<!_Const> __i)
6424 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
6425 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
6427 _M_n(__i._M_n), _M_missing(__i._M_missing)
6430 constexpr iterator_t<_Base>
6432 {
return _M_current; }
6434 constexpr value_type
6437 __glibcxx_assert(_M_current != _M_end);
6438 return views::take(subrange(_M_current, _M_end), _M_n);
6441 constexpr _Iterator&
6444 __glibcxx_assert(_M_current != _M_end);
6445 _M_missing = ranges::advance(_M_current, _M_n, _M_end);
6457 constexpr _Iterator&
6458 operator--()
requires bidirectional_range<_Base>
6460 ranges::advance(_M_current, _M_missing - _M_n);
6466 operator--(
int)
requires bidirectional_range<_Base>
6473 constexpr _Iterator&
6474 operator+=(difference_type __x)
6475 requires random_access_range<_Base>
6479 __glibcxx_assert(ranges::distance(_M_current, _M_end) > _M_n * (__x - 1));
6480 _M_missing = ranges::advance(_M_current, _M_n * __x, _M_end);
6484 ranges::advance(_M_current, _M_n * __x + _M_missing);
6490 constexpr _Iterator&
6491 operator-=(difference_type __x)
6492 requires random_access_range<_Base>
6493 {
return *
this += -__x; }
6495 constexpr value_type
6496 operator[](difference_type __n)
const
6497 requires random_access_range<_Base>
6498 {
return *(*
this + __n); }
6500 friend constexpr bool
6501 operator==(
const _Iterator& __x,
const _Iterator& __y)
6502 {
return __x._M_current == __y._M_current; }
6504 friend constexpr bool
6505 operator==(
const _Iterator& __x, default_sentinel_t)
6506 {
return __x._M_current == __x._M_end; }
6508 friend constexpr bool
6509 operator<(
const _Iterator& __x,
const _Iterator& __y)
6510 requires random_access_range<_Base>
6511 {
return __x._M_current > __y._M_current; }
6513 friend constexpr bool
6514 operator>(
const _Iterator& __x,
const _Iterator& __y)
6515 requires random_access_range<_Base>
6516 {
return __y < __x; }
6518 friend constexpr bool
6519 operator<=(
const _Iterator& __x,
const _Iterator& __y)
6520 requires random_access_range<_Base>
6521 {
return !(__y < __x); }
6523 friend constexpr bool
6524 operator>=(
const _Iterator& __x,
const _Iterator& __y)
6525 requires random_access_range<_Base>
6526 {
return !(__x < __y); }
6528 friend constexpr auto
6529 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
6530 requires random_access_range<_Base>
6531 && three_way_comparable<iterator_t<_Base>>
6532 {
return __x._M_current <=> __y._M_current; }
6534 friend constexpr _Iterator
6535 operator+(
const _Iterator& __i, difference_type __n)
6536 requires random_access_range<_Base>
6543 friend constexpr _Iterator
6544 operator+(difference_type __n,
const _Iterator& __i)
6545 requires random_access_range<_Base>
6552 friend constexpr _Iterator
6553 operator-(
const _Iterator& __i, difference_type __n)
6554 requires random_access_range<_Base>
6561 friend constexpr difference_type
6562 operator-(
const _Iterator& __x,
const _Iterator& __y)
6563 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
6565 return (__x._M_current - __y._M_current
6566 + __x._M_missing - __y._M_missing) / __x._M_n;
6569 friend constexpr difference_type
6570 operator-(default_sentinel_t,
const _Iterator& __x)
6571 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
6572 {
return __detail::__div_ceil(__x._M_end - __x._M_current, __x._M_n); }
6574 friend constexpr difference_type
6575 operator-(
const _Iterator& __x, default_sentinel_t __y)
6576 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
6577 {
return -(__y - __x); }
6584 template<
typename _Range,
typename _Dp>
6585 concept __can_chunk_view
6589 struct _Chunk : __adaptor::_RangeAdaptor<_Chunk>
6591 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
6592 requires __detail::__can_chunk_view<_Range, _Dp>
6594 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
6597 using __adaptor::_RangeAdaptor<_Chunk>::operator();
6598 static constexpr int _S_arity = 2;
6599 static constexpr bool _S_has_simple_extra_args =
true;
6602 inline constexpr _Chunk chunk;
6606#ifdef __cpp_lib_ranges_slide
6609 template<
typename _Vp>
6610 concept __slide_caches_nothing = random_access_range<_Vp> && sized_range<_Vp>;
6612 template<
typename _Vp>
6613 concept __slide_caches_last
6614 = !__slide_caches_nothing<_Vp> && bidirectional_range<_Vp> && common_range<_Vp>;
6616 template<
typename _Vp>
6617 concept __slide_caches_first
6618 = !__slide_caches_nothing<_Vp> && !__slide_caches_last<_Vp>;
6621 template<forward_range _Vp>
6623 class slide_view :
public view_interface<slide_view<_Vp>>
6626 range_difference_t<_Vp> _M_n;
6627 [[no_unique_address]]
6628 __detail::__maybe_present_t<__detail::__slide_caches_first<_Vp>,
6629 __detail::_CachedPosition<_Vp>, 0> _M_cached_begin;
6630 [[no_unique_address]]
6631 __detail::__maybe_present_t<__detail::__slide_caches_last<_Vp>,
6632 __detail::_CachedPosition<_Vp>, 1> _M_cached_end;
6634 template<
bool>
class _Iterator;
6639 slide_view(_Vp __base, range_difference_t<_Vp> __n)
6641 { __glibcxx_assert(__n > 0); }
6646 base() const & requires copy_constructible<_Vp>
6654 begin()
requires (!(__detail::__simple_view<_Vp>
6655 && __detail::__slide_caches_nothing<const _Vp>))
6657 if constexpr (__detail::__slide_caches_first<_Vp>)
6659 iterator_t<_Vp> __it;
6660 if (_M_cached_begin._M_has_value())
6661 __it = _M_cached_begin._M_get(_M_base);
6664 __it = ranges::next(ranges::begin(_M_base), _M_n - 1, ranges::end(_M_base));
6665 _M_cached_begin._M_set(_M_base, __it);
6667 return _Iterator<false>(ranges::begin(_M_base),
std::move(__it), _M_n);
6670 return _Iterator<false>(ranges::begin(_M_base), _M_n);
6674 begin() const requires __detail::__slide_caches_nothing<const _Vp>
6675 {
return _Iterator<true>(ranges::begin(_M_base), _M_n); }
6678 end()
requires (!(__detail::__simple_view<_Vp>
6679 && __detail::__slide_caches_nothing<const _Vp>))
6681 if constexpr (__detail::__slide_caches_nothing<_Vp>)
6682 return _Iterator<false>(ranges::begin(_M_base) + range_difference_t<_Vp>(
size()),
6684 else if constexpr (__detail::__slide_caches_last<_Vp>)
6686 iterator_t<_Vp> __it;
6687 if (_M_cached_end._M_has_value())
6688 __it = _M_cached_end._M_get(_M_base);
6691 __it = ranges::prev(ranges::end(_M_base), _M_n - 1, ranges::begin(_M_base));
6692 _M_cached_end._M_set(_M_base, __it);
6694 return _Iterator<false>(
std::move(__it), _M_n);
6696 else if constexpr (common_range<_Vp>)
6697 return _Iterator<false>(ranges::end(_M_base), ranges::end(_M_base), _M_n);
6699 return _Sentinel(ranges::end(_M_base));
6703 end() const requires __detail::__slide_caches_nothing<const _Vp>
6704 {
return begin() + range_difference_t<const _Vp>(
size()); }
6707 size()
requires sized_range<_Vp>
6709 auto __sz = ranges::distance(_M_base) - _M_n + 1;
6712 return __detail::__to_unsigned_like(__sz);
6716 size() const requires sized_range<const _Vp>
6718 auto __sz = ranges::distance(_M_base) - _M_n + 1;
6721 return __detail::__to_unsigned_like(__sz);
6725 template<
typename _Range>
6726 slide_view(_Range&&, range_difference_t<_Range>) -> slide_view<views::all_t<_Range>>;
6728 template<
typename _Vp>
6729 inline constexpr bool enable_borrowed_range<slide_view<_Vp>>
6730 = enable_borrowed_range<_Vp>;
6732 template<forward_range _Vp>
6734 template<
bool _Const>
6735 class slide_view<_Vp>::_Iterator
6737 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
6738 static constexpr bool _S_last_elt_present
6739 = __detail::__slide_caches_first<_Base>;
6741 iterator_t<_Base> _M_current = iterator_t<_Base>();
6742 [[no_unique_address]]
6743 __detail::__maybe_present_t<_S_last_elt_present, iterator_t<_Base>>
6744 _M_last_elt =
decltype(_M_last_elt)();
6745 range_difference_t<_Base> _M_n = 0;
6748 _Iterator(iterator_t<_Base> __current, range_difference_t<_Base> __n)
6749 requires (!_S_last_elt_present)
6750 : _M_current(__current), _M_n(__n)
6754 _Iterator(iterator_t<_Base> __current, iterator_t<_Base> __last_elt,
6755 range_difference_t<_Base> __n)
6756 requires _S_last_elt_present
6757 : _M_current(__current), _M_last_elt(__last_elt), _M_n(__n)
6763 if constexpr (random_access_range<_Base>)
6764 return random_access_iterator_tag{};
6765 else if constexpr (bidirectional_range<_Base>)
6766 return bidirectional_iterator_tag{};
6768 return forward_iterator_tag{};
6772 friend slide_view::_Sentinel;
6775 using iterator_category = input_iterator_tag;
6776 using iterator_concept =
decltype(_S_iter_concept());
6777 using value_type =
decltype(views::counted(_M_current, _M_n));
6778 using difference_type = range_difference_t<_Base>;
6780 _Iterator() =
default;
6783 _Iterator(_Iterator<!_Const> __i)
6784 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
6785 : _M_current(
std::move(__i._M_current)), _M_n(__i._M_n)
6790 {
return views::counted(_M_current, _M_n); }
6792 constexpr _Iterator&
6796 if constexpr (_S_last_elt_present)
6809 constexpr _Iterator&
6810 operator--()
requires bidirectional_range<_Base>
6813 if constexpr (_S_last_elt_present)
6819 operator--(
int)
requires bidirectional_range<_Base>
6826 constexpr _Iterator&
6827 operator+=(difference_type __x)
6828 requires random_access_range<_Base>
6831 if constexpr (_S_last_elt_present)
6836 constexpr _Iterator&
6837 operator-=(difference_type __x)
6838 requires random_access_range<_Base>
6841 if constexpr (_S_last_elt_present)
6847 operator[](difference_type __n)
const
6848 requires random_access_range<_Base>
6849 {
return views::counted(_M_current + __n, _M_n); }
6851 friend constexpr bool
6852 operator==(
const _Iterator& __x,
const _Iterator& __y)
6854 if constexpr (_S_last_elt_present)
6855 return __x._M_last_elt == __y._M_last_elt;
6857 return __x._M_current == __y._M_current;
6860 friend constexpr bool
6861 operator<(
const _Iterator& __x,
const _Iterator& __y)
6862 requires random_access_range<_Base>
6863 {
return __x._M_current < __y._M_current; }
6865 friend constexpr bool
6866 operator>(
const _Iterator& __x,
const _Iterator& __y)
6867 requires random_access_range<_Base>
6868 {
return __y < __x; }
6870 friend constexpr bool
6871 operator<=(
const _Iterator& __x,
const _Iterator& __y)
6872 requires random_access_range<_Base>
6873 {
return !(__y < __x); }
6875 friend constexpr bool
6876 operator>=(
const _Iterator& __x,
const _Iterator& __y)
6877 requires random_access_range<_Base>
6878 {
return !(__x < __y); }
6880 friend constexpr auto
6881 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
6882 requires random_access_range<_Base>
6883 && three_way_comparable<iterator_t<_Base>>
6884 {
return __x._M_current <=> __y._M_current; }
6886 friend constexpr _Iterator
6887 operator+(
const _Iterator& __i, difference_type __n)
6888 requires random_access_range<_Base>
6895 friend constexpr _Iterator
6896 operator+(difference_type __n,
const _Iterator& __i)
6897 requires random_access_range<_Base>
6904 friend constexpr _Iterator
6905 operator-(
const _Iterator& __i, difference_type __n)
6906 requires random_access_range<_Base>
6913 friend constexpr difference_type
6914 operator-(
const _Iterator& __x,
const _Iterator& __y)
6915 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
6917 if constexpr (_S_last_elt_present)
6918 return __x._M_last_elt - __y._M_last_elt;
6920 return __x._M_current - __y._M_current;
6924 template<forward_range _Vp>
6926 class slide_view<_Vp>::_Sentinel
6928 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
6931 _Sentinel(sentinel_t<_Vp> __end)
6938 _Sentinel() =
default;
6940 friend constexpr bool
6941 operator==(
const _Iterator<false>& __x,
const _Sentinel& __y)
6942 {
return __x._M_last_elt == __y._M_end; }
6944 friend constexpr range_difference_t<_Vp>
6945 operator-(
const _Iterator<false>& __x,
const _Sentinel& __y)
6946 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6947 {
return __x._M_last_elt - __y._M_end; }
6949 friend constexpr range_difference_t<_Vp>
6950 operator-(
const _Sentinel& __y,
const _Iterator<false>& __x)
6951 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6952 {
return __y._M_end -__x._M_last_elt; }
6959 template<
typename _Range,
typename _Dp>
6960 concept __can_slide_view
6964 struct _Slide : __adaptor::_RangeAdaptor<_Slide>
6966 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
6967 requires __detail::__can_slide_view<_Range, _Dp>
6969 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
6972 using __adaptor::_RangeAdaptor<_Slide>::operator();
6973 static constexpr int _S_arity = 2;
6974 static constexpr bool _S_has_simple_extra_args =
true;
6977 inline constexpr _Slide slide;
6981#ifdef __cpp_lib_ranges_chunk_by
6982 template<forward_range _Vp,
6983 indirect_binary_predicate<iterator_t<_Vp>, iterator_t<_Vp>> _Pred>
6984 requires view<_Vp> && is_object_v<_Pred>
6985 class chunk_by_view :
public view_interface<chunk_by_view<_Vp, _Pred>>
6987 _Vp _M_base = _Vp();
6988 __detail::__box<_Pred> _M_pred;
6989 __detail::_CachedPosition<_Vp> _M_cached_begin;
6991 constexpr iterator_t<_Vp>
6992 _M_find_next(iterator_t<_Vp> __current)
6994 __glibcxx_assert(_M_pred.has_value());
6995 auto __pred = [
this]<
typename _Tp,
typename _Up>(_Tp&& __x, _Up&& __y) {
6998 auto __it = ranges::adjacent_find(__current, ranges::end(_M_base), __pred);
6999 return ranges::next(__it, 1, ranges::end(_M_base));
7002 constexpr iterator_t<_Vp>
7003 _M_find_prev(iterator_t<_Vp> __current)
requires bidirectional_range<_Vp>
7005 __glibcxx_assert(_M_pred.has_value());
7006 auto __pred = [
this]<
typename _Tp,
typename _Up>(_Tp&& __x, _Up&& __y) {
7011 __glibcxx_assert(__rbegin != __rend);
7012 auto __it = ranges::adjacent_find(__rbegin, __rend, __pred).base();
7013 return ranges::prev(__it, 1, ranges::begin(_M_base));
7019 chunk_by_view()
requires (default_initializable<_Vp>
7020 && default_initializable<_Pred>)
7024 chunk_by_view(_Vp __base, _Pred __pred)
7029 base() const & requires copy_constructible<_Vp>
7036 constexpr const _Pred&
7038 {
return *_M_pred; }
7043 __glibcxx_assert(_M_pred.has_value());
7044 iterator_t<_Vp> __it;
7045 if (_M_cached_begin._M_has_value())
7046 __it = _M_cached_begin._M_get(_M_base);
7049 __it = _M_find_next(ranges::begin(_M_base));
7050 _M_cached_begin._M_set(_M_base, __it);
7052 return _Iterator(*
this, ranges::begin(_M_base), __it);
7058 if constexpr (common_range<_Vp>)
7059 return _Iterator(*
this, ranges::end(_M_base), ranges::end(_M_base));
7065 template<
typename _Range,
typename _Pred>
7066 chunk_by_view(_Range&&, _Pred) -> chunk_by_view<views::all_t<_Range>, _Pred>;
7068 template<forward_range _Vp,
7069 indirect_binary_predicate<iterator_t<_Vp>, iterator_t<_Vp>> _Pred>
7070 requires view<_Vp> && is_object_v<_Pred>
7071 class chunk_by_view<_Vp, _Pred>::_Iterator
7073 chunk_by_view* _M_parent =
nullptr;
7074 iterator_t<_Vp> _M_current = iterator_t<_Vp>();
7075 iterator_t<_Vp> _M_next = iterator_t<_Vp>();
7078 _Iterator(chunk_by_view& __parent, iterator_t<_Vp> __current, iterator_t<_Vp> __next)
7079 : _M_parent(std::
__addressof(__parent)), _M_current(__current), _M_next(__next)
7085 if constexpr (bidirectional_range<_Vp>)
7086 return bidirectional_iterator_tag{};
7088 return forward_iterator_tag{};
7091 friend chunk_by_view;
7094 using value_type = subrange<iterator_t<_Vp>>;
7095 using difference_type = range_difference_t<_Vp>;
7096 using iterator_category = input_iterator_tag;
7097 using iterator_concept =
decltype(_S_iter_concept());
7099 _Iterator() =
default;
7101 constexpr value_type
7104 __glibcxx_assert(_M_current != _M_next);
7105 return ranges::subrange(_M_current, _M_next);
7108 constexpr _Iterator&
7111 __glibcxx_assert(_M_current != _M_next);
7112 _M_current = _M_next;
7113 _M_next = _M_parent->_M_find_next(_M_current);
7125 constexpr _Iterator&
7126 operator--()
requires bidirectional_range<_Vp>
7128 _M_next = _M_current;
7129 _M_current = _M_parent->_M_find_prev(_M_next);
7134 operator--(
int)
requires bidirectional_range<_Vp>
7141 friend constexpr bool
7142 operator==(
const _Iterator& __x,
const _Iterator& __y)
7143 {
return __x._M_current == __y._M_current; }
7145 friend constexpr bool
7146 operator==(
const _Iterator& __x, default_sentinel_t)
7147 {
return __x._M_current == __x._M_next; }
7154 template<
typename _Range,
typename _Pred>
7155 concept __can_chunk_by_view
7159 struct _ChunkBy : __adaptor::_RangeAdaptor<_ChunkBy>
7161 template<viewable_range _Range,
typename _Pred>
7162 requires __detail::__can_chunk_by_view<_Range, _Pred>
7164 operator() [[nodiscard]] (_Range&& __r, _Pred&& __pred)
const
7167 using __adaptor::_RangeAdaptor<_ChunkBy>::operator();
7168 static constexpr int _S_arity = 2;
7169 static constexpr bool _S_has_simple_extra_args =
true;
7172 inline constexpr _ChunkBy chunk_by;
7176#ifdef __cpp_lib_ranges_join_with
7179 template<
typename _Range,
typename _Pattern>
7180 concept __compatible_joinable_ranges
7181 = common_with<range_value_t<_Range>, range_value_t<_Pattern>>
7182 && common_reference_with<range_reference_t<_Range>,
7183 range_reference_t<_Pattern>>
7184 && common_reference_with<range_rvalue_reference_t<_Range>,
7185 range_rvalue_reference_t<_Pattern>>;
7187 template<
typename _Range>
7188 concept __bidirectional_common = bidirectional_range<_Range> && common_range<_Range>;
7191 template<input_range _Vp, forward_range _Pattern>
7192 requires view<_Vp> && view<_Pattern>
7193 && input_range<range_reference_t<_Vp>>
7194 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7195 class join_with_view :
public view_interface<join_with_view<_Vp, _Pattern>>
7197 using _InnerRange = range_reference_t<_Vp>;
7199 _Vp _M_base = _Vp();
7200 [[no_unique_address]]
7201 __detail::__maybe_present_t<!forward_range<_Vp>,
7202 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_outer_it;
7203 __detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner;
7204 _Pattern _M_pattern = _Pattern();
7206 template<
bool _Const>
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
7207 template<
bool _Const>
using _InnerBase = range_reference_t<_Base<_Const>>;
7208 template<
bool _Const>
using _PatternBase = __detail::__maybe_const_t<_Const, _Pattern>;
7210 template<
bool _Const>
using _OuterIter = iterator_t<_Base<_Const>>;
7211 template<
bool _Const>
using _InnerIter = iterator_t<_InnerBase<_Const>>;
7212 template<
bool _Const>
using _PatternIter = iterator_t<_PatternBase<_Const>>;
7214 template<
bool _Const>
7215 static constexpr bool _S_ref_is_glvalue = is_reference_v<_InnerBase<_Const>>;
7217 template<
bool _Const>
7221 template<
bool _Const>
7222 requires _S_ref_is_glvalue<_Const>
7223 && forward_range<_Base<_Const>>
7224 && forward_range<_InnerBase<_Const>>
7225 struct __iter_cat<_Const>
7231 using _OuterIter = join_with_view::_OuterIter<_Const>;
7232 using _InnerIter = join_with_view::_InnerIter<_Const>;
7233 using _PatternIter = join_with_view::_PatternIter<_Const>;
7234 using _OuterCat =
typename iterator_traits<_OuterIter>::iterator_category;
7235 using _InnerCat =
typename iterator_traits<_InnerIter>::iterator_category;
7236 using _PatternCat =
typename iterator_traits<_PatternIter>::iterator_category;
7239 if constexpr (!is_reference_v<common_reference_t<iter_reference_t<_InnerIter>,
7240 iter_reference_t<_PatternIter>>>)
7241 return input_iterator_tag{};
7242 else if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
7243 && derived_from<_InnerCat, bidirectional_iterator_tag>
7244 && derived_from<_PatternCat, bidirectional_iterator_tag>
7245 && common_range<_InnerBase<_Const>>
7246 && common_range<_PatternBase<_Const>>)
7247 return bidirectional_iterator_tag{};
7248 else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
7249 && derived_from<_InnerCat, forward_iterator_tag>
7250 && derived_from<_PatternCat, forward_iterator_tag>)
7251 return forward_iterator_tag{};
7253 return input_iterator_tag{};
7256 using iterator_category =
decltype(_S_iter_cat());
7259 template<
bool>
class _Iterator;
7260 template<
bool>
class _Sentinel;
7263 join_with_view()
requires (default_initializable<_Vp>
7264 && default_initializable<_Pattern>)
7268 join_with_view(_Vp __base, _Pattern __pattern)
7272 template<input_range _Range>
7273 requires constructible_from<_Vp, views::all_t<_Range>>
7274 && constructible_from<_Pattern, single_view<range_value_t<_InnerRange>>>
7276 join_with_view(_Range&& __r, range_value_t<_InnerRange> __e)
7277 : _M_base(views::all(std::
forward<_Range>(__r))),
7278 _M_pattern(views::single(std::
move(__e)))
7282 base() const& requires copy_constructible<_Vp>
7292 if constexpr (forward_range<_Vp>)
7294 constexpr bool __use_const = is_reference_v<_InnerRange>
7295 && __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
7296 return _Iterator<__use_const>{*
this, ranges::begin(_M_base)};
7300 _M_outer_it = ranges::begin(_M_base);
7301 return _Iterator<false>{*
this};
7307 requires forward_range<const _Vp>
7308 && forward_range<const _Pattern>
7309 && is_reference_v<range_reference_t<const _Vp>>
7310 && input_range<range_reference_t<const _Vp>>
7311 {
return _Iterator<true>{*
this, ranges::begin(_M_base)}; }
7316 constexpr bool __use_const
7317 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
7318 if constexpr (is_reference_v<_InnerRange>
7319 && forward_range<_Vp> && common_range<_Vp>
7320 && forward_range<_InnerRange> && common_range<_InnerRange>)
7321 return _Iterator<__use_const>{*
this, ranges::end(_M_base)};
7323 return _Sentinel<__use_const>{*
this};
7328 requires forward_range<const _Vp>
7329 && forward_range<const _Pattern>
7330 && is_reference_v<range_reference_t<const _Vp>>
7331 && input_range<range_reference_t<const _Vp>>
7333 using _InnerConstRange = range_reference_t<const _Vp>;
7334 if constexpr (forward_range<_InnerConstRange>
7335 && common_range<const _Vp>
7336 && common_range<_InnerConstRange>)
7337 return _Iterator<true>{*
this, ranges::end(_M_base)};
7339 return _Sentinel<true>{*
this};
7343 template<
typename _Range,
typename _Pattern>
7344 join_with_view(_Range&&, _Pattern&&)
7345 -> join_with_view<views::all_t<_Range>, views::all_t<_Pattern>>;
7347 template<input_range _Range>
7348 join_with_view(_Range&&, range_value_t<range_reference_t<_Range>>)
7349 -> join_with_view<views::all_t<_Range>,
7350 single_view<range_value_t<range_reference_t<_Range>>>>;
7352 template<input_range _Vp, forward_range _Pattern>
7353 requires view<_Vp> && view<_Pattern>
7354 && input_range<range_reference_t<_Vp>>
7355 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7356 template<
bool _Const>
7357 class join_with_view<_Vp, _Pattern>::_Iterator :
public __iter_cat<_Const>
7359 using _Parent = __detail::__maybe_const_t<_Const, join_with_view>;
7360 using _Base = join_with_view::_Base<_Const>;
7361 using _InnerBase = join_with_view::_InnerBase<_Const>;
7362 using _PatternBase = join_with_view::_PatternBase<_Const>;
7364 using _OuterIter = join_with_view::_OuterIter<_Const>;
7365 using _InnerIter = join_with_view::_InnerIter<_Const>;
7366 using _PatternIter = join_with_view::_PatternIter<_Const>;
7368 static constexpr bool _S_ref_is_glvalue = join_with_view::_S_ref_is_glvalue<_Const>;
7370 _Parent* _M_parent =
nullptr;
7371 [[no_unique_address]]
7372 __detail::__maybe_present_t<forward_range<_Base>, _OuterIter> _M_outer_it
7373 =
decltype(_M_outer_it)();
7374 variant<_PatternIter, _InnerIter> _M_inner_it;
7376 constexpr _OuterIter&
7379 if constexpr (forward_range<_Base>)
7382 return *_M_parent->_M_outer_it;
7385 constexpr const _OuterIter&
7386 _M_get_outer()
const
7388 if constexpr (forward_range<_Base>)
7391 return *_M_parent->_M_outer_it;
7395 _Iterator(_Parent& __parent, _OuterIter __outer)
7396 requires forward_range<_Base>
7399 if (_M_get_outer() != ranges::end(_M_parent->_M_base))
7401 auto&& __inner = _M_update_inner();
7402 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7408 _Iterator(_Parent& __parent)
7409 requires (!forward_range<_Base>)
7412 if (_M_get_outer() != ranges::end(_M_parent->_M_base))
7414 auto&& __inner = _M_update_inner();
7415 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7423 _OuterIter& __outer = _M_get_outer();
7424 if constexpr (_S_ref_is_glvalue)
7425 return __detail::__as_lvalue(*__outer);
7427 return _M_parent->_M_inner._M_emplace_deref(__outer);
7433 if constexpr (_S_ref_is_glvalue)
7434 return __detail::__as_lvalue(*_M_get_outer());
7436 return *_M_parent->_M_inner;
7444 if (_M_inner_it.index() == 0)
7446 if (std::get<0>(_M_inner_it) != ranges::end(_M_parent->_M_pattern))
7449 auto&& __inner = _M_update_inner();
7450 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7454 auto&& __inner = _M_get_inner();
7455 if (std::get<1>(_M_inner_it) != ranges::end(__inner))
7458 if (++_M_get_outer() == ranges::end(_M_parent->_M_base))
7460 if constexpr (_S_ref_is_glvalue)
7461 _M_inner_it.template emplace<0>();
7465 _M_inner_it.template emplace<0>(ranges::begin(_M_parent->_M_pattern));
7473 if constexpr (_S_ref_is_glvalue
7474 && bidirectional_range<_Base>
7475 && __detail::__bidirectional_common<_InnerBase>
7476 && __detail::__bidirectional_common<_PatternBase>)
7477 return bidirectional_iterator_tag{};
7478 else if constexpr (_S_ref_is_glvalue
7479 && forward_range<_Base>
7480 && forward_range<_InnerBase>)
7481 return forward_iterator_tag{};
7483 return input_iterator_tag{};
7486 friend join_with_view;
7489 using iterator_concept =
decltype(_S_iter_concept());
7491 using value_type = common_type_t<iter_value_t<_InnerIter>,
7492 iter_value_t<_PatternIter>>;
7493 using difference_type = common_type_t<iter_difference_t<_OuterIter>,
7494 iter_difference_t<_InnerIter>,
7495 iter_difference_t<_PatternIter>>;
7497 _Iterator() =
default;
7500 _Iterator(_Iterator<!_Const> __i)
7502 && convertible_to<iterator_t<_Vp>, _OuterIter>
7503 && convertible_to<iterator_t<_InnerRange>, _InnerIter>
7504 && convertible_to<iterator_t<_Pattern>, _PatternIter>
7505 : _M_parent(__i._M_parent),
7508 if (__i._M_inner_it.index() == 0)
7509 _M_inner_it.template emplace<0>(std::get<0>(
std::move(__i._M_inner_it)));
7511 _M_inner_it.template emplace<1>(std::get<1>(
std::move(__i._M_inner_it)));
7514 constexpr common_reference_t<iter_reference_t<_InnerIter>,
7515 iter_reference_t<_PatternIter>>
7518 if (_M_inner_it.index() == 0)
7519 return *std::get<0>(_M_inner_it);
7521 return *std::get<1>(_M_inner_it);
7524 constexpr _Iterator&
7527 if (_M_inner_it.index() == 0)
7528 ++std::get<0>(_M_inner_it);
7530 ++std::get<1>(_M_inner_it);
7541 requires _S_ref_is_glvalue
7542 && forward_iterator<_OuterIter> && forward_iterator<_InnerIter>
7544 _Iterator __tmp = *
this;
7549 constexpr _Iterator&
7551 requires _S_ref_is_glvalue
7552 && bidirectional_range<_Base>
7553 && __detail::__bidirectional_common<_InnerBase>
7554 && __detail::__bidirectional_common<_PatternBase>
7556 if (_M_outer_it == ranges::end(_M_parent->_M_base))
7558 auto&& __inner = *--_M_outer_it;
7559 _M_inner_it.template emplace<1>(ranges::end(__inner));
7564 if (_M_inner_it.index() == 0)
7566 auto& __it = std::get<0>(_M_inner_it);
7567 if (__it == ranges::begin(_M_parent->_M_pattern))
7569 auto&& __inner = *--_M_outer_it;
7570 _M_inner_it.template emplace<1>(ranges::end(__inner));
7577 auto& __it = std::get<1>(_M_inner_it);
7578 auto&& __inner = *_M_outer_it;
7579 if (__it == ranges::begin(__inner))
7580 _M_inner_it.template emplace<0>(ranges::end(_M_parent->_M_pattern));
7586 if (_M_inner_it.index() == 0)
7587 --std::get<0>(_M_inner_it);
7589 --std::get<1>(_M_inner_it);
7595 requires _S_ref_is_glvalue && bidirectional_range<_Base>
7596 && __detail::__bidirectional_common<_InnerBase>
7597 && __detail::__bidirectional_common<_PatternBase>
7599 _Iterator __tmp = *
this;
7604 friend constexpr bool
7605 operator==(
const _Iterator& __x,
const _Iterator& __y)
7606 requires _S_ref_is_glvalue
7607 && forward_range<_Base> && equality_comparable<_InnerIter>
7608 {
return __x._M_outer_it == __y._M_outer_it && __x._M_inner_it ==__y._M_inner_it; }
7610 friend constexpr common_reference_t<iter_rvalue_reference_t<_InnerIter>,
7611 iter_rvalue_reference_t<_PatternIter>>
7612 iter_move(
const _Iterator& __x)
7614 if (__x._M_inner_it.index() == 0)
7615 return ranges::iter_move(std::get<0>(__x._M_inner_it));
7617 return ranges::iter_move(std::get<1>(__x._M_inner_it));
7620 friend constexpr void
7621 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
7622 requires indirectly_swappable<_InnerIter, _PatternIter>
7624 if (__x._M_inner_it.index() == 0)
7626 if (__y._M_inner_it.index() == 0)
7627 ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
7629 ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
7633 if (__y._M_inner_it.index() == 0)
7634 ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
7636 ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
7641 template<input_range _Vp, forward_range _Pattern>
7642 requires view<_Vp> && view<_Pattern>
7643 && input_range<range_reference_t<_Vp>>
7644 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7645 template<
bool _Const>
7646 class join_with_view<_Vp, _Pattern>::_Sentinel
7648 using _Parent = __detail::__maybe_const_t<_Const, join_with_view>;
7649 using _Base = join_with_view::_Base<_Const>;
7651 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
7654 _Sentinel(_Parent& __parent)
7655 : _M_end(ranges::
end(__parent._M_base))
7658 friend join_with_view;
7661 _Sentinel() =
default;
7664 _Sentinel(_Sentinel<!_Const> __s)
7665 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
7669 template<
bool _OtherConst>
7670 requires sentinel_for<sentinel_t<_Base>,
7671 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
7672 friend constexpr bool
7673 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
7674 {
return __x._M_get_outer() == __y._M_end; }
7681 template<
typename _Range,
typename _Pattern>
7682 concept __can_join_with_view
7686 struct _JoinWith : __adaptor::_RangeAdaptor<_JoinWith>
7688 template<viewable_range _Range,
typename _Pattern>
7689 requires __detail::__can_join_with_view<_Range, _Pattern>
7691 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
7696 using _RangeAdaptor<_JoinWith>::operator();
7697 static constexpr int _S_arity = 2;
7698 template<
typename _Pattern>
7699 static constexpr bool _S_has_simple_extra_args
7700 = _LazySplit::_S_has_simple_extra_args<_Pattern>;
7703 inline constexpr _JoinWith join_with;
7707#ifdef __cpp_lib_ranges_repeat
7708 template<move_constructible _Tp, semiregular _Bound = unreachable_sentinel_t>
7709 requires is_object_v<_Tp> && same_as<_Tp, remove_cv_t<_Tp>>
7710 && (__detail::__is_integer_like<_Bound> || same_as<_Bound, unreachable_sentinel_t>)
7711 class repeat_view : public view_interface<repeat_view<_Tp, _Bound>>
7713 __detail::__box<_Tp> _M_value;
7714 [[no_unique_address]] _Bound _M_bound = _Bound();
7718 template<
typename _Range>
7719 friend constexpr auto
7720 views::__detail::__take_of_repeat_view(_Range&&, range_difference_t<_Range>);
7722 template<
typename _Range>
7723 friend constexpr auto
7724 views::__detail::__drop_of_repeat_view(_Range&&, range_difference_t<_Range>);
7727 repeat_view()
requires default_initializable<_Tp> = default;
7730 repeat_view(const _Tp& __value, _Bound __bound = _Bound())
7731 requires copy_constructible<_Tp>
7732 : _M_value(__value), _M_bound(__bound)
7734 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7735 __glibcxx_assert(__bound >= 0);
7739 repeat_view(_Tp&& __value, _Bound __bound = _Bound())
7740 : _M_value(
std::
move(__value)), _M_bound(__bound)
7743 template<
typename... _Args,
typename... _BoundArgs>
7744 requires constructible_from<_Tp, _Args...>
7745 && constructible_from<_Bound, _BoundArgs...>
7747 repeat_view(piecewise_construct_t,
7748 tuple<_Args...> __args,
7749 tuple<_BoundArgs...> __bound_args = tuple<>{})
7750 : _M_value(
std::make_from_tuple<_Tp>(
std::
move(__args))),
7751 _M_bound(
std::make_from_tuple<_Bound>(
std::
move(__bound_args)))
7759 end() const requires (!same_as<_Bound, unreachable_sentinel_t>)
7762 constexpr unreachable_sentinel_t
7763 end() const noexcept
7764 {
return unreachable_sentinel; }
7767 size() const requires (!same_as<_Bound, unreachable_sentinel_t>)
7768 {
return __detail::__to_unsigned_like(_M_bound); }
7773 template<
typename _Tp,
typename _Bound = unreachable_sentinel_t>
7774 repeat_view(_Tp, _Bound = _Bound()) -> repeat_view<_Tp, _Bound>;
7776 template<move_constructible _Tp, semiregular _Bound>
7777 requires is_object_v<_Tp> && same_as<_Tp, remove_cv_t<_Tp>>
7778 && (__detail::__is_integer_like<_Bound> || same_as<_Bound, unreachable_sentinel_t>)
7779 class repeat_view<_Tp, _Bound>::_Iterator
7782 = __conditional_t<same_as<_Bound, unreachable_sentinel_t>, ptrdiff_t, _Bound>;
7784 const _Tp* _M_value =
nullptr;
7785 __index_type _M_current = __index_type();
7788 _Iterator(
const _Tp* __value, __index_type __bound = __index_type())
7789 : _M_value(__value), _M_current(__bound)
7791 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7792 __glibcxx_assert(__bound >= 0);
7798 using iterator_concept = random_access_iterator_tag;
7799 using iterator_category = random_access_iterator_tag;
7800 using value_type = _Tp;
7801 using difference_type = __conditional_t<__detail::__is_signed_integer_like<__index_type>,
7803 __detail::__iota_diff_t<__index_type>>;
7805 _Iterator() =
default;
7807 constexpr const _Tp&
7809 {
return *_M_value; }
7811 constexpr _Iterator&
7826 constexpr _Iterator&
7829 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7830 __glibcxx_assert(_M_current > 0);
7843 constexpr _Iterator&
7844 operator+=(difference_type __n)
7846 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7847 __glibcxx_assert(_M_current + __n >= 0);
7852 constexpr _Iterator&
7853 operator-=(difference_type __n)
7855 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7856 __glibcxx_assert(_M_current - __n >= 0);
7861 constexpr const _Tp&
7862 operator[](difference_type __n)
const noexcept
7863 {
return *(*
this + __n); }
7865 friend constexpr bool
7866 operator==(
const _Iterator& __x,
const _Iterator& __y)
7867 {
return __x._M_current == __y._M_current; }
7869 friend constexpr auto
7870 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
7871 {
return __x._M_current <=> __y._M_current; }
7873 friend constexpr _Iterator
7874 operator+(_Iterator __i, difference_type __n)
7880 friend constexpr _Iterator
7881 operator+(difference_type __n, _Iterator __i)
7882 {
return __i + __n; }
7884 friend constexpr _Iterator
7885 operator-(_Iterator __i, difference_type __n)
7891 friend constexpr difference_type
7892 operator-(
const _Iterator& __x,
const _Iterator& __y)
7894 return (
static_cast<difference_type
>(__x._M_current)
7895 -
static_cast<difference_type
>(__y._M_current));
7903 template<
typename _Tp,
typename _Bound>
7904 inline constexpr bool __is_repeat_view<repeat_view<_Tp, _Bound>> =
true;
7906 template<
typename _Tp>
7907 concept __can_repeat_view
7910 template<
typename _Tp,
typename _Bound>
7911 concept __can_bounded_repeat_view
7917 template<
typename _Tp>
7918 requires __detail::__can_repeat_view<_Tp>
7920 operator() [[nodiscard]] (_Tp&& __value)
const
7927 template<
typename _Tp,
typename _Bound>
7928 requires __detail::__can_bounded_repeat_view<_Tp, _Bound>
7930 operator() [[nodiscard]] (_Tp&& __value, _Bound __bound)
const
7934 inline constexpr _Repeat repeat;
7938 template<
typename _Range>
7940 __take_of_repeat_view(_Range&& __r, range_difference_t<_Range> __n)
7942 using _Tp = remove_cvref_t<_Range>;
7943 static_assert(__is_repeat_view<_Tp>);
7944 if constexpr (sized_range<_Tp>)
7946 std::min(ranges::distance(__r), __n));
7951 template<
typename _Range>
7953 __drop_of_repeat_view(_Range&& __r, range_difference_t<_Range> __n)
7955 using _Tp = remove_cvref_t<_Range>;
7956 static_assert(__is_repeat_view<_Tp>);
7957 if constexpr (sized_range<_Tp>)
7959 auto __sz = ranges::distance(__r);
7970#ifdef __cpp_lib_ranges_stride
7971 template<input_range _Vp>
7973 class stride_view :
public view_interface<stride_view<_Vp>>
7976 range_difference_t<_Vp> _M_stride;
7978 template<
bool _Const>
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
7980 template<
bool _Const>
7984 template<
bool _Const>
7985 requires forward_range<_Base<_Const>>
7986 struct __iter_cat<_Const>
7992 using _Cat =
typename iterator_traits<iterator_t<_Base<_Const>>>::iterator_category;
7993 if constexpr (derived_from<_Cat, random_access_iterator_tag>)
7994 return random_access_iterator_tag{};
7999 using iterator_category =
decltype(_S_iter_cat());
8002 template<
bool>
class _Iterator;
8006 stride_view(_Vp __base, range_difference_t<_Vp> __stride)
8007 : _M_base(std::
move(
__base)), _M_stride(__stride)
8008 { __glibcxx_assert(__stride > 0); }
8011 base() const& requires copy_constructible<_Vp>
8018 constexpr range_difference_t<_Vp>
8019 stride() const noexcept
8020 {
return _M_stride; }
8023 begin()
requires (!__detail::__simple_view<_Vp>)
8024 {
return _Iterator<false>(
this, ranges::begin(_M_base)); }
8027 begin() const requires range<const _Vp>
8028 {
return _Iterator<true>(
this, ranges::begin(_M_base)); }
8031 end()
requires (!__detail::__simple_view<_Vp>)
8033 if constexpr (common_range<_Vp> && sized_range<_Vp> && forward_range<_Vp>)
8035 auto __missing = (_M_stride - ranges::distance(_M_base) % _M_stride) % _M_stride;
8036 return _Iterator<false>(
this, ranges::end(_M_base), __missing);
8038 else if constexpr (common_range<_Vp> && !bidirectional_range<_Vp>)
8039 return _Iterator<false>(
this, ranges::end(_M_base));
8045 end() const requires range<const _Vp>
8047 if constexpr (common_range<const _Vp> && sized_range<const _Vp>
8048 && forward_range<const _Vp>)
8050 auto __missing = (_M_stride - ranges::distance(_M_base) % _M_stride) % _M_stride;
8051 return _Iterator<true>(
this, ranges::end(_M_base), __missing);
8053 else if constexpr (common_range<const _Vp> && !bidirectional_range<const _Vp>)
8054 return _Iterator<true>(
this, ranges::end(_M_base));
8060 size()
requires sized_range<_Vp>
8062 return __detail::__to_unsigned_like
8063 (__detail::__div_ceil(ranges::distance(_M_base), _M_stride));
8067 size() const requires sized_range<const _Vp>
8069 return __detail::__to_unsigned_like
8070 (__detail::__div_ceil(ranges::distance(_M_base), _M_stride));
8074 template<
typename _Range>
8075 stride_view(_Range&&, range_difference_t<_Range>) -> stride_view<views::all_t<_Range>>;
8077 template<
typename _Vp>
8078 inline constexpr bool enable_borrowed_range<stride_view<_Vp>>
8079 = enable_borrowed_range<_Vp>;
8081 template<input_range _Vp>
8083 template<
bool _Const>
8084 class stride_view<_Vp>::_Iterator :
public __iter_cat<_Const>
8086 using _Parent = __detail::__maybe_const_t<_Const, stride_view>;
8087 using _Base = stride_view::_Base<_Const>;
8089 iterator_t<_Base> _M_current = iterator_t<_Base>();
8090 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
8091 range_difference_t<_Base> _M_stride = 0;
8092 range_difference_t<_Base> _M_missing = 0;
8095 _Iterator(_Parent* __parent, iterator_t<_Base> __current,
8096 range_difference_t<_Base> __missing = 0)
8097 : _M_current(std::
move(__current)), _M_end(ranges::
end(__parent->_M_base)),
8098 _M_stride(__parent->_M_stride), _M_missing(__missing)
8104 if constexpr (random_access_range<_Base>)
8105 return random_access_iterator_tag{};
8106 else if constexpr (bidirectional_range<_Base>)
8107 return bidirectional_iterator_tag{};
8108 else if constexpr (forward_range<_Base>)
8109 return forward_iterator_tag{};
8111 return input_iterator_tag{};
8117 using difference_type = range_difference_t<_Base>;
8118 using value_type = range_value_t<_Base>;
8119 using iterator_concept =
decltype(_S_iter_concept());
8122 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
8125 _Iterator(_Iterator<!_Const> __other)
8127 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
8128 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
8129 : _M_current(std::move(__other._M_current)), _M_end(std::move(__other._M_end)),
8130 _M_stride(__other._M_stride), _M_missing(__other._M_missing)
8133 constexpr iterator_t<_Base>
8137 constexpr const iterator_t<_Base>&
8138 base() const & noexcept
8139 {
return _M_current; }
8141 constexpr decltype(
auto)
8143 {
return *_M_current; }
8145 constexpr _Iterator&
8148 __glibcxx_assert(_M_current != _M_end);
8149 _M_missing = ranges::advance(_M_current, _M_stride, _M_end);
8158 operator++(
int)
requires forward_range<_Base>
8165 constexpr _Iterator&
8166 operator--()
requires bidirectional_range<_Base>
8168 ranges::advance(_M_current, _M_missing - _M_stride);
8174 operator--(
int)
requires bidirectional_range<_Base>
8181 constexpr _Iterator&
8182 operator+=(difference_type __n)
requires random_access_range<_Base>
8186 __glibcxx_assert(ranges::distance(_M_current, _M_end) > _M_stride * (__n - 1));
8187 _M_missing = ranges::advance(_M_current, _M_stride * __n, _M_end);
8191 ranges::advance(_M_current, _M_stride * __n + _M_missing);
8197 constexpr _Iterator&
8198 operator-=(difference_type __n)
requires random_access_range<_Base>
8199 {
return *
this += -__n; }
8201 constexpr decltype(
auto)
operator[](difference_type __n)
const
8202 requires random_access_range<_Base>
8203 {
return *(*
this + __n); }
8205 friend constexpr bool
8206 operator==(
const _Iterator& __x, default_sentinel_t)
8207 {
return __x._M_current == __x._M_end; }
8209 friend constexpr bool
8210 operator==(
const _Iterator& __x,
const _Iterator& __y)
8211 requires equality_comparable<iterator_t<_Base>>
8212 {
return __x._M_current == __y._M_current; }
8214 friend constexpr bool
8215 operator<(
const _Iterator& __x,
const _Iterator& __y)
8216 requires random_access_range<_Base>
8217 {
return __x._M_current < __y._M_current; }
8219 friend constexpr bool
8220 operator>(
const _Iterator& __x,
const _Iterator& __y)
8221 requires random_access_range<_Base>
8222 {
return __y._M_current < __x._M_current; }
8224 friend constexpr bool
8225 operator<=(
const _Iterator& __x,
const _Iterator& __y)
8226 requires random_access_range<_Base>
8227 {
return !(__y._M_current < __x._M_current); }
8229 friend constexpr bool
8230 operator>=(
const _Iterator& __x,
const _Iterator& __y)
8231 requires random_access_range<_Base>
8232 {
return !(__x._M_current < __y._M_current); }
8234 friend constexpr auto
8235 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
8236 requires random_access_range<_Base> && three_way_comparable<iterator_t<_Base>>
8237 {
return __x._M_current <=> __y._M_current; }
8239 friend constexpr _Iterator
8240 operator+(
const _Iterator& __i, difference_type __n)
8241 requires random_access_range<_Base>
8248 friend constexpr _Iterator
8249 operator+(difference_type __n,
const _Iterator& __i)
8250 requires random_access_range<_Base>
8251 {
return __i + __n; }
8253 friend constexpr _Iterator
8254 operator-(
const _Iterator& __i, difference_type __n)
8255 requires random_access_range<_Base>
8262 friend constexpr difference_type
8263 operator-(
const _Iterator& __x,
const _Iterator& __y)
8264 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
8266 auto __n = __x._M_current - __y._M_current;
8267 if constexpr (forward_range<_Base>)
8268 return (__n + __x._M_missing - __y._M_missing) / __x._M_stride;
8270 return -__detail::__div_ceil(-__n, __x._M_stride);
8272 return __detail::__div_ceil(__n, __x._M_stride);
8275 friend constexpr difference_type
8276 operator-(default_sentinel_t,
const _Iterator& __x)
8277 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
8278 {
return __detail::__div_ceil(__x._M_end - __x._M_current, __x._M_stride); }
8280 friend constexpr difference_type
8281 operator-(
const _Iterator& __x, default_sentinel_t __y)
8282 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
8283 {
return -(__y - __x); }
8285 friend constexpr range_rvalue_reference_t<_Base>
8286 iter_move(
const _Iterator& __i)
8287 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
8288 {
return ranges::iter_move(__i._M_current); }
8290 friend constexpr void
8291 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
8292 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
8293 requires indirectly_swappable<iterator_t<_Base>>
8294 { ranges::iter_swap(__x._M_current, __y._M_current); }
8301 template<
typename _Range,
typename _Dp>
8302 concept __can_stride_view
8306 struct _Stride : __adaptor::_RangeAdaptor<_Stride>
8308 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
8309 requires __detail::__can_stride_view<_Range, _Dp>
8311 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
8314 using __adaptor::_RangeAdaptor<_Stride>::operator();
8315 static constexpr int _S_arity = 2;
8316 static constexpr bool _S_has_simple_extra_args =
true;
8319 inline constexpr _Stride stride;
8323#ifdef __cpp_lib_ranges_cartesian_product
8326 template<
bool _Const,
typename _First,
typename... _Vs>
8327 concept __cartesian_product_is_random_access
8328 = (random_access_range<__maybe_const_t<_Const, _First>>
8330 && (random_access_range<__maybe_const_t<_Const, _Vs>>
8331 && sized_range<__maybe_const_t<_Const, _Vs>>));
8333 template<
typename _Range>
8334 concept __cartesian_product_common_arg
8335 = common_range<_Range> || (sized_range<_Range> && random_access_range<_Range>);
8337 template<
bool _Const,
typename _First,
typename... _Vs>
8338 concept __cartesian_product_is_bidirectional
8339 = (bidirectional_range<__maybe_const_t<_Const, _First>>
8341 && (bidirectional_range<__maybe_const_t<_Const, _Vs>>
8342 && __cartesian_product_common_arg<__maybe_const_t<_Const, _Vs>>));
8344 template<
typename _First,
typename... _Vs>
8345 concept __cartesian_product_is_common = __cartesian_product_common_arg<_First>;
8347 template<
typename... _Vs>
8348 concept __cartesian_product_is_sized = (sized_range<_Vs> && ...);
8350 template<
bool _Const,
template<
typename>
class FirstSent,
typename _First,
typename... _Vs>
8351 concept __cartesian_is_sized_sentinel
8352 = (sized_sentinel_for<FirstSent<__maybe_const_t<_Const, _First>>,
8353 iterator_t<__maybe_const_t<_Const, _First>>>
8355 && (sized_range<__maybe_const_t<_Const, _Vs>>
8356 && sized_sentinel_for<iterator_t<__maybe_const_t<_Const, _Vs>>,
8357 iterator_t<__maybe_const_t<_Const, _Vs>>>));
8359 template<__cartesian_product_common_arg _Range>
8361 __cartesian_common_arg_end(_Range& __r)
8363 if constexpr (common_range<_Range>)
8364 return ranges::end(__r);
8366 return ranges::begin(__r) + ranges::distance(__r);
8370 template<input_range _First, forward_range... _Vs>
8371 requires (view<_First> && ... && view<_Vs>)
8372 class cartesian_product_view : public view_interface<cartesian_product_view<_First, _Vs...>>
8374 tuple<_First, _Vs...> _M_bases;
8376 template<
bool>
class _Iterator;
8379 _S_difference_type()
8385 range_difference_t<_First>,
8386 range_difference_t<_Vs>...>{};
8390 cartesian_product_view() =
default;
8393 cartesian_product_view(_First __first, _Vs... __rest)
8397 constexpr _Iterator<false>
8398 begin()
requires (!__detail::__simple_view<_First> || ... || !__detail::__simple_view<_Vs>)
8399 {
return _Iterator<false>(*
this, __detail::__tuple_transform(ranges::begin, _M_bases)); }
8401 constexpr _Iterator<true>
8402 begin() const requires (range<const _First> && ... && range<const _Vs>)
8403 {
return _Iterator<true>(*
this, __detail::__tuple_transform(ranges::begin, _M_bases)); }
8405 constexpr _Iterator<false>
8406 end()
requires ((!__detail::__simple_view<_First> || ... || !__detail::__simple_view<_Vs>)
8407 && __detail::__cartesian_product_is_common<_First, _Vs...>)
8410 using _Ret = tuple<iterator_t<_First>, iterator_t<_Vs>...>;
8411 bool __empty_tail = (ranges::empty(std::get<1 + _Is>(_M_bases)) || ...);
8412 auto& __first = std::get<0>(_M_bases);
8413 return _Ret{(__empty_tail
8414 ? ranges::begin(__first)
8415 : __detail::__cartesian_common_arg_end(__first)),
8416 ranges::
begin(
std::get<1 + _Is>(_M_bases))...};
8419 return _Iterator<false>{*
this,
std::move(__its)};
8422 constexpr _Iterator<true>
8423 end() const requires __detail::__cartesian_product_is_common<const _First, const _Vs...>
8426 using _Ret = tuple<iterator_t<const _First>, iterator_t<const _Vs>...>;
8427 bool __empty_tail = (ranges::empty(std::get<1 + _Is>(_M_bases)) || ...);
8428 auto& __first = std::get<0>(_M_bases);
8429 return _Ret{(__empty_tail
8430 ? ranges::begin(__first)
8431 : __detail::__cartesian_common_arg_end(__first)),
8432 ranges::
begin(
std::get<1 + _Is>(_M_bases))...};
8435 return _Iterator<true>{*
this,
std::move(__its)};
8438 constexpr default_sentinel_t
8439 end() const noexcept
8443 size()
requires __detail::__cartesian_product_is_sized<_First, _Vs...>
8445 using _ST = __detail::__make_unsigned_like_t<
decltype(_S_difference_type())>;
8447 auto __size =
static_cast<_ST
>(1);
8448#ifdef _GLIBCXX_ASSERTIONS
8449 if constexpr (integral<_ST>)
8452 = (__builtin_mul_overflow(__size,
8453 static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))),
8456 __glibcxx_assert(!__overflow);
8460 __size = (
static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))) * ...);
8466 size() const requires __detail::__cartesian_product_is_sized<const _First, const _Vs...>
8468 using _ST = __detail::__make_unsigned_like_t<
decltype(_S_difference_type())>;
8470 auto __size =
static_cast<_ST
>(1);
8471#ifdef _GLIBCXX_ASSERTIONS
8472 if constexpr (integral<_ST>)
8475 = (__builtin_mul_overflow(__size,
8476 static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))),
8479 __glibcxx_assert(!__overflow);
8483 __size = (
static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))) * ...);
8489 template<
typename... _Vs>
8490 cartesian_product_view(_Vs&&...) -> cartesian_product_view<views::all_t<_Vs>...>;
8492 template<input_range _First, forward_range... _Vs>
8493 requires (view<_First> && ... && view<_Vs>)
8494 template<bool _Const>
8495 class cartesian_product_view<_First, _Vs...>::_Iterator
8497 using _Parent = __maybe_const_t<_Const, cartesian_product_view>;
8498 _Parent* _M_parent =
nullptr;
8499 tuple<iterator_t<__maybe_const_t<_Const, _First>>,
8500 iterator_t<__maybe_const_t<_Const, _Vs>>...> _M_current;
8503 _Iterator(_Parent& __parent,
decltype(_M_current) __current)
8505 _M_current(
std::
move(__current))
8511 if constexpr (__detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>)
8512 return random_access_iterator_tag{};
8513 else if constexpr (__detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>)
8514 return bidirectional_iterator_tag{};
8515 else if constexpr (forward_range<__maybe_const_t<_Const, _First>>)
8516 return forward_iterator_tag{};
8518 return input_iterator_tag{};
8521 friend cartesian_product_view;
8524 using iterator_category = input_iterator_tag;
8525 using iterator_concept =
decltype(_S_iter_concept());
8527 = tuple<range_value_t<__maybe_const_t<_Const, _First>>,
8528 range_value_t<__maybe_const_t<_Const, _Vs>>...>;
8530 = tuple<range_reference_t<__maybe_const_t<_Const, _First>>,
8531 range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
8532 using difference_type =
decltype(cartesian_product_view::_S_difference_type());
8534 _Iterator() =
default;
8537 _Iterator(_Iterator<!_Const> __i)
8539 && (convertible_to<iterator_t<_First>, iterator_t<const _First>>
8540 && ... && convertible_to<iterator_t<_Vs>, iterator_t<const _Vs>>)
8542 _M_current(
std::
move(__i._M_current))
8548 auto __f = [](
auto& __i) ->
decltype(
auto) {
8551 return __detail::__tuple_transform(__f, _M_current);
8554 constexpr _Iterator&
8566 operator++(
int)
requires forward_range<__maybe_const_t<_Const, _First>>
8573 constexpr _Iterator&
8575 requires __detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>
8583 requires __detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>
8590 constexpr _Iterator&
8591 operator+=(difference_type __x)
8592 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8598 constexpr _Iterator&
8599 operator-=(difference_type __x)
8600 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8601 {
return *
this += -__x; }
8604 operator[](difference_type __n)
const
8605 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8606 {
return *((*this) + __n); }
8608 friend constexpr bool
8609 operator==(
const _Iterator& __x,
const _Iterator& __y)
8610 requires equality_comparable<iterator_t<__maybe_const_t<_Const, _First>>>
8611 {
return __x._M_current == __y._M_current; }
8613 friend constexpr bool
8614 operator==(
const _Iterator& __x, default_sentinel_t)
8617 return ((std::get<_Is>(__x._M_current)
8618 == ranges::end(std::get<_Is>(__x._M_parent->_M_bases)))
8623 friend constexpr auto
8624 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
8625 requires __detail::__all_random_access<_Const, _First, _Vs...>
8626 {
return __x._M_current <=> __y._M_current; }
8628 friend constexpr _Iterator
8629 operator+(_Iterator __x, difference_type __y)
8630 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8631 {
return __x += __y; }
8633 friend constexpr _Iterator
8634 operator+(difference_type __x, _Iterator __y)
8635 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8636 {
return __y += __x; }
8638 friend constexpr _Iterator
8639 operator-(_Iterator __x, difference_type __y)
8640 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8641 {
return __x -= __y; }
8643 friend constexpr difference_type
8644 operator-(
const _Iterator& __x,
const _Iterator& __y)
8645 requires __detail::__cartesian_is_sized_sentinel<_Const, iterator_t, _First, _Vs...>
8646 {
return __x._M_distance_from(__y._M_current); }
8648 friend constexpr difference_type
8649 operator-(
const _Iterator& __i, default_sentinel_t)
8650 requires __detail::__cartesian_is_sized_sentinel<_Const, sentinel_t, _First, _Vs...>
8653 return tuple{ranges::end(std::get<0>(__i._M_parent->_M_bases)),
8654 ranges::begin(std::get<1 + _Is>(__i._M_parent->_M_bases))...};
8656 return __i._M_distance_from(__end_tuple);
8659 friend constexpr difference_type
8660 operator-(default_sentinel_t,
const _Iterator& __i)
8661 requires __detail::__cartesian_is_sized_sentinel<_Const, sentinel_t, _First, _Vs...>
8664 friend constexpr auto
8665 iter_move(
const _Iterator& __i)
8666 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
8668 friend constexpr void
8669 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
8670 requires (indirectly_swappable<iterator_t<__maybe_const_t<_Const, _First>>>
8672 && indirectly_swappable<iterator_t<__maybe_const_t<_Const, _Vs>>>)
8675 (ranges::iter_swap(std::get<_Is>(__l._M_current), std::get<_Is>(__r._M_current)), ...);
8680 template<
size_t _Nm =
sizeof...(_Vs)>
8684 auto& __it = std::get<_Nm>(_M_current);
8686 if constexpr (_Nm > 0)
8687 if (__it == ranges::end(std::get<_Nm>(_M_parent->_M_bases)))
8689 __it = ranges::begin(std::get<_Nm>(_M_parent->_M_bases));
8694 template<
size_t _Nm =
sizeof...(_Vs)>
8698 auto& __it = std::get<_Nm>(_M_current);
8699 if constexpr (_Nm > 0)
8700 if (__it == ranges::begin(std::get<_Nm>(_M_parent->_M_bases)))
8702 __it = __detail::__cartesian_common_arg_end(std::get<_Nm>(_M_parent->_M_bases));
8708 template<
size_t _Nm =
sizeof...(_Vs)>
8710 _M_advance(difference_type __x)
8711 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8720 auto& __r = std::get<_Nm>(_M_parent->_M_bases);
8721 auto& __it = std::get<_Nm>(_M_current);
8722 if constexpr (_Nm == 0)
8724#ifdef _GLIBCXX_ASSERTIONS
8725 if constexpr (sized_range<__maybe_const_t<_Const, _First>>)
8727 auto __size = ranges::ssize(__r);
8728 auto __begin = ranges::begin(__r);
8729 auto __offset = __it - __begin;
8730 __glibcxx_assert(__offset + __x >= 0 && __offset + __x <= __size);
8737 auto __size = ranges::ssize(__r);
8738 auto __begin = ranges::begin(__r);
8739 auto __offset = __it - __begin;
8741 __x = __offset / __size;
8745 __offset = __size + __offset;
8748 __it = __begin + __offset;
8749 _M_advance<_Nm - 1>(__x);
8754 template<
typename _Tuple>
8755 constexpr difference_type
8756 _M_distance_from(
const _Tuple& __t)
const
8759 auto __sum =
static_cast<difference_type
>(0);
8760#ifdef _GLIBCXX_ASSERTIONS
8761 if constexpr (integral<difference_type>)
8764 = (__builtin_add_overflow(__sum, _M_scaled_distance<_Is>(__t), &__sum)
8766 __glibcxx_assert(!__overflow);
8770 __sum = (_M_scaled_distance<_Is>(__t) + ...);
8775 template<
size_t _Nm,
typename _Tuple>
8776 constexpr difference_type
8777 _M_scaled_distance(
const _Tuple& __t)
const
8779 auto __dist =
static_cast<difference_type
>(std::get<_Nm>(_M_current)
8780 - std::get<_Nm>(__t));
8781#ifdef _GLIBCXX_ASSERTIONS
8782 if constexpr (integral<difference_type>)
8784 bool __overflow = __builtin_mul_overflow(__dist, _M_scaled_size<_Nm+1>(), &__dist);
8785 __glibcxx_assert(!__overflow);
8789 __dist *= _M_scaled_size<_Nm+1>();
8793 template<
size_t _Nm>
8794 constexpr difference_type
8795 _M_scaled_size()
const
8797 if constexpr (_Nm <=
sizeof...(_Vs))
8799 auto __size =
static_cast<difference_type
>(ranges::size
8800 (std::get<_Nm>(_M_parent->_M_bases)));
8801#ifdef _GLIBCXX_ASSERTIONS
8802 if constexpr (integral<difference_type>)
8804 bool __overflow = __builtin_mul_overflow(__size, _M_scaled_size<_Nm+1>(), &__size);
8805 __glibcxx_assert(!__overflow);
8809 __size *= _M_scaled_size<_Nm+1>();
8813 return static_cast<difference_type
>(1);
8821 template<
typename... _Ts>
8822 concept __can_cartesian_product_view
8826 struct _CartesianProduct
8828 template<
typename... _Ts>
8829 requires (
sizeof...(_Ts) == 0 || __detail::__can_cartesian_product_view<_Ts...>)
8831 operator() [[nodiscard]] (_Ts&&... __ts)
const
8833 if constexpr (
sizeof...(_Ts) == 0)
8834 return views::single(tuple{});
8840 inline constexpr _CartesianProduct cartesian_product;
8844#ifdef __cpp_lib_ranges_as_rvalue
8845 template<input_range _Vp>
8847 class as_rvalue_view :
public view_interface<as_rvalue_view<_Vp>>
8849 _Vp _M_base = _Vp();
8852 as_rvalue_view()
requires default_initializable<_Vp> = default;
8855 as_rvalue_view(_Vp __base)
8856 : _M_base(std::move(__base))
8860 base() const& requires copy_constructible<_Vp>
8868 begin()
requires (!__detail::__simple_view<_Vp>)
8869 {
return move_iterator(ranges::begin(_M_base)); }
8872 begin() const requires range<const _Vp>
8873 {
return move_iterator(ranges::begin(_M_base)); }
8876 end()
requires (!__detail::__simple_view<_Vp>)
8878 if constexpr (common_range<_Vp>)
8879 return move_iterator(ranges::end(_M_base));
8881 return move_sentinel(ranges::end(_M_base));
8885 end() const requires range<const _Vp>
8887 if constexpr (common_range<const _Vp>)
8888 return move_iterator(ranges::end(_M_base));
8890 return move_sentinel(ranges::end(_M_base));
8894 size()
requires sized_range<_Vp>
8895 {
return ranges::size(_M_base); }
8898 size() const requires sized_range<const _Vp>
8899 {
return ranges::size(_M_base); }
8902 template<
typename _Range>
8903 as_rvalue_view(_Range&&) -> as_rvalue_view<views::all_t<_Range>>;
8905 template<
typename _Tp>
8906 inline constexpr bool enable_borrowed_range<as_rvalue_view<_Tp>>
8907 = enable_borrowed_range<_Tp>;
8913 template<
typename _Tp>
8914 concept __can_as_rvalue_view =
requires { as_rvalue_view(
std::declval<_Tp>()); };
8917 struct _AsRvalue : __adaptor::_RangeAdaptorClosure<_AsRvalue>
8919 template<viewable_range _Range>
8920 requires __detail::__can_as_rvalue_view<_Range>
8922 operator() [[nodiscard]] (_Range&& __r)
const
8924 if constexpr (same_as<range_rvalue_reference_t<_Range>,
8925 range_reference_t<_Range>>)
8932 inline constexpr _AsRvalue as_rvalue;
8936#ifdef __cpp_lib_ranges_enumerate
8939 template<
typename _Range>
8940 concept __range_with_movable_reference = input_range<_Range>
8941 && move_constructible<range_reference_t<_Range>>
8942 && move_constructible<range_rvalue_reference_t<_Range>>;
8946 requires __detail::__range_with_movable_reference<_Vp>
8947 class enumerate_view :
public view_interface<enumerate_view<_Vp>>
8949 _Vp _M_base = _Vp();
8951 template<
bool _Const>
class _Iterator;
8952 template<
bool _Const>
class _Sentinel;
8955 enumerate_view()
requires default_initializable<_Vp> = default;
8958 enumerate_view(_Vp __base)
8959 : _M_base(std::move(__base))
8963 begin()
requires (!__detail::__simple_view<_Vp>)
8964 {
return _Iterator<false>(ranges::begin(_M_base), 0); }
8967 begin() const requires __detail::__range_with_movable_reference<const _Vp>
8968 {
return _Iterator<true>(ranges::begin(_M_base), 0); }
8971 end()
requires (!__detail::__simple_view<_Vp>)
8973 if constexpr (common_range<_Vp> && sized_range<_Vp>)
8974 return _Iterator<false>(ranges::end(_M_base), ranges::distance(_M_base));
8976 return _Sentinel<false>(ranges::end(_M_base));
8980 end() const requires __detail::__range_with_movable_reference<const _Vp>
8982 if constexpr (common_range<const _Vp> && sized_range<const _Vp>)
8983 return _Iterator<true>(ranges::end(_M_base), ranges::distance(_M_base));
8985 return _Sentinel<true>(ranges::end(_M_base));
8989 size()
requires sized_range<_Vp>
8990 {
return ranges::size(_M_base); }
8993 size() const requires sized_range<const _Vp>
8994 {
return ranges::size(_M_base); }
8997 base() const & requires copy_constructible<_Vp>
9005 template<
typename _Range>
9006 enumerate_view(_Range&&) -> enumerate_view<views::all_t<_Range>>;
9008 template<
typename _Tp>
9009 inline constexpr bool enable_borrowed_range<enumerate_view<_Tp>>
9010 = enable_borrowed_range<_Tp>;
9013 requires __detail::__range_with_movable_reference<_Vp>
9014 template<
bool _Const>
9015 class enumerate_view<_Vp>::_Iterator
9017 using _Base = __maybe_const_t<_Const, _Vp>;
9022 if constexpr (random_access_range<_Base>)
9023 return random_access_iterator_tag{};
9024 else if constexpr (bidirectional_range<_Base>)
9025 return bidirectional_iterator_tag{};
9026 else if constexpr (forward_range<_Base>)
9027 return forward_iterator_tag{};
9029 return input_iterator_tag{};
9032 friend enumerate_view;
9035 using iterator_category = input_iterator_tag;
9036 using iterator_concept =
decltype(_S_iter_concept());
9037 using difference_type = range_difference_t<_Base>;
9038 using value_type = tuple<difference_type, range_value_t<_Base>>;
9041 using __reference_type = tuple<difference_type, range_reference_t<_Base>>;
9043 iterator_t<_Base> _M_current = iterator_t<_Base>();
9044 difference_type _M_pos = 0;
9047 _Iterator(iterator_t<_Base> __current, difference_type __pos)
9048 : _M_current(std::
move(__current)), _M_pos(__pos)
9052 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
9055 _Iterator(_Iterator<!_Const> __i)
9056 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
9057 : _M_current(std::move(__i._M_current)), _M_pos(__i._M_pos)
9060 constexpr const iterator_t<_Base> &
9061 base() const & noexcept
9062 {
return _M_current; }
9064 constexpr iterator_t<_Base>
9068 constexpr difference_type
9069 index() const noexcept
9074 {
return __reference_type(_M_pos, *_M_current); }
9076 constexpr _Iterator&
9089 operator++(
int)
requires forward_range<_Base>
9096 constexpr _Iterator&
9097 operator--()
requires bidirectional_range<_Base>
9105 operator--(
int)
requires bidirectional_range<_Base>
9112 constexpr _Iterator&
9113 operator+=(difference_type __n)
requires random_access_range<_Base>
9120 constexpr _Iterator&
9121 operator-=(difference_type __n)
requires random_access_range<_Base>
9129 operator[](difference_type __n)
const requires random_access_range<_Base>
9130 {
return __reference_type(_M_pos + __n, _M_current[__n]); }
9132 friend constexpr bool
9133 operator==(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9134 {
return __x._M_pos == __y._M_pos; }
9136 friend constexpr strong_ordering
9137 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9138 {
return __x._M_pos <=> __y._M_pos; }
9140 friend constexpr _Iterator
9141 operator+(
const _Iterator& __x, difference_type __y)
9142 requires random_access_range<_Base>
9143 {
return (
auto(__x) += __y); }
9145 friend constexpr _Iterator
9146 operator+(difference_type __x,
const _Iterator& __y)
9147 requires random_access_range<_Base>
9148 {
return auto(__y) += __x; }
9150 friend constexpr _Iterator
9151 operator-(
const _Iterator& __x, difference_type __y)
9152 requires random_access_range<_Base>
9153 {
return auto(__x) -= __y; }
9155 friend constexpr difference_type
9156 operator-(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9157 {
return __x._M_pos - __y._M_pos; }
9159 friend constexpr auto
9160 iter_move(
const _Iterator& __i)
9161 noexcept(
noexcept(ranges::iter_move(__i._M_current))
9162 && is_nothrow_move_constructible_v<range_rvalue_reference_t<_Base>>)
9164 return tuple<difference_type, range_rvalue_reference_t<_Base>>
9165 (__i._M_pos, ranges::iter_move(__i._M_current));
9170 requires __detail::__range_with_movable_reference<_Vp>
9171 template<
bool _Const>
9172 class enumerate_view<_Vp>::_Sentinel
9174 using _Base = __maybe_const_t<_Const, _Vp>;
9176 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
9179 _Sentinel(sentinel_t<_Base> __end)
9180 : _M_end(std::
move(__end))
9183 friend enumerate_view;
9186 _Sentinel() =
default;
9189 _Sentinel(_Sentinel<!_Const> __other)
9190 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
9194 constexpr sentinel_t<_Base>
9198 template<
bool _OtherConst>
9199 requires sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9200 friend constexpr bool
9201 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
9202 {
return __x._M_current == __y._M_end; }
9204 template<
bool _OtherConst>
9205 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9206 friend constexpr range_difference_t<__maybe_const_t<_OtherConst, _Vp>>
9207 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
9208 {
return __x._M_current - __y._M_end; }
9210 template<
bool _OtherConst>
9211 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9212 friend constexpr range_difference_t<__maybe_const_t<_OtherConst, _Vp>>
9213 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
9214 {
return __x._M_end - __y._M_current; }
9221 template<
typename _Tp>
9222 concept __can_enumerate_view
9226 struct _Enumerate : __adaptor::_RangeAdaptorClosure<_Enumerate>
9228 template<viewable_range _Range>
9229 requires __detail::__can_enumerate_view<_Range>
9231 operator() [[nodiscard]] (_Range&& __r)
const
9235 inline constexpr _Enumerate enumerate;
9239#ifdef __cpp_lib_ranges_as_const
9241 requires input_range<_Vp>
9242 class as_const_view :
public view_interface<as_const_view<_Vp>>
9244 _Vp _M_base = _Vp();
9247 as_const_view()
requires default_initializable<_Vp> = default;
9250 as_const_view(_Vp __base)
9251 noexcept(is_nothrow_move_constructible_v<_Vp>)
9252 : _M_base(std::move(__base))
9257 noexcept(is_nothrow_copy_constructible_v<_Vp>)
9258 requires copy_constructible<_Vp>
9263 noexcept(is_nothrow_move_constructible_v<_Vp>)
9267 begin()
requires (!__detail::__simple_view<_Vp>)
9268 {
return ranges::cbegin(_M_base); }
9271 begin() const requires range<const _Vp>
9272 {
return ranges::cbegin(_M_base); }
9275 end()
requires (!__detail::__simple_view<_Vp>)
9276 {
return ranges::cend(_M_base); }
9279 end() const requires range<const _Vp>
9280 {
return ranges::cend(_M_base); }
9283 size()
requires sized_range<_Vp>
9284 {
return ranges::size(_M_base); }
9287 size() const requires sized_range<const _Vp>
9288 {
return ranges::size(_M_base); }
9291 template<
typename _Range>
9292 as_const_view(_Range&&) -> as_const_view<views::all_t<_Range>>;
9294 template<
typename _Tp>
9295 inline constexpr bool enable_borrowed_range<as_const_view<_Tp>>
9296 = enable_borrowed_range<_Tp>;
9302 template<
typename _Tp>
9303 inline constexpr bool __is_constable_ref_view =
false;
9305 template<
typename _Range>
9306 inline constexpr bool __is_constable_ref_view<ref_view<_Range>>
9307 = constant_range<const _Range>;
9309 template<
typename _Range>
9313 struct _AsConst : __adaptor::_RangeAdaptorClosure<_AsConst>
9315 template<viewable_range _Range>
9317 operator()(_Range&& __r)
const
9319 requires __detail::__can_as_const_view<_Range>
9321 using _Tp = remove_cvref_t<_Range>;
9322 using element_type = remove_reference_t<range_reference_t<_Range>>;
9323 if constexpr (constant_range<views::all_t<_Range>>)
9325 else if constexpr (__detail::__is_empty_view<_Tp>)
9326 return views::empty<const element_type>;
9327#if __cpp_lib_optional >= 202506L && __cpp_lib_optional_range_support
9328 else if constexpr (__is_optional_ref_v<_Tp>)
9329 return optional<const typename _Tp::value_type&>(__r);
9331 else if constexpr (std::__detail::__is_span<_Tp>)
9333 else if constexpr (__detail::__is_constable_ref_view<_Tp>)
9335 else if constexpr (is_lvalue_reference_v<_Range>
9336 && constant_range<const _Tp>
9338 return ref_view(
static_cast<const _Tp&
>(__r));
9344 inline constexpr _AsConst as_const;
9349 namespace views = ranges::views;
9351#if __cpp_lib_ranges_to_container
9357 template<
typename _Container>
9358 constexpr bool __reservable_container
9359 = sized_range<_Container>
9360 &&
requires(_Container& __c, range_size_t<_Container> __n) {
9362 { __c.capacity() } -> same_as<
decltype(__n)>;
9363 { __c.max_size() } -> same_as<
decltype(__n)>;
9366 template<
typename _Cont,
typename _Range>
9367 constexpr bool __toable =
requires {
9368 requires (!input_range<_Cont>
9369 || convertible_to<range_reference_t<_Range>,
9370 range_value_t<_Cont>>);
9391 template<
typename _Cont, input_range _Rg,
typename... _Args>
9392 requires (!view<_Cont>)
9394 to [[nodiscard]] (_Rg&& __r, _Args&&... __args)
9396 static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
9397 static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
9399 if constexpr (__detail::__toable<_Cont, _Rg>)
9401 if constexpr (constructible_from<_Cont, _Rg, _Args...>)
9404 else if constexpr (constructible_from<_Cont, from_range_t, _Rg, _Args...>)
9407 else if constexpr (
requires {
requires common_range<_Rg>;
9408 typename __iter_category_t<iterator_t<_Rg>>;
9409 requires derived_from<__iter_category_t<iterator_t<_Rg>>,
9410 input_iterator_tag>;
9411 requires constructible_from<_Cont, iterator_t<_Rg>,
9412 sentinel_t<_Rg>, _Args...>;
9414 return _Cont(ranges::begin(__r), ranges::end(__r),
9418 static_assert(constructible_from<_Cont, _Args...>);
9420 if constexpr (sized_range<_Rg>
9421 && __detail::__reservable_container<_Cont>)
9422 __c.reserve(
static_cast<range_size_t<_Cont>
>(ranges::size(__r)));
9426 auto __it = ranges::begin(__r);
9427 const auto __sent = ranges::end(__r);
9428 while (__it != __sent)
9430 if constexpr (
requires { __c.emplace_back(*__it); })
9431 __c.emplace_back(*__it);
9432 else if constexpr (
requires { __c.push_back(*__it); })
9433 __c.push_back(*__it);
9434 else if constexpr (
requires { __c.emplace(__c.end(), *__it); })
9435 __c.emplace(__c.end(), *__it);
9437 __c.insert(__c.end(), *__it);
9445 static_assert(input_range<range_reference_t<_Rg>>);
9448 return ranges::to<_Cont>(ref_view(__r) | views::transform(
9449 []<
typename _Elt>(_Elt&& __elem) {
9450 using _ValT = range_value_t<_Cont>;
9459 template<
typename _Rg>
9462 using iterator_category = input_iterator_tag;
9463 using value_type = range_value_t<_Rg>;
9464 using difference_type = ptrdiff_t;
9465 using pointer = add_pointer_t<range_reference_t<_Rg>>;
9466 using reference = range_reference_t<_Rg>;
9468 pointer operator->()
const;
9469 _InputIter& operator++();
9470 _InputIter operator++(
int);
9471 bool operator==(
const _InputIter&)
const;
9474 template<
template<
typename...>
typename _Cont, input_range _Rg,
9479 template<
template<
typename...>
typename _Cont, input_range _Rg,
9485 template<
template<
typename...>
typename _Cont, input_range _Rg,
9495 template<
template<
typename...>
typename _Cont, input_range _Rg,
9498 to [[nodiscard]] (_Rg&& __r, _Args&&... __args)
9500 using __detail::_DeduceExpr1;
9501 using __detail::_DeduceExpr2;
9502 using __detail::_DeduceExpr3;
9503 if constexpr (
requires {
typename _DeduceExpr1<_Cont, _Rg, _Args...>; })
9504 return ranges::to<_DeduceExpr1<_Cont, _Rg, _Args...>>(
9506 else if constexpr (
requires {
typename _DeduceExpr2<_Cont, _Rg, _Args...>; })
9507 return ranges::to<_DeduceExpr2<_Cont, _Rg, _Args...>>(
9509 else if constexpr (
requires {
typename _DeduceExpr3<_Cont, _Rg, _Args...>; })
9510 return ranges::to<_DeduceExpr3<_Cont, _Rg, _Args...>>(
9513 static_assert(
false);
9519 template<
typename _Cont>
9522 template<
typename _Range,
typename... _Args>
9526 operator()(_Range&& __r, _Args&&... __args)
const
9550 template<
typename _Cont,
typename... _Args>
9551 requires (!view<_Cont>)
9553 to [[nodiscard]] (_Args&&... __args)
9555 static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
9556 static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
9558 using __detail::_To;
9559 using views::__adaptor::_Partial;
9566 template<
template<
typename...>
typename _Cont>
9569 template<
typename _Range,
typename... _Args>
9573 operator()(_Range&& __r, _Args&&... __args)
const
9599 template<
template<
typename...>
typename _Cont,
typename... _Args>
9601 to [[nodiscard]] (_Args&&... __args)
9603 using __detail::_To2;
9604 using views::__adaptor::_Partial;
9611#if __cpp_lib_ranges_concat
9616 template<
typename... _Rs>
9617 using __concat_reference_t = common_reference_t<range_reference_t<_Rs>...>;
9619 template<
typename... _Rs>
9620 using __concat_value_t = common_type_t<range_value_t<_Rs>...>;
9622 template<
typename... _Rs>
9623 using __concat_rvalue_reference_t
9624 = common_reference_t<range_rvalue_reference_t<_Rs>...>;
9626 template<
typename _Ref,
typename _RRef,
typename _It>
9627 concept __concat_indirectly_readable_impl =
requires(
const _It __it) {
9628 { *__it } -> convertible_to<_Ref>;
9629 { ranges::iter_move(__it) } -> convertible_to<_RRef>;
9632 template<
typename... _Rs>
9633 concept __concat_indirectly_readable
9634 = common_reference_with<__concat_reference_t<_Rs...>&&, __concat_value_t<_Rs...>&>
9635 && common_reference_with<__concat_reference_t<_Rs...>&&,
9636 __concat_rvalue_reference_t<_Rs...>&&>
9637 && common_reference_with<__concat_rvalue_reference_t<_Rs...>&&,
9638 __concat_value_t<_Rs...>
const&>
9639 && (__concat_indirectly_readable_impl<__concat_reference_t<_Rs...>,
9640 __concat_rvalue_reference_t<_Rs...>,
9644 template<
typename... _Rs>
9645 concept __concatable =
requires {
9646 typename __concat_reference_t<_Rs...>;
9647 typename __concat_value_t<_Rs...>;
9648 typename __concat_rvalue_reference_t<_Rs...>;
9649 } && __concat_indirectly_readable<_Rs...>;
9651 template<
bool _Const,
typename _Range,
typename... _Rs>
9652 struct __all_but_last_common
9654 static inline constexpr bool value
9655 =
requires {
requires (common_range<__maybe_const_t<_Const, _Range>>
9656 && __all_but_last_common<_Const, _Rs...>::value); };
9659 template<
bool _Const,
typename _Range>
9660 struct __all_but_last_common<_Const, _Range>
9661 {
static inline constexpr bool value =
true; };
9663 template<
bool _Const,
typename... _Rs>
9664 concept __concat_is_random_access = __all_random_access<_Const, _Rs...>
9665 && __all_but_last_common<_Const, _Rs...>::value;
9667 template<
bool _Const,
typename... _Rs>
9668 concept __concat_is_bidirectional = __all_bidirectional<_Const, _Rs...>
9669 && __all_but_last_common<_Const, _Rs...>::value;
9671 template<
typename _Range,
typename... _Rs>
9672 struct __all_but_first_sized
9673 {
static inline constexpr bool value = (sized_range<_Rs> && ...); };
9676 template<input_range... _Vs>
9677 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && __detail::__concatable<_Vs...>
9678 class concat_view : public view_interface<concat_view<_Vs...>>
9680 tuple<_Vs...> _M_views;
9682 template<
bool _Const>
class _Iterator;
9685 constexpr concat_view() =
default;
9688 concat_view(_Vs... __views)
9689 : _M_views(std::
move(__views)...)
9692 constexpr _Iterator<false>
9693 begin()
requires (!(__detail::__simple_view<_Vs> && ...))
9695 _Iterator<false> __it(
this, in_place_index<0>, ranges::begin(std::get<0>(_M_views)));
9696 __it.template _M_satisfy<0>();
9700 constexpr _Iterator<true>
9701 begin() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
9703 _Iterator<true> __it(
this, in_place_index<0>, ranges::begin(std::get<0>(_M_views)));
9704 __it.template _M_satisfy<0>();
9709 end()
requires (!(__detail::__simple_view<_Vs> && ...))
9711 constexpr auto __n =
sizeof...(_Vs);
9712 if constexpr (__detail::__all_forward<
false, _Vs...>
9713 && common_range<_Vs...[__n - 1]>)
9714 return _Iterator<false>(
this, in_place_index<__n - 1>,
9715 ranges::end(std::get<__n - 1>(_M_views)));
9721 end() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
9723 constexpr auto __n =
sizeof...(_Vs);
9724 if constexpr (__detail::__all_forward<
true, _Vs...>
9725 && common_range<
const _Vs...[__n - 1]>)
9726 return _Iterator<true>(
this, in_place_index<__n - 1>,
9727 ranges::end(std::get<__n - 1>(_M_views)));
9733 size()
requires (sized_range<_Vs>&&...)
9735 return std::apply([](
auto... __sizes) {
9736 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(__sizes)...>>;
9737 return (_CT(__sizes) + ...);
9738 }, __detail::__tuple_transform(ranges::size, _M_views));
9742 size() const requires (sized_range<const _Vs>&&...)
9744 return std::apply([](
auto... __sizes) {
9745 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(__sizes)...>>;
9746 return (_CT(__sizes) + ...);
9747 }, __detail::__tuple_transform(ranges::size, _M_views));
9751 template<
typename... _Rs>
9752 concat_view(_Rs&&...) -> concat_view<views::all_t<_Rs>...>;
9756 template<
bool _Const,
typename... _Vs>
9757 struct __concat_view_iter_cat
9760 template<
bool _Const,
typename... _Vs>
9761 requires __detail::__all_forward<_Const, _Vs...>
9762 struct __concat_view_iter_cat<_Const, _Vs...>
9767 if constexpr (!is_reference_v<__concat_reference_t<__maybe_const_t<_Const, _Vs>...>>)
9768 return input_iterator_tag{};
9770 return []<
typename... _Cats>(_Cats... __cats) {
9771 if constexpr ((derived_from<_Cats, random_access_iterator_tag> && ...)
9772 && __concat_is_random_access<_Const, _Vs...>)
9773 return random_access_iterator_tag{};
9774 else if constexpr ((derived_from<_Cats, bidirectional_iterator_tag> && ...)
9775 && __concat_is_bidirectional<_Const, _Vs...>)
9776 return bidirectional_iterator_tag{};
9777 else if constexpr ((derived_from<_Cats, forward_iterator_tag> && ...))
9778 return forward_iterator_tag{};
9780 return input_iterator_tag{};
9781 }(
typename iterator_traits<iterator_t<__maybe_const_t<_Const, _Vs>>>
9782 ::iterator_category{}...);
9787 template<input_range... _Vs>
9788 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && __detail::__concatable<_Vs...>
9789 template<bool _Const>
9790 class concat_view<_Vs...>::_Iterator
9791 : public __detail::__concat_view_iter_cat<_Const, _Vs...>
9796 if constexpr (__detail::__concat_is_random_access<_Const, _Vs...>)
9797 return random_access_iterator_tag{};
9798 else if constexpr (__detail::__concat_is_bidirectional<_Const, _Vs...>)
9799 return bidirectional_iterator_tag{};
9800 else if constexpr (__detail::__all_forward<_Const, _Vs...>)
9801 return forward_iterator_tag{};
9803 return input_iterator_tag{};
9807 friend _Iterator<!_Const>;
9811 using iterator_concept =
decltype(_S_iter_concept());
9812 using value_type = __detail::__concat_value_t<__maybe_const_t<_Const, _Vs>...>;
9813 using difference_type = common_type_t<range_difference_t<__maybe_const_t<_Const, _Vs>>...>;
9816 using __base_iter = variant<iterator_t<__maybe_const_t<_Const, _Vs>>...>;
9818 __maybe_const_t<_Const, concat_view>* _M_parent =
nullptr;
9821 template<
size_t _Nm>
9825 if constexpr (_Nm < (
sizeof...(_Vs) - 1))
9827 if (std::get<_Nm>(_M_it) == ranges::end(std::get<_Nm>(_M_parent->_M_views)))
9829 _M_it.template emplace<_Nm + 1>(ranges::begin
9830 (std::get<_Nm + 1>(_M_parent->_M_views)));
9831 _M_satisfy<_Nm + 1>();
9836 template<
size_t _Nm>
9840 if constexpr (_Nm == 0)
9841 --std::get<0>(_M_it);
9844 if (std::get<_Nm>(_M_it) == ranges::begin(std::get<_Nm>(_M_parent->_M_views)))
9846 _M_it.template emplace<_Nm - 1>(ranges::end
9847 (std::get<_Nm - 1>(_M_parent->_M_views)));
9851 --std::get<_Nm>(_M_it);
9855 template<
size_t _Nm>
9857 _M_advance_fwd(difference_type __offset, difference_type __steps)
9859 using _Dt = iter_difference_t<variant_alternative_t<_Nm, __base_iter>>;
9860 if constexpr (_Nm ==
sizeof...(_Vs) - 1)
9861 std::get<_Nm>(_M_it) +=
static_cast<_Dt
>(__steps);
9864 auto __n_size = ranges::distance(std::get<_Nm>(_M_parent->_M_views));
9865 if (__offset + __steps < __n_size)
9866 std::get<_Nm>(_M_it) +=
static_cast<_Dt
>(__steps);
9869 _M_it.template emplace<_Nm + 1>(ranges::begin
9870 (std::get<_Nm + 1>(_M_parent->_M_views)));
9871 _M_advance_fwd<_Nm + 1>(0, __offset + __steps - __n_size);
9876 template<
size_t _Nm>
9878 _M_advance_bwd(difference_type __offset, difference_type __steps)
9880 using _Dt = iter_difference_t<variant_alternative_t<_Nm, __base_iter>>;
9881 if constexpr (_Nm == 0)
9882 std::get<_Nm>(_M_it) -=
static_cast<_Dt
>(__steps);
9884 if (__offset >= __steps)
9885 std::get<_Nm>(_M_it) -=
static_cast<_Dt
>(__steps);
9888 auto __prev_size = ranges::distance(std::get<_Nm - 1>(_M_parent->_M_views));
9889 _M_it.template emplace<_Nm - 1>(ranges::end
9890 (std::get<_Nm - 1>(_M_parent->_M_views)));
9891 _M_advance_bwd<_Nm - 1>(__prev_size, __steps - __offset);
9899 template<
typename _Fp>
9900 static constexpr auto
9901 _S_invoke_with_runtime_index(_Fp&& __f,
size_t __index)
9903 return [&__f, __index]<
size_t _Idx>(
this auto&& __self) {
9904 if (_Idx == __index)
9905 return __f.template operator()<_Idx>();
9906 if constexpr (_Idx + 1 <
sizeof...(_Vs))
9907 return __self.template
operator()<_Idx + 1>();
9908 __builtin_unreachable();
9909 }.template operator()<0>();
9912 template<
typename _Fp>
9914 _M_invoke_with_runtime_index(_Fp&& __f)
9917 template<
typename... _Args>
9919 _Iterator(__maybe_const_t<_Const, concat_view>* __parent, _Args&&... __args)
9920 requires constructible_from<__base_iter, _Args&&...>
9925 _Iterator() =
default;
9928 _Iterator(_Iterator<!_Const> __it)
9929 requires _Const && (convertible_to<iterator_t<_Vs>, iterator_t<const _Vs>> && ...)
9930 : _M_parent(__it._M_parent),
9931 _M_it(_S_invoke_with_runtime_index([this, &__it]<size_t _Idx>() {
9932 return __base_iter(in_place_index<_Idx>,
9934 }, __it._M_it.index()))
9937 constexpr decltype(
auto)
9940 __glibcxx_assert(!_M_it.valueless_by_exception());
9941 using reference = __detail::__concat_reference_t<__maybe_const_t<_Const, _Vs>...>;
9942 return std::visit([](
auto&& __it) -> reference {
return *__it; }, _M_it);
9945 constexpr _Iterator&
9948 _M_invoke_with_runtime_index([
this]<
size_t _Idx>() {
9949 ++std::get<_Idx>(_M_it);
9961 requires __detail::__all_forward<_Const, _Vs...>
9968 constexpr _Iterator&
9970 requires __detail::__concat_is_bidirectional<_Const, _Vs...>
9972 __glibcxx_assert(!_M_it.valueless_by_exception());
9973 _M_invoke_with_runtime_index([
this]<
size_t _Idx>() {
9981 requires __detail::__concat_is_bidirectional<_Const, _Vs...>
9988 constexpr _Iterator&
9989 operator+=(difference_type __n)
9990 requires __detail::__concat_is_random_access<_Const, _Vs...>
9992 __glibcxx_assert(!_M_it.valueless_by_exception());
9993 _M_invoke_with_runtime_index([
this, __n]<
size_t _Idx>() {
9994 auto __begin = ranges::begin(std::get<_Idx>(_M_parent->_M_views));
9996 _M_advance_fwd<_Idx>(std::get<_Idx>(_M_it) - __begin, __n);
9998 _M_advance_bwd<_Idx>(std::get<_Idx>(_M_it) - __begin, -__n);
10003 constexpr _Iterator&
10004 operator-=(difference_type __n)
10005 requires __detail::__concat_is_random_access<_Const, _Vs...>
10011 constexpr decltype(
auto)
10012 operator[](difference_type __n)
const
10013 requires __detail::__concat_is_random_access<_Const, _Vs...>
10014 {
return *((*this) + __n); }
10016 friend constexpr bool
10017 operator==(
const _Iterator& __x,
const _Iterator& __y)
10018 requires (equality_comparable<iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10020 __glibcxx_assert(!__x._M_it.valueless_by_exception());
10021 __glibcxx_assert(!__y._M_it.valueless_by_exception());
10022 return __x._M_it == __y._M_it;
10025 friend constexpr bool
10026 operator==(
const _Iterator& __it, default_sentinel_t)
10028 __glibcxx_assert(!__it._M_it.valueless_by_exception());
10029 constexpr auto __last_idx =
sizeof...(_Vs) - 1;
10030 return (__it._M_it.index() == __last_idx
10031 && (std::get<__last_idx>(__it._M_it)
10032 == ranges::end(std::get<__last_idx>(__it._M_parent->_M_views))));
10035 friend constexpr bool
10036 operator<(
const _Iterator& __x,
const _Iterator& __y)
10037 requires __detail::__all_random_access<_Const, _Vs...>
10038 {
return __x._M_it < __y._M_it; }
10040 friend constexpr bool
10041 operator>(
const _Iterator& __x,
const _Iterator& __y)
10042 requires __detail::__all_random_access<_Const, _Vs...>
10043 {
return __x._M_it > __y._M_it; }
10045 friend constexpr bool
10046 operator<=(
const _Iterator& __x,
const _Iterator& __y)
10047 requires __detail::__all_random_access<_Const, _Vs...>
10048 {
return __x._M_it <= __y._M_it; }
10050 friend constexpr bool
10051 operator>=(
const _Iterator& __x,
const _Iterator& __y)
10052 requires __detail::__all_random_access<_Const, _Vs...>
10053 {
return __x._M_it >= __y._M_it; }
10055 friend constexpr auto
10056 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
10057 requires __detail::__all_random_access<_Const, _Vs...>
10058 && (three_way_comparable<iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10059 {
return __x._M_it <=> __y._M_it; }
10061 friend constexpr _Iterator
10062 operator+(
const _Iterator& __it, difference_type __n)
10063 requires __detail::__concat_is_random_access<_Const, _Vs...>
10064 {
return auto(__it) += __n; }
10066 friend constexpr _Iterator
10067 operator+(difference_type __n,
const _Iterator& __it)
10068 requires __detail::__concat_is_random_access<_Const, _Vs...>
10069 {
return __it + __n; }
10071 friend constexpr _Iterator
10072 operator-(
const _Iterator& __it, difference_type __n)
10073 requires __detail::__concat_is_random_access<_Const, _Vs...>
10074 {
return auto(__it) -= __n; }
10076 friend constexpr difference_type
10077 operator-(
const _Iterator& __x,
const _Iterator& __y)
10078 requires __detail::__concat_is_random_access<_Const, _Vs...>
10080 return _S_invoke_with_runtime_index([&]<
size_t _Ix>() -> difference_type {
10081 return _S_invoke_with_runtime_index([&]<
size_t _Iy>() -> difference_type {
10082 if constexpr (_Ix > _Iy)
10084 auto __dy = ranges::distance(std::get<_Iy>(__y._M_it),
10085 ranges::end(std::get<_Iy>(__y._M_parent
10087 auto __dx = ranges::distance(ranges::begin(std::get<_Ix>(__x._M_parent
10089 std::get<_Ix>(__x._M_it));
10090 difference_type __s = 0;
10091 [&]<
size_t _Idx = _Iy + 1>(
this auto&& __self) {
10092 if constexpr (_Idx < _Ix)
10094 __s += ranges::size(std::get<_Idx>(__x._M_parent->_M_views));
10095 __self.template operator()<_Idx + 1>();
10098 return __dy + __s + __dx;
10100 else if constexpr (_Ix < _Iy)
10101 return -(__y - __x);
10103 return std::get<_Ix>(__x._M_it) - std::get<_Iy>(__y._M_it);
10104 }, __y._M_it.index());
10105 }, __x._M_it.index());
10108 friend constexpr difference_type
10109 operator-(
const _Iterator& __x, default_sentinel_t)
10110 requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
10111 iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10112 && __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
10114 return _S_invoke_with_runtime_index([&]<
size_t _Ix>() -> difference_type {
10115 auto __dx = ranges::distance(std::get<_Ix>(__x._M_it),
10116 ranges::end(std::get<_Ix>(__x._M_parent->_M_views)));
10117 difference_type __s = 0;
10118 [&]<
size_t _Idx = _Ix + 1>(
this auto&& __self) {
10119 if constexpr (_Idx <
sizeof...(_Vs))
10121 __s += ranges::size(std::get<_Idx>(__x._M_parent->_M_views));
10122 __self.template operator()<_Idx + 1>();
10125 return -(__dx + __s);
10126 }, __x._M_it.index());
10129 friend constexpr difference_type
10130 operator-(default_sentinel_t,
const _Iterator& __x)
10131 requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
10132 iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10133 && __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
10136 friend constexpr decltype(
auto)
10137 iter_move(
const _Iterator& __it)
10139 using _Res = __detail::__concat_rvalue_reference_t<__maybe_const_t<_Const, _Vs>...>;
10140 return std::visit([](
const auto& __i) -> _Res {
10141 return ranges::iter_move(__i);
10145 friend constexpr void
10146 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10147 requires swappable_with<iter_reference_t<_Iterator>, iter_reference_t<_Iterator>>
10148 && (... && indirectly_swappable<iterator_t<__maybe_const_t<_Const, _Vs>>>)
10150 std::visit([&]<
typename _Tp,
typename _Up>(
const _Tp& __it1,
const _Up& __it2) {
10151 if constexpr (is_same_v<_Tp, _Up>)
10152 ranges::iter_swap(__it1, __it2);
10154 ranges::swap(*__it1, *__it2);
10155 }, __x._M_it, __y._M_it);
10163 template<
typename... _Ts>
10169 template<
typename... _Ts>
10170 requires __detail::__can_concat_view<_Ts...>
10172 operator() [[nodiscard]] (_Ts&&... __ts)
const
10175 template<input_range _Range>
10177 operator() [[nodiscard]] (_Range&& __t)
const
10181 inline constexpr _Concat concat;
10187#if __cpp_lib_ranges_cache_latest
10190 template<input_range _Vp>
10192 class cache_latest_view :
public view_interface<cache_latest_view<_Vp>>
10194 _Vp _M_base = _Vp();
10196 using __cache_t = __conditional_t<is_reference_v<range_reference_t<_Vp>>,
10197 add_pointer_t<range_reference_t<_Vp>>,
10198 range_reference_t<_Vp>>;
10199 __detail::__non_propagating_cache<__cache_t> _M_cache;
10205 cache_latest_view()
requires default_initializable<_Vp> = default;
10208 cache_latest_view(_Vp __base)
10209 : _M_base(std::move(__base))
10213 base() const & requires copy_constructible<_Vp>
10214 {
return _M_base; }
10222 {
return _Iterator(*
this); }
10226 {
return _Sentinel(*
this); }
10229 size()
requires sized_range<_Vp>
10230 {
return ranges::size(_M_base); }
10233 size() const requires sized_range<const _Vp>
10234 {
return ranges::size(_M_base); }
10237 template<
typename _Range>
10238 cache_latest_view(_Range&&) -> cache_latest_view<views::all_t<_Range>>;
10240 template<input_range _Vp>
10242 class cache_latest_view<_Vp>::_Iterator
10244 cache_latest_view* _M_parent;
10245 iterator_t<_Vp> _M_current;
10248 _Iterator(cache_latest_view& __parent)
10250 _M_current(ranges::
begin(__parent._M_base))
10253 friend class cache_latest_view;
10256 using difference_type = range_difference_t<_Vp>;
10257 using value_type = range_value_t<_Vp>;
10258 using iterator_concept = input_iterator_tag;
10260 _Iterator(_Iterator&&) =
default;
10263 operator=(_Iterator&&) =
default;
10265 constexpr iterator_t<_Vp>
10269 constexpr const iterator_t<_Vp>&
10270 base() const & noexcept
10271 {
return _M_current; }
10273 constexpr range_reference_t<_Vp>&
10276 if constexpr (is_reference_v<range_reference_t<_Vp>>)
10278 if (!_M_parent->_M_cache)
10279 _M_parent->_M_cache =
std::__addressof(__detail::__as_lvalue(*_M_current));
10280 return **_M_parent->_M_cache;
10284 if (!_M_parent->_M_cache)
10285 _M_parent->_M_cache._M_emplace_deref(_M_current);
10286 return *_M_parent->_M_cache;
10290 constexpr _Iterator&
10293 _M_parent->_M_cache._M_reset();
10302 friend constexpr range_rvalue_reference_t<_Vp>
10303 iter_move(
const _Iterator& __i)
10304 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
10305 {
return ranges::iter_move(__i._M_current); }
10307 friend constexpr void
10308 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10309 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
10310 requires indirectly_swappable<iterator_t<_Vp>>
10311 { ranges::iter_swap(__x._M_current, __y._M_current); }
10314 template<input_range _Vp>
10316 class cache_latest_view<_Vp>::_Sentinel
10318 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
10321 _Sentinel(cache_latest_view& __parent)
10322 : _M_end(ranges::
end(__parent._M_base))
10325 friend class cache_latest_view;
10328 _Sentinel() =
default;
10330 constexpr sentinel_t<_Vp>
10334 friend constexpr bool
10335 operator==(
const _Iterator& __x,
const _Sentinel& __y)
10336 {
return __x._M_current == __y._M_end; }
10338 friend constexpr range_difference_t<_Vp>
10339 operator-(
const _Iterator& __x,
const _Sentinel& __y)
10340 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
10341 {
return __x._M_current - __y._M_end; }
10343 friend constexpr range_difference_t<_Vp>
10344 operator-(
const _Sentinel& __x,
const _Iterator& __y)
10345 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
10346 {
return __x._M_end - __y._M_current; }
10353 template<
typename _Tp>
10354 concept __can_cache_latest =
requires { cache_latest_view(
std::declval<_Tp>()); };
10357 struct _CacheLatest : __adaptor::_RangeAdaptorClosure<_CacheLatest>
10359 template<viewable_range _Range>
10360 requires __detail::__can_cache_latest<_Range>
10362 operator() [[nodiscard]] (_Range&& __r)
const
10365 static constexpr bool _S_has_simple_call_op =
true;
10368 inline constexpr _CacheLatest cache_latest;
10373#if __cpp_lib_ranges_to_input
10376 template<input_range _Vp>
10378 class to_input_view :
public view_interface<to_input_view<_Vp>>
10380 _Vp _M_base = _Vp();
10382 template<
bool _Const>
10386 to_input_view()
requires default_initializable<_Vp> = default;
10389 to_input_view(_Vp __base)
10390 : _M_base(std::move(__base))
10394 base() const & requires copy_constructible<_Vp>
10395 {
return _M_base; }
10402 begin()
requires (!__detail::__simple_view<_Vp>)
10403 {
return _Iterator<false>(ranges::begin(_M_base)); }
10406 begin() const requires range<const _Vp>
10407 {
return _Iterator<true>(ranges::begin(_M_base)); }
10410 end()
requires (!__detail::__simple_view<_Vp>)
10411 {
return ranges::end(_M_base); }
10414 end() const requires range<const _Vp>
10415 {
return ranges::end(_M_base); }
10418 size()
requires sized_range<_Vp>
10419 {
return ranges::size(_M_base); }
10422 size() const requires sized_range<const _Vp>
10423 {
return ranges::size(_M_base); }
10426 template<
typename _Range>
10427 to_input_view(_Range&&) -> to_input_view<views::all_t<_Range>>;
10429 template<input_range _Vp>
10431 template<
bool _Const>
10432 class to_input_view<_Vp>::_Iterator
10434 using _Base = __maybe_const_t<_Const, _Vp>;
10436 iterator_t<_Base> _M_current = iterator_t<_Base>();
10439 _Iterator(iterator_t<_Base> __current)
10440 : _M_current(std::
move(__current))
10443 friend to_input_view;
10444 friend _Iterator<!_Const>;
10447 using difference_type = range_difference_t<_Base>;
10448 using value_type = range_value_t<_Base>;
10449 using iterator_concept = input_iterator_tag;
10451 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
10453 _Iterator(_Iterator&&) = default;
10454 _Iterator& operator=(_Iterator&&) = default;
10457 _Iterator(_Iterator<!_Const> __i)
10458 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
10459 : _M_current(std::move(__i._M_current))
10462 constexpr iterator_t<_Base>
10466 constexpr const iterator_t<_Base>&
10467 base() const & noexcept
10468 {
return _M_current; }
10470 constexpr decltype(
auto)
10472 {
return *_M_current; }
10474 constexpr _Iterator&
10485 friend constexpr bool
10486 operator==(
const _Iterator& __x,
const sentinel_t<_Base>& __y)
10487 {
return __x._M_current == __y; }
10489 friend constexpr difference_type
10490 operator-(
const sentinel_t<_Base>& __y,
const _Iterator& __x)
10491 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
10492 {
return __y - __x._M_current; }
10494 friend constexpr difference_type
10495 operator-(
const _Iterator& __x,
const sentinel_t<_Base>& __y)
10496 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
10497 {
return __x._M_current - __y; }
10499 friend constexpr range_rvalue_reference_t<_Base>
10500 iter_move(
const _Iterator& __i)
10501 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
10502 {
return ranges::iter_move(__i._M_current); }
10504 friend constexpr void
10505 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10506 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
10507 requires indirectly_swappable<iterator_t<_Base>>
10508 { ranges::iter_swap(__x._M_current, __y._M_current); }
10515 template<
typename _Tp>
10519 struct _ToInput : __adaptor::_RangeAdaptorClosure<_ToInput>
10521 template<viewable_range _Range>
10522 requires __detail::__can_to_input<_Range>
10524 operator() [[nodiscard]] (_Range&& __r)
const
10526 if constexpr (input_range<_Range>
10527 && !common_range<_Range>
10528 && !forward_range<_Range>)
10534 static constexpr bool _S_has_simple_call_op =
true;
10537 inline constexpr _ToInput to_input;
10542_GLIBCXX_END_NAMESPACE_VERSION
constexpr bool operator<=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
basic_istream< char > istream
Base class for char input streams.
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename common_type< _Tp... >::type common_type_t
Alias template for common_type.
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
_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 const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
constexpr reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
constexpr void iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
Create a range of sequentially increasing values.
ISO C++ entities toplevel namespace is std.
make_integer_sequence< size_t, _Num > make_index_sequence
Alias template make_index_sequence.
integer_sequence< size_t, _Idx... > index_sequence
Alias template index_sequence.
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 default_sentinel_t default_sentinel
A default sentinel value.
constexpr auto data(_Container &__cont) noexcept(noexcept(__cont.data())) -> decltype(__cont.data())
Return the data pointer of a container.
constexpr bitset< _Nb > operator|(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
constexpr _Iterator __base(_Iterator __it)
constexpr reference_wrapper< _Tp > ref(_Tp &__t) noexcept
Denotes a reference should be taken to a variable.
constexpr reference_wrapper< const _Tp > cref(const _Tp &__t) noexcept
Denotes a const reference should be taken to a variable.
The ranges::view_interface class template.