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>
127 template<
typename _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>)
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
290 namespace __func_handle
292 template<
typename _Fn>
295 _Inplace() =
default;
298 _Inplace(_Fn __func) noexcept
302 template<
typename... _Iters>
303 constexpr decltype(
auto)
304 _M_call_deref(
const _Iters&... __iters)
const
305 noexcept(
noexcept(_M_fn(*__iters...)))
306 {
return _M_fn(*__iters...); }
308 template<
typename _DistType,
typename... _Iters>
309 constexpr decltype(
auto)
310 _M_call_subscript(
const _DistType __n,
const _Iters&... __iters)
const
311 noexcept(
noexcept(_M_fn(__iters[iter_difference_t<_Iters>(__n)]...)))
312 {
return _M_fn(__iters[iter_difference_t<_Iters>(__n)]...); }
315 [[no_unique_address]] _Fn _M_fn = _Fn();
318 template<
typename _Fn>
319 struct _InplaceMemPtr
321 _InplaceMemPtr() =
default;
324 _InplaceMemPtr(_Fn __func) noexcept
328 template<
typename... _Iters>
329 constexpr decltype(
auto)
330 _M_call_deref(
const _Iters&... __iters)
const
334 template<
typename _DistType,
typename... _Iters>
335 constexpr decltype(
auto)
336 _M_call_subscript(
const _DistType __n,
const _Iters&... __iters)
const
337 noexcept(
noexcept(
std::__invoke(_M_ptr, __iters[iter_difference_t<_Iters>(__n)]...)))
338 {
return std::__invoke(_M_ptr, __iters[iter_difference_t<_Iters>(__n)]...); }
341 _Fn _M_ptr =
nullptr;
344 template<
typename _Fn>
347 _ViaPointer() =
default;
350 _ViaPointer(_Fn& __func) noexcept
354 template<
typename _Un>
355 requires (!is_const_v<_Un>) && is_same_v<const _Un, _Fn>
357 _ViaPointer(_ViaPointer<_Un> __other) noexcept
358 : _M_ptr(__other._M_ptr)
361 template<
typename... _Iters>
362 constexpr decltype(
auto)
363 _M_call_deref(
const _Iters&... __iters)
const
364 noexcept(
noexcept((*_M_ptr)(*__iters...)))
365 {
return (*_M_ptr)(*__iters...); }
367 template<
typename _DistType,
typename... _Iters>
368 constexpr decltype(
auto)
369 _M_call_subscript(
const _DistType __n,
const _Iters&... __iters)
const
370 noexcept(
noexcept((*_M_ptr)(__iters[iter_difference_t<_Iters>(__n)]...)))
371 {
return (*_M_ptr)(__iters[iter_difference_t<_Iters>(__n)]...); }
374 _Fn* _M_ptr =
nullptr;
377 friend struct _ViaPointer;
380 template<
typename _Fn>
383 _StaticCall() =
default;
386 _StaticCall(
const _Fn&)
noexcept
389 template<
typename... _Iters>
390 static constexpr decltype(
auto)
391 _M_call_deref(
const _Iters&... __iters)
392 noexcept(
noexcept(_Fn::operator()(*__iters...)))
393 {
return _Fn::operator()(*__iters...); }
395 template<
typename _DistType,
typename... _Iters>
396 static constexpr decltype(
auto)
397 _M_call_subscript(_DistType __n,
const _Iters&... __iters)
398 noexcept(
noexcept(_Fn::operator()(__iters[iter_difference_t<_Iters>(__n)]...)))
399 {
return _Fn::operator()(__iters[iter_difference_t<_Iters>(__n)]...); }
402 template<
typename _Fn,
typename... _Iters>
406 using _Fd = remove_cv_t<_Fn>;
407 if constexpr (is_member_pointer_v<_Fd>)
408 return __func_handle::_InplaceMemPtr<_Fd>();
409 else if constexpr (is_function_v<remove_pointer_t<_Fd>>)
410 return __func_handle::_Inplace<_Fd>();
411 else if constexpr (__is_std_op_wrapper<_Fd>)
412 return __func_handle::_Inplace<_Fd>();
413 else if constexpr (
requires (
const _Iters&... __iters)
414 { _Fd::operator()(*__iters...); })
415 return __func_handle::_StaticCall<_Fd>();
417 return __func_handle::_ViaPointer<_Fn>();
421 template<
typename _Fn,
typename... _Iters>
422 using __func_handle_t =
decltype(__func_handle::__select<_Fn, _Iters...>());
426#if __cpp_lib_ranges >= 202207L
427 template<move_constructible _Tp>
429 template<copy_constructible _Tp>
431 requires is_object_v<_Tp>
438 single_view(
const _Tp& __t)
439 noexcept(is_nothrow_copy_constructible_v<_Tp>)
445 single_view(_Tp&& __t)
446 noexcept(is_nothrow_move_constructible_v<_Tp>)
452 template<
typename... _Args>
455 single_view(in_place_t, _Args&&... __args)
456 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
465 begin()
const noexcept
470 {
return data() + 1; }
474 {
return data() + 1; }
478 static constexpr bool
482 static constexpr size_t
488 {
return _M_value.operator->(); }
491 data()
const noexcept
492 {
return _M_value.operator->(); }
495 [[no_unique_address]] __detail::__box<_Tp> _M_value;
498 template<
typename _Tp>
503 template<
typename _Wp>
504 constexpr auto __to_signed_like(_Wp __w)
noexcept
506 if constexpr (!integral<_Wp>)
507 return iter_difference_t<_Wp>();
508 else if constexpr (
sizeof(iter_difference_t<_Wp>) >
sizeof(_Wp))
509 return iter_difference_t<_Wp>(__w);
510 else if constexpr (
sizeof(ptrdiff_t) >
sizeof(_Wp))
511 return ptrdiff_t(__w);
512 else if constexpr (
sizeof(
long long) >
sizeof(_Wp))
513 return (
long long)(__w);
514#ifdef __SIZEOF_INT128__
515 else if constexpr (__SIZEOF_INT128__ >
sizeof(_Wp))
516 return __int128(__w);
519 return __max_diff_type(__w);
522 template<
typename _Wp>
525 template<
typename _It>
526 concept __decrementable = incrementable<_It>
529 { --__i } -> same_as<_It&>;
530 { __i-- } -> same_as<_It>;
533 template<
typename _It>
534 concept __advanceable = __decrementable<_It> && totally_ordered<_It>
535 &&
requires( _It __i,
const _It __j,
const __iota_diff_t<_It> __n)
537 { __i += __n } -> same_as<_It&>;
538 { __i -= __n } -> same_as<_It&>;
542 { __j - __j } -> convertible_to<__iota_diff_t<_It>>;
545 template<
typename _Winc>
546 struct __iota_view_iter_cat
549 template<incrementable _Winc>
550 struct __iota_view_iter_cat<_Winc>
551 {
using iterator_category = input_iterator_tag; };
554 template<weakly_incrementable _Winc,
555 semiregular _Bound = unreachable_sentinel_t>
556 requires std::__detail::__weakly_eq_cmp_with<_Winc, _Bound>
563 struct _Iterator : __detail::__iota_view_iter_cat<_Winc>
569 using namespace __detail;
570 if constexpr (__advanceable<_Winc>)
571 return random_access_iterator_tag{};
572 else if constexpr (__decrementable<_Winc>)
573 return bidirectional_iterator_tag{};
574 else if constexpr (incrementable<_Winc>)
575 return forward_iterator_tag{};
577 return input_iterator_tag{};
581 using iterator_concept =
decltype(_S_iter_concept());
583 using value_type = _Winc;
584 using difference_type = __detail::__iota_diff_t<_Winc>;
586 _Iterator()
requires default_initializable<_Winc> = default;
589 _Iterator(_Winc __value)
590 : _M_value(__value) { }
593 operator*() const noexcept(is_nothrow_copy_constructible_v<_Winc>)
608 operator++(
int)
requires incrementable<_Winc>
616 operator--()
requires __detail::__decrementable<_Winc>
623 operator--(
int)
requires __detail::__decrementable<_Winc>
631 operator+=(difference_type __n)
requires __detail::__advanceable<_Winc>
633 using __detail::__is_integer_like;
634 using __detail::__is_signed_integer_like;
635 if constexpr (__is_integer_like<_Winc>
636 && !__is_signed_integer_like<_Winc>)
638 if (__n >= difference_type(0))
639 _M_value +=
static_cast<_Winc
>(__n);
641 _M_value -=
static_cast<_Winc
>(-__n);
649 operator-=(difference_type __n)
requires __detail::__advanceable<_Winc>
651 using __detail::__is_integer_like;
652 using __detail::__is_signed_integer_like;
653 if constexpr (__is_integer_like<_Winc>
654 && !__is_signed_integer_like<_Winc>)
656 if (__n >= difference_type(0))
657 _M_value -=
static_cast<_Winc
>(__n);
659 _M_value +=
static_cast<_Winc
>(-__n);
667 operator[](difference_type __n)
const
668 requires __detail::__advanceable<_Winc>
669 {
return _Winc(_M_value + __n); }
671 friend constexpr bool
672 operator==(
const _Iterator& __x,
const _Iterator& __y)
673 requires equality_comparable<_Winc>
674 {
return __x._M_value == __y._M_value; }
676 friend constexpr bool
677 operator<(
const _Iterator& __x,
const _Iterator& __y)
678 requires totally_ordered<_Winc>
679 {
return __x._M_value < __y._M_value; }
681 friend constexpr bool
682 operator>(
const _Iterator& __x,
const _Iterator& __y)
683 requires totally_ordered<_Winc>
684 {
return __y < __x; }
686 friend constexpr bool
687 operator<=(
const _Iterator& __x,
const _Iterator& __y)
688 requires totally_ordered<_Winc>
689 {
return !(__y < __x); }
691 friend constexpr bool
692 operator>=(
const _Iterator& __x,
const _Iterator& __y)
693 requires totally_ordered<_Winc>
694 {
return !(__x < __y); }
696#ifdef __cpp_lib_three_way_comparison
697 friend constexpr auto
698 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
699 requires totally_ordered<_Winc> && three_way_comparable<_Winc>
700 {
return __x._M_value <=> __y._M_value; }
703 friend constexpr _Iterator
704 operator+(_Iterator __i, difference_type __n)
705 requires __detail::__advanceable<_Winc>
711 friend constexpr _Iterator
712 operator+(difference_type __n, _Iterator __i)
713 requires __detail::__advanceable<_Winc>
714 {
return __i += __n; }
716 friend constexpr _Iterator
717 operator-(_Iterator __i, difference_type __n)
718 requires __detail::__advanceable<_Winc>
724 friend constexpr difference_type
725 operator-(
const _Iterator& __x,
const _Iterator& __y)
726 requires __detail::__advanceable<_Winc>
728 using __detail::__is_integer_like;
729 using __detail::__is_signed_integer_like;
730 using _Dt = difference_type;
731 if constexpr (__is_integer_like<_Winc>)
733 if constexpr (__is_signed_integer_like<_Winc>)
734 return _Dt(_Dt(__x._M_value) - _Dt(__y._M_value));
736 return (__y._M_value > __x._M_value)
737 ? _Dt(-_Dt(__y._M_value - __x._M_value))
738 : _Dt(__x._M_value - __y._M_value);
741 return __x._M_value - __y._M_value;
745 _Winc _M_value = _Winc();
755 _M_equal(
const _Iterator& __x)
const
756 {
return __x._M_value == _M_bound; }
759 _M_distance_from(
const _Iterator& __x)
const
760 {
return _M_bound - __x._M_value; }
762 _Bound _M_bound = _Bound();
765 _Sentinel() =
default;
768 _Sentinel(_Bound __bound)
769 : _M_bound(__bound) { }
771 friend constexpr bool
772 operator==(
const _Iterator& __x,
const _Sentinel& __y)
773 {
return __y._M_equal(__x); }
775 friend constexpr iter_difference_t<_Winc>
776 operator-(
const _Iterator& __x,
const _Sentinel& __y)
777 requires sized_sentinel_for<_Bound, _Winc>
778 {
return -__y._M_distance_from(__x); }
780 friend constexpr iter_difference_t<_Winc>
781 operator-(
const _Sentinel& __x,
const _Iterator& __y)
782 requires sized_sentinel_for<_Bound, _Winc>
783 {
return __x._M_distance_from(__y); }
788 _Winc _M_value = _Winc();
789 [[no_unique_address]] _Bound _M_bound = _Bound();
792 iota_view()
requires default_initializable<_Winc> = default;
795 iota_view(_Winc __value)
800 iota_view(type_identity_t<_Winc> __value,
801 type_identity_t<_Bound> __bound)
802 : _M_value(__value), _M_bound(__bound)
804 if constexpr (totally_ordered_with<_Winc, _Bound>)
805 __glibcxx_assert(
bool(__value <= __bound) );
809 iota_view(_Iterator __first, _Iterator __last)
810 requires same_as<_Winc, _Bound>
811 : iota_view(__first._M_value, __last._M_value)
815 iota_view(_Iterator __first, unreachable_sentinel_t __last)
816 requires same_as<_Bound, unreachable_sentinel_t>
817 : iota_view(__first._M_value, __last)
821 iota_view(_Iterator __first, _Sentinel __last)
822 requires (!same_as<_Winc, _Bound>) && (!same_as<_Bound, unreachable_sentinel_t>)
823 : iota_view(__first._M_value, __last._M_bound)
827 begin()
const {
return _Iterator{_M_value}; }
832 if constexpr (same_as<_Bound, unreachable_sentinel_t>)
833 return unreachable_sentinel;
835 return _Sentinel{_M_bound};
839 end() const requires same_as<_Winc, _Bound>
840 {
return _Iterator{_M_bound}; }
846 {
return _M_value == _M_bound; }
850 requires (same_as<_Winc, _Bound> && __detail::__advanceable<_Winc>)
851 || (integral<_Winc> && integral<_Bound>)
852 || sized_sentinel_for<_Bound, _Winc>
854 using __detail::__is_integer_like;
855 using __detail::__to_unsigned_like;
856 if constexpr (integral<_Winc> && integral<_Bound>)
859 return _Up(_M_bound) - _Up(_M_value);
861 else if constexpr (__is_integer_like<_Winc>)
862 return __to_unsigned_like(_M_bound) - __to_unsigned_like(_M_value);
864 return __to_unsigned_like(_M_bound - _M_value);
868 template<
typename _Winc,
typename _Bound>
869 requires (!__detail::__is_integer_like<_Winc>
870 || !__detail::__is_integer_like<_Bound>
871 || (__detail::__is_signed_integer_like<_Winc>
872 == __detail::__is_signed_integer_like<_Bound>))
873 iota_view(_Winc, _Bound) -> iota_view<_Winc, _Bound>;
875 template<
typename _Winc,
typename _Bound>
876 inline constexpr bool
877 enable_borrowed_range<iota_view<_Winc, _Bound>> =
true;
881 template<
typename _Tp>
882 inline constexpr empty_view<_Tp> empty{};
886 template<
typename _Tp>
887 concept __can_single_view
893 template<__detail::__can_single_view _Tp>
895 operator() [[nodiscard]] (_Tp&& __e)
const
900 inline constexpr _Single single{};
904 template<
typename... _Args>
910 template<__detail::__can_iota_view _Tp>
912 operator() [[nodiscard]] (_Tp&& __e)
const
915 template<
typename _Tp,
typename _Up>
916 requires __detail::__can_iota_view<_Tp, _Up>
918 operator() [[nodiscard]] (_Tp&& __e, _Up&& __f)
const
922 inline constexpr _Iota iota{};
924#ifdef __cpp_lib_ranges_indices
927 template<ranges::__detail::__is_
integer_like _Tp>
928 requires __detail::__can_iota_view<_Tp>
929 [[nodiscard]]
constexpr auto
930 operator() (_Tp __e)
const noexcept
931 {
return iota(_Tp{}, __e); }
934 inline constexpr _Indices indices{};
941 template<
typename _Val,
typename _CharT,
typename _Traits>
942 concept __stream_extractable
943 =
requires(basic_istream<_CharT, _Traits>& is, _Val& t) { is >> t; };
946 template<movable _Val,
typename _CharT,
947 typename _Traits = char_traits<_CharT>>
948 requires default_initializable<_Val>
949 && __detail::__stream_extractable<_Val, _CharT, _Traits>
950 class basic_istream_view
951 :
public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
955 basic_istream_view(basic_istream<_CharT, _Traits>& __stream)
962 *_M_stream >> _M_object;
963 return _Iterator{
this};
966 constexpr default_sentinel_t
971 basic_istream<_CharT, _Traits>* _M_stream;
972 _Val _M_object = _Val();
977 using iterator_concept = input_iterator_tag;
978 using difference_type = ptrdiff_t;
979 using value_type = _Val;
982 _Iterator(basic_istream_view* __parent) noexcept
983 : _M_parent(__parent)
986 _Iterator(
const _Iterator&) =
delete;
987 _Iterator(_Iterator&&) =
default;
988 _Iterator& operator=(
const _Iterator&) =
delete;
989 _Iterator& operator=(_Iterator&&) =
default;
994 *_M_parent->_M_stream >> _M_parent->_M_object;
1004 {
return _M_parent->_M_object; }
1007 operator==(
const _Iterator& __x, default_sentinel_t)
1008 {
return __x._M_at_end(); }
1011 basic_istream_view* _M_parent;
1015 {
return !*_M_parent->_M_stream; }
1021 template<
typename _Val>
1022 using istream_view = basic_istream_view<_Val, char>;
1024 template<
typename _Val>
1025 using wistream_view = basic_istream_view<_Val, wchar_t>;
1031 template<
typename _Tp,
typename _Up>
1032 concept __can_istream_view =
requires (_Up __e) {
1033 basic_istream_view<_Tp, typename _Up::char_type, typename _Up::traits_type>(__e);
1037 template<
typename _Tp>
1040 template<
typename _CharT,
typename _Traits>
1042 operator() [[nodiscard]] (basic_istream<_CharT, _Traits>& __e)
const
1044 {
return basic_istream_view<_Tp, _CharT, _Traits>(__e); }
1047 template<
typename _Tp>
1048 inline constexpr _Istream<_Tp> istream;
1056 template<
typename _Tp,
int _Disc>
1065 template<
bool _Present,
typename _Tp,
int _Disc = 0>
1066 using __maybe_present_t = __conditional_t<_Present, _Tp, _Absent<_Tp, _Disc>>;
1069 template<
bool _Const,
typename _Tp>
1070 using __maybe_const_t = __conditional_t<_Const, const _Tp, _Tp>;
1075using __detail::__maybe_const_t;
1077namespace views::__adaptor
1080 template<
typename _Adaptor,
typename... _Args>
1081 concept __adaptor_invocable
1086 template<
typename _Adaptor,
typename... _Args>
1087 concept __adaptor_partial_app_viable = (_Adaptor::_S_arity > 1)
1088 && (
sizeof...(_Args) == _Adaptor::_S_arity - 1)
1089 && (constructible_from<decay_t<_Args>, _Args> && ...);
1091 template<
typename _Adaptor,
typename... _Args>
1094 template<
typename _Lhs,
typename _Rhs>
1102 template<
typename _Derived>
1103 struct _RangeAdaptorClosure;
1105 template<
typename _Tp,
typename _Up>
1106 requires (!same_as<_Tp, _RangeAdaptorClosure<_Up>>)
1107 void __is_range_adaptor_closure_fn
1108 (
const _Tp&,
const _RangeAdaptorClosure<_Up>&);
1110 template<
typename _Tp>
1111 concept __is_range_adaptor_closure
1112 =
requires (_Tp __t) { __adaptor::__is_range_adaptor_closure_fn(__t, __t); };
1114#pragma GCC diagnostic push
1115#pragma GCC diagnostic ignored "-Wdangling-reference"
1117 template<
typename _Self,
typename _Range>
1118 requires __is_range_adaptor_closure<_Self>
1119 && __adaptor_invocable<_Self, _Range>
1121 operator|(_Range&& __r, _Self&& __self)
1126 template<
typename _Lhs,
typename _Rhs>
1127 requires __is_range_adaptor_closure<_Lhs>
1128 && __is_range_adaptor_closure<_Rhs>
1130 operator|(_Lhs&& __lhs, _Rhs&& __rhs)
1135#pragma GCC diagnostic pop
1137 template<
typename _Derived>
1138 struct _RangeAdaptorClosure
1144 template<
typename _Self,
typename _Range>
1145 requires __is_range_adaptor_closure<_Self>
1146 && __adaptor_invocable<_Self, _Range>
1147 friend constexpr auto
1148 operator|(_Range&& __r, _Self&& __self);
1150 template<
typename _Lhs,
typename _Rhs>
1151 requires __is_range_adaptor_closure<_Lhs>
1152 && __is_range_adaptor_closure<_Rhs>
1153 friend constexpr auto
1154 operator|(_Lhs&& __lhs, _Rhs&& __rhs);
1168 template<
typename _Derived>
1169 struct _RangeAdaptor
1173 template<
typename... _Args>
1174 requires __adaptor_partial_app_viable<_Derived, _Args...>
1176 operator()(_Args&&... __args)
const
1185 template<
typename _Adaptor>
1186 concept __closure_has_simple_call_op = _Adaptor::_S_has_simple_call_op;
1190 template<
typename _Adaptor,
typename... _Args>
1191 concept __adaptor_has_simple_extra_args = _Adaptor::_S_has_simple_extra_args
1192 || _Adaptor::template _S_has_simple_extra_args<_Args...>;
1196 template<
typename _Adaptor,
typename... _Args>
1197 struct _Partial : _RangeAdaptorClosure<_Partial<_Adaptor, _Args...>>
1199 using _Binder = _Bind_back_t<_Adaptor, _Args...>;
1200 [[no_unique_address]] _Binder _M_binder;
1204 template<
typename... _Ts>
1206 _Partial(
int, _Ts&&... __args)
1207 : _M_binder(0, _Adaptor(), std::
forward<_Ts>(__args)...)
1212#if _GLIBCXX_EXPLICIT_THIS_PARAMETER
1213# pragma GCC diagnostic push
1214# pragma GCC diagnostic ignored "-Wc++23-extensions"
1215 template<
typename _Self,
typename _Range>
1216 requires __adaptor_invocable<_Adaptor, _Range, __like_t<_Self, _Args>...>
1218 operator()(
this _Self&& __self, _Range&& __r)
1220 return _Binder::_S_call(__like_t<_Self, _Partial>(__self)._M_binder,
1223# pragma GCC diagnostic pop
1225 template<
typename _Range>
1226 requires __adaptor_invocable<_Adaptor, _Range,
const _Args&...>
1228 operator()(_Range&& __r)
const &
1231 template<
typename _Range>
1232 requires __adaptor_invocable<_Adaptor, _Range, _Args...>
1234 operator()(_Range&& __r) &&
1237 template<
typename _Range>
1239 operator()(_Range&& __r)
const && =
delete;
1247 template<
typename _Adaptor,
typename... _Args>
1248 requires __adaptor_has_simple_extra_args<_Adaptor, _Args...>
1249 && (is_trivially_copy_constructible_v<_Args> && ...)
1250 struct _Partial<_Adaptor, _Args...> : _RangeAdaptorClosure<_Partial<_Adaptor, _Args...>>
1252 using _Binder = _Bind_back_t<_Adaptor, _Args...>;
1253 [[no_unique_address]] _Binder _M_binder;
1255 template<
typename... _Ts>
1257 _Partial(
int, _Ts&&... __args)
1258 : _M_binder(0, _Adaptor(), std::
forward<_Ts>(__args)...)
1263 template<
typename _Range>
1264 requires __adaptor_invocable<_Adaptor, _Range,
const _Args&...>
1266 operator()(_Range&& __r)
const
1269 static constexpr bool _S_has_simple_call_op =
true;
1272 template<
typename _Lhs,
typename _Rhs,
typename _Range>
1273 concept __pipe_invocable
1278 template<
typename _Lhs,
typename _Rhs>
1279 struct _Pipe : _RangeAdaptorClosure<_Pipe<_Lhs, _Rhs>>
1281 [[no_unique_address]] _Lhs _M_lhs;
1282 [[no_unique_address]] _Rhs _M_rhs;
1284 template<
typename _Tp,
typename _Up>
1286 _Pipe(_Tp&& __lhs, _Up&& __rhs)
1287 : _M_lhs(std::
forward<_Tp>(__lhs)), _M_rhs(std::
forward<_Up>(__rhs))
1292#if _GLIBCXX_EXPLICIT_THIS_PARAMETER
1293# pragma GCC diagnostic push
1294# pragma GCC diagnostic ignored "-Wc++23-extensions"
1295 template<
typename _Self,
typename _Range>
1296 requires __pipe_invocable<__like_t<_Self, _Lhs>, __like_t<_Self, _Rhs>, _Range>
1298 operator()(
this _Self&& __self, _Range&& __r)
1300 return (__like_t<_Self, _Pipe>(__self)._M_rhs
1301 (__like_t<_Self, _Pipe>(__self)._M_lhs
1304# pragma GCC diagnostic pop
1306 template<
typename _Range>
1307 requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
1309 operator()(_Range&& __r)
const &
1312 template<
typename _Range>
1313 requires __pipe_invocable<_Lhs, _Rhs, _Range>
1315 operator()(_Range&& __r) &&
1318 template<
typename _Range>
1320 operator()(_Range&& __r)
const && =
delete;
1328 template<
typename _Lhs,
typename _Rhs>
1329 requires __closure_has_simple_call_op<_Lhs>
1330 && __closure_has_simple_call_op<_Rhs>
1331 struct _Pipe<_Lhs, _Rhs> : _RangeAdaptorClosure<_Pipe<_Lhs, _Rhs>>
1333 [[no_unique_address]] _Lhs _M_lhs;
1334 [[no_unique_address]] _Rhs _M_rhs;
1336 template<
typename _Tp,
typename _Up>
1338 _Pipe(_Tp&& __lhs, _Up&& __rhs)
1339 : _M_lhs(std::
forward<_Tp>(__lhs)), _M_rhs(std::
forward<_Up>(__rhs))
1342 template<
typename _Range>
1343 requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
1345 operator()(_Range&& __r)
const
1348 static constexpr bool _S_has_simple_call_op =
true;
1352#if __cpp_lib_ranges >= 202202L
1354 template<
typename _Derived>
1355 requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
1356 class range_adaptor_closure
1357 :
public views::__adaptor::_RangeAdaptorClosure<_Derived>
1361 template<range _Range>
requires is_object_v<_Range>
1367 static void _S_fun(_Range&);
1368 static void _S_fun(_Range&&) =
delete;
1371 template<__detail::__different_from<ref_view> _Tp>
1372 requires convertible_to<_Tp, _Range&>
1384 constexpr iterator_t<_Range>
1386 {
return ranges::begin(*_M_r); }
1388 constexpr sentinel_t<_Range>
1390 {
return ranges::end(*_M_r); }
1393 empty() const requires requires { ranges::empty(*_M_r); }
1394 {
return ranges::empty(*_M_r); }
1397 size() const requires sized_range<_Range>
1398 {
return ranges::size(*_M_r); }
1401 data() const requires contiguous_range<_Range>
1402 {
return ranges::data(*_M_r); }
1405 template<
typename _Range>
1406 ref_view(_Range&) -> ref_view<_Range>;
1408 template<
typename _Tp>
1409 inline constexpr bool enable_borrowed_range<ref_view<_Tp>> =
true;
1411 template<range _Range>
1412 requires movable<_Range>
1413 && (!__detail::__is_initializer_list<remove_cv_t<_Range>>)
1417 _Range _M_r = _Range();
1420 owning_view()
requires default_initializable<_Range> = default;
1423 owning_view(_Range&& __t)
1424 noexcept(is_nothrow_move_constructible_v<_Range>)
1425 : _M_r(std::move(__t))
1428 owning_view(owning_view&&) =
default;
1429 owning_view& operator=(owning_view&&) =
default;
1435 constexpr const _Range&
1436 base() const& noexcept
1443 constexpr const _Range&&
1444 base() const&& noexcept
1447 constexpr iterator_t<_Range>
1449 {
return ranges::begin(_M_r); }
1451 constexpr sentinel_t<_Range>
1453 {
return ranges::end(_M_r); }
1457 {
return ranges::begin(_M_r); }
1460 end() const requires
range<const _Range>
1461 {
return ranges::end(_M_r); }
1464 empty()
requires requires { ranges::empty(_M_r); }
1465 {
return ranges::empty(_M_r); }
1468 empty() const requires requires { ranges::empty(_M_r); }
1469 {
return ranges::empty(_M_r); }
1473 {
return ranges::size(_M_r); }
1477 {
return ranges::size(_M_r); }
1481 {
return ranges::data(_M_r); }
1485 {
return ranges::data(_M_r); }
1488 template<
typename _Tp>
1489 inline constexpr bool enable_borrowed_range<owning_view<_Tp>>
1490 = enable_borrowed_range<_Tp>;
1496 template<
typename _Range>
1499 template<
typename _Range>
1503 struct _All : __adaptor::_RangeAdaptorClosure<_All>
1505 template<
typename _Range>
1506 static constexpr bool
1509 if constexpr (view<decay_t<_Range>>)
1511 else if constexpr (__detail::__can_ref_view<_Range>)
1517 template<viewable_range _Range>
1518 requires view<decay_t<_Range>>
1519 || __detail::__can_ref_view<_Range>
1520 || __detail::__can_owning_view<_Range>
1522 operator() [[nodiscard]] (_Range&& __r)
const
1523 noexcept(_S_noexcept<_Range>())
1525 if constexpr (view<decay_t<_Range>>)
1527 else if constexpr (__detail::__can_ref_view<_Range>)
1533 static constexpr bool _S_has_simple_call_op =
true;
1536 inline constexpr _All all;
1538 template<viewable_range _Range>
1544 template<
typename _Tp>
1545 struct __non_propagating_cache
1553 template<
typename _Tp>
1554 requires is_object_v<_Tp>
1555 struct __non_propagating_cache<_Tp>
1556 :
protected _Optional_base<_Tp>
1558 __non_propagating_cache() =
default;
1561 __non_propagating_cache(
const __non_propagating_cache&)
noexcept
1565 __non_propagating_cache(__non_propagating_cache&& __other)
noexcept
1566 { __other._M_reset(); }
1568 constexpr __non_propagating_cache&
1569 operator=(
const __non_propagating_cache& __other)
noexcept
1576 constexpr __non_propagating_cache&
1577 operator=(__non_propagating_cache&& __other)
noexcept
1584 constexpr __non_propagating_cache&
1585 operator=(_Tp __val)
1588 this->_M_payload._M_construct(
std::move(__val));
1593 operator bool() const noexcept
1594 {
return this->_M_is_engaged(); }
1598 {
return this->_M_get(); }
1600 constexpr const _Tp&
1602 {
return this->_M_get(); }
1604 template<
typename _Iter>
1606 _M_emplace_deref(
const _Iter& __i)
1609 auto __f = [] (
auto& __x) {
return *__x; };
1610 this->_M_payload._M_apply(_Optional_func{__f}, __i);
1611 return this->_M_get();
1614 using _Optional_base<_Tp>::_M_reset;
1617 template<range _Range>
1618 struct _CachedPosition
1621 _M_has_value()
const
1624 constexpr iterator_t<_Range>
1625 _M_get(
const _Range&)
const
1627 __glibcxx_assert(
false);
1628 __builtin_unreachable();
1632 _M_set(
const _Range&,
const iterator_t<_Range>&)
const
1636 template<forward_range _Range>
1637 struct _CachedPosition<_Range>
1638 :
protected __non_propagating_cache<iterator_t<_Range>>
1641 _M_has_value()
const
1642 {
return this->_M_is_engaged(); }
1644 constexpr iterator_t<_Range>
1645 _M_get(
const _Range&)
const
1647 __glibcxx_assert(_M_has_value());
1652 _M_set(
const _Range&,
const iterator_t<_Range>& __it)
1654 __glibcxx_assert(!_M_has_value());
1657 this->_M_payload._M_engaged =
true;
1661 template<random_access_range _Range>
1662 struct _CachedPosition<_Range>
1665 range_difference_t<_Range> _M_offset = -1;
1668 _CachedPosition() =
default;
1671 _CachedPosition(
const _CachedPosition&) =
default;
1674 _CachedPosition(_CachedPosition&& __other)
noexcept
1677 constexpr _CachedPosition&
1678 operator=(
const _CachedPosition&) =
default;
1680 constexpr _CachedPosition&
1681 operator=(_CachedPosition&& __other)
noexcept
1684 _M_offset = __other._M_offset;
1685 __other._M_offset = -1;
1690 _M_has_value()
const
1691 {
return _M_offset >= 0; }
1693 constexpr iterator_t<_Range>
1694 _M_get(_Range& __r)
const
1696 __glibcxx_assert(_M_has_value());
1697 return ranges::begin(__r) + _M_offset;
1701 _M_set(_Range& __r,
const iterator_t<_Range>& __it)
1703 __glibcxx_assert(!_M_has_value());
1704 _M_offset = __it - ranges::begin(__r);
1711 template<
typename _Base>
1712 struct __filter_view_iter_cat
1715 template<forward_range _Base>
1716 struct __filter_view_iter_cat<_Base>
1722 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
1723 if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
1724 return bidirectional_iterator_tag{};
1725 else if constexpr (derived_from<_Cat, forward_iterator_tag>)
1726 return forward_iterator_tag{};
1731 using iterator_category =
decltype(_S_iter_cat());
1736 indirect_unary_predicate<iterator_t<_Vp>> _Pred>
1737 requires view<_Vp> && is_object_v<_Pred>
1738 class filter_view :
public view_interface<filter_view<_Vp, _Pred>>
1743 struct _Iterator : __detail::__filter_view_iter_cat<_Vp>
1746 static constexpr auto
1749 if constexpr (bidirectional_range<_Vp>)
1750 return bidirectional_iterator_tag{};
1751 else if constexpr (forward_range<_Vp>)
1752 return forward_iterator_tag{};
1754 return input_iterator_tag{};
1759 using _Vp_iter = iterator_t<_Vp>;
1761 _Vp_iter _M_current = _Vp_iter();
1762 filter_view* _M_parent =
nullptr;
1765 using iterator_concept =
decltype(_S_iter_concept());
1767 using value_type = range_value_t<_Vp>;
1768 using difference_type = range_difference_t<_Vp>;
1770 _Iterator()
requires default_initializable<_Vp_iter> = default;
1773 _Iterator(filter_view* __parent, _Vp_iter __current)
1774 : _M_current(std::move(__current)),
1778 constexpr const _Vp_iter&
1779 base() const & noexcept
1780 {
return _M_current; }
1786 constexpr range_reference_t<_Vp>
1788 {
return *_M_current; }
1792 requires __detail::__has_arrow<_Vp_iter>
1793 && copyable<_Vp_iter>
1794 {
return _M_current; }
1796 constexpr _Iterator&
1799 _M_current = ranges::find_if(
std::move(++_M_current),
1800 ranges::end(_M_parent->_M_base),
1810 operator++(
int)
requires forward_range<_Vp>
1817 constexpr _Iterator&
1818 operator--()
requires bidirectional_range<_Vp>
1827 operator--(
int)
requires bidirectional_range<_Vp>
1834 friend constexpr bool
1835 operator==(
const _Iterator& __x,
const _Iterator& __y)
1836 requires equality_comparable<_Vp_iter>
1837 {
return __x._M_current == __y._M_current; }
1839 friend constexpr range_rvalue_reference_t<_Vp>
1840 iter_move(
const _Iterator& __i)
1841 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
1842 {
return ranges::iter_move(__i._M_current); }
1844 friend constexpr void
1845 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
1846 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
1847 requires indirectly_swappable<_Vp_iter>
1848 { ranges::iter_swap(__x._M_current, __y._M_current); }
1854 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
1857 __equal(
const _Iterator& __i)
const
1858 {
return __i._M_current == _M_end; }
1861 _Sentinel() =
default;
1864 _Sentinel(filter_view* __parent)
1865 : _M_end(ranges::end(__parent->_M_base))
1868 constexpr sentinel_t<_Vp>
1872 friend constexpr bool
1873 operator==(
const _Iterator& __x,
const _Sentinel& __y)
1874 {
return __y.__equal(__x); }
1877 _Vp _M_base = _Vp();
1878 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
1879 [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
1882 filter_view()
requires (default_initializable<_Vp>
1883 && default_initializable<_Pred>)
1887 filter_view(_Vp __base, _Pred __pred)
1888 : _M_base(std::move(
__base)), _M_pred(std::move(__pred))
1892 base() const& requires copy_constructible<_Vp>
1899 constexpr const _Pred&
1901 {
return *_M_pred; }
1906 if (_M_cached_begin._M_has_value())
1907 return {
this, _M_cached_begin._M_get(_M_base)};
1909 __glibcxx_assert(_M_pred.has_value());
1910 auto __it = ranges::find_if(ranges::begin(_M_base),
1911 ranges::end(_M_base),
1913 _M_cached_begin._M_set(_M_base, __it);
1920 if constexpr (common_range<_Vp>)
1921 return _Iterator{
this, ranges::end(_M_base)};
1923 return _Sentinel{
this};
1927 template<
typename _Range,
typename _Pred>
1928 filter_view(_Range&&, _Pred) -> filter_view<views::all_t<_Range>, _Pred>;
1934 template<
typename _Range,
typename _Pred>
1935 concept __can_filter_view
1939 struct _Filter : __adaptor::_RangeAdaptor<_Filter>
1941 template<viewable_range _Range,
typename _Pred>
1942 requires __detail::__can_filter_view<_Range, _Pred>
1944 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
1949 using _RangeAdaptor<_Filter>::operator();
1950 static constexpr int _S_arity = 2;
1951 static constexpr bool _S_has_simple_extra_args =
true;
1954 inline constexpr _Filter filter;
1957#if __cpp_lib_ranges >= 202207L
1958 template<input_range _Vp, move_constructible _Fp>
1960 template<input_range _Vp, copy_constructible _Fp>
1963 && regular_invocable<_Fp&, range_reference_t<_Vp>>
1964 && std::__detail::__can_reference<invoke_result_t<_Fp&,
1965 range_reference_t<_Vp>>>
1966 class transform_view :
public view_interface<transform_view<_Vp, _Fp>>
1969 template<
bool _Const>
1970 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
1972 template<
bool _Const>
1976 template<
bool _Const>
1977 requires forward_range<_Base<_Const>>
1978 struct __iter_cat<_Const>
1987 using _Base = transform_view::_Base<_Const>;
1988 using _Res = invoke_result_t<__maybe_const_t<_Const, _Fp>&,
1989 range_reference_t<_Base>>;
1992 if constexpr (is_reference_v<_Res>)
1995 =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
1996 if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
1997 return random_access_iterator_tag{};
2002 return input_iterator_tag{};
2005 using iterator_category =
decltype(_S_iter_cat());
2008 template<
bool _Const>
2011 template<
bool _Const>
2012 struct _Iterator : __iter_cat<_Const>
2015 using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
2016 using _Base = transform_view::_Base<_Const>;
2017 using _Base_iter = iterator_t<_Base>;
2018 using _Func_handle = __detail::__func_handle_t<
2019 __detail::__maybe_const_t<_Const, _Fp>,
2025 if constexpr (random_access_range<_Base>)
2026 return random_access_iterator_tag{};
2027 else if constexpr (bidirectional_range<_Base>)
2028 return bidirectional_iterator_tag{};
2029 else if constexpr (forward_range<_Base>)
2030 return forward_iterator_tag{};
2032 return input_iterator_tag{};
2035 _Base_iter _M_current = _Base_iter();
2036 [[no_unique_address]] _Func_handle _M_fun;
2039 using iterator_concept =
decltype(_S_iter_concept());
2042 = remove_cvref_t<invoke_result_t<__maybe_const_t<_Const, _Fp>&,
2043 range_reference_t<_Base>>>;
2044 using difference_type = range_difference_t<_Base>;
2046 _Iterator()
requires default_initializable<_Base_iter> = default;
2049 _Iterator(_Func_handle __fun, _Base_iter __current)
2050 : _M_current(std::move(__current)), _M_fun(__fun)
2054 _Iterator(_Parent* __parent, _Base_iter __current)
2055 : _M_current(std::move(__current)), _M_fun(*__parent->_M_fun)
2059 _Iterator(_Iterator<!_Const> __i)
2061 && convertible_to<iterator_t<_Vp>, _Base_iter>
2062 : _M_current(
std::move(__i._M_current)), _M_fun(__i._M_fun)
2065 constexpr const _Base_iter&
2066 base() const & noexcept
2067 {
return _M_current; }
2069 constexpr _Base_iter
2073 constexpr decltype(
auto)
2075 noexcept(
noexcept(_M_fun._M_call_deref(_M_current)))
2076 {
return _M_fun._M_call_deref(_M_current); }
2078 constexpr _Iterator&
2090 operator++(
int)
requires forward_range<_Base>
2097 constexpr _Iterator&
2098 operator--()
requires bidirectional_range<_Base>
2105 operator--(
int)
requires bidirectional_range<_Base>
2112 constexpr _Iterator&
2113 operator+=(difference_type __n)
requires random_access_range<_Base>
2119 constexpr _Iterator&
2120 operator-=(difference_type __n)
requires random_access_range<_Base>
2126 constexpr decltype(
auto)
2127 operator[](difference_type __n)
const
2128 requires random_access_range<_Base>
2129 {
return _M_fun._M_call_subscript(__n, _M_current); }
2131 friend constexpr bool
2132 operator==(
const _Iterator& __x,
const _Iterator& __y)
2133 requires equality_comparable<_Base_iter>
2134 {
return __x._M_current == __y._M_current; }
2136 friend constexpr bool
2137 operator<(
const _Iterator& __x,
const _Iterator& __y)
2138 requires random_access_range<_Base>
2139 {
return __x._M_current < __y._M_current; }
2141 friend constexpr bool
2142 operator>(
const _Iterator& __x,
const _Iterator& __y)
2143 requires random_access_range<_Base>
2144 {
return __y < __x; }
2146 friend constexpr bool
2147 operator<=(
const _Iterator& __x,
const _Iterator& __y)
2148 requires random_access_range<_Base>
2149 {
return !(__y < __x); }
2151 friend constexpr bool
2152 operator>=(
const _Iterator& __x,
const _Iterator& __y)
2153 requires random_access_range<_Base>
2154 {
return !(__x < __y); }
2156#ifdef __cpp_lib_three_way_comparison
2157 friend constexpr auto
2158 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
2159 requires random_access_range<_Base>
2160 && three_way_comparable<_Base_iter>
2161 {
return __x._M_current <=> __y._M_current; }
2164 friend constexpr _Iterator
2165 operator+(_Iterator __i, difference_type __n)
2166 requires random_access_range<_Base>
2167 {
return {__i._M_fun, __i._M_current + __n}; }
2169 friend constexpr _Iterator
2170 operator+(difference_type __n, _Iterator __i)
2171 requires random_access_range<_Base>
2172 {
return {__i._M_fun, __i._M_current + __n}; }
2174 friend constexpr _Iterator
2175 operator-(_Iterator __i, difference_type __n)
2176 requires random_access_range<_Base>
2177 {
return {__i._M_fun, __i._M_current - __n}; }
2181 friend constexpr difference_type
2182 operator-(
const _Iterator& __x,
const _Iterator& __y)
2183 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
2184 {
return __x._M_current - __y._M_current; }
2186 friend constexpr decltype(
auto)
2187 iter_move(
const _Iterator& __i)
noexcept(
noexcept(*__i))
2189 if constexpr (is_lvalue_reference_v<
decltype(*__i)>)
2195 friend _Iterator<!_Const>;
2196 template<
bool>
friend struct _Sentinel;
2199 template<
bool _Const>
2203 using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
2204 using _Base = transform_view::_Base<_Const>;
2206 template<
bool _Const2>
2208 __distance_from(
const _Iterator<_Const2>& __i)
const
2209 {
return _M_end - __i._M_current; }
2211 template<
bool _Const2>
2213 __equal(
const _Iterator<_Const2>& __i)
const
2214 {
return __i._M_current == _M_end; }
2216 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2219 _Sentinel() =
default;
2222 _Sentinel(sentinel_t<_Base> __end)
2227 _Sentinel(_Sentinel<!_Const> __i)
2229 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2233 constexpr sentinel_t<_Base>
2237 template<
bool _Const2>
2238 requires sentinel_for<sentinel_t<_Base>,
2239 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
2240 friend constexpr bool
2241 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
2242 {
return __y.__equal(__x); }
2244 template<
bool _Const2,
2245 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
2246 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2247 friend constexpr range_difference_t<_Base2>
2248 operator-(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
2249 {
return -__y.__distance_from(__x); }
2251 template<
bool _Const2,
2252 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
2253 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2254 friend constexpr range_difference_t<_Base2>
2255 operator-(
const _Sentinel& __y,
const _Iterator<_Const2>& __x)
2256 {
return __y.__distance_from(__x); }
2258 friend _Sentinel<!_Const>;
2261 _Vp _M_base = _Vp();
2262 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
2265 transform_view()
requires (default_initializable<_Vp>
2266 && default_initializable<_Fp>)
2270 transform_view(_Vp __base, _Fp __fun)
2271 : _M_base(std::move(
__base)), _M_fun(std::move(__fun))
2275 base() const& requires copy_constructible<_Vp>
2276 {
return _M_base ; }
2282 constexpr _Iterator<false>
2284 {
return _Iterator<false>{
this, ranges::begin(_M_base)}; }
2286 constexpr _Iterator<true>
2288 requires range<const _Vp>
2289 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2290 {
return _Iterator<true>{
this, ranges::begin(_M_base)}; }
2292 constexpr _Sentinel<false>
2294 {
return _Sentinel<false>{ranges::end(_M_base)}; }
2296 constexpr _Iterator<false>
2297 end()
requires common_range<_Vp>
2298 {
return _Iterator<false>{
this, ranges::end(_M_base)}; }
2300 constexpr _Sentinel<true>
2302 requires range<const _Vp>
2303 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2304 {
return _Sentinel<true>{ranges::end(_M_base)}; }
2306 constexpr _Iterator<true>
2308 requires common_range<const _Vp>
2309 && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
2310 {
return _Iterator<true>{
this, ranges::end(_M_base)}; }
2313 size()
requires sized_range<_Vp>
2314 {
return ranges::size(_M_base); }
2317 size() const requires sized_range<const _Vp>
2318 {
return ranges::size(_M_base); }
2321 template<
typename _Range,
typename _Fp>
2322 transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>;
2328 template<
typename _Range,
typename _Fp>
2329 concept __can_transform_view
2333 struct _Transform : __adaptor::_RangeAdaptor<_Transform>
2335 template<viewable_range _Range,
typename _Fp>
2336 requires __detail::__can_transform_view<_Range, _Fp>
2338 operator() [[nodiscard]] (_Range&& __r, _Fp&& __f)
const
2343 using _RangeAdaptor<_Transform>::operator();
2344 static constexpr int _S_arity = 2;
2345 static constexpr bool _S_has_simple_extra_args =
true;
2348 inline constexpr _Transform transform;
2355 template<
bool _Const>
2356 using _CI = counted_iterator<
2357 iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>;
2359 template<
bool _Const>
2363 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2364 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2367 _Sentinel() =
default;
2370 _Sentinel(sentinel_t<_Base> __end)
2375 _Sentinel(_Sentinel<!_Const> __s)
2376 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2380 constexpr sentinel_t<_Base>
2384 friend constexpr bool
2385 operator==(
const _CI<_Const>& __y,
const _Sentinel& __x)
2386 {
return __y.count() == 0 || __y.base() == __x._M_end; }
2388 template<
bool _OtherConst = !_Const,
2389 typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
2390 requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2391 friend constexpr bool
2392 operator==(
const _CI<_OtherConst>& __y,
const _Sentinel& __x)
2393 {
return __y.count() == 0 || __y.base() == __x._M_end; }
2395 friend _Sentinel<!_Const>;
2398 _Vp _M_base = _Vp();
2399 range_difference_t<_Vp> _M_count = 0;
2402 take_view()
requires default_initializable<_Vp> = default;
2405 take_view(_Vp __base, range_difference_t<_Vp> __count)
2406 : _M_base(std::move(__base)), _M_count(std::move(__count))
2410 base() const& requires copy_constructible<_Vp>
2418 begin()
requires (!__detail::__simple_view<_Vp>)
2420 if constexpr (sized_range<_Vp>)
2422 if constexpr (random_access_range<_Vp>)
2423 return ranges::begin(_M_base);
2427 return counted_iterator(ranges::begin(_M_base), __sz);
2431 return counted_iterator(ranges::begin(_M_base), _M_count);
2435 begin() const requires range<const _Vp>
2437 if constexpr (sized_range<const _Vp>)
2439 if constexpr (random_access_range<const _Vp>)
2440 return ranges::begin(_M_base);
2444 return counted_iterator(ranges::begin(_M_base), __sz);
2448 return counted_iterator(ranges::begin(_M_base), _M_count);
2452 end()
requires (!__detail::__simple_view<_Vp>)
2454 if constexpr (sized_range<_Vp>)
2456 if constexpr (random_access_range<_Vp>)
2457 return ranges::begin(_M_base) + size();
2462 return _Sentinel<false>{ranges::end(_M_base)};
2466 end() const requires range<const _Vp>
2468 if constexpr (sized_range<const _Vp>)
2470 if constexpr (random_access_range<const _Vp>)
2471 return ranges::begin(_M_base) + size();
2476 return _Sentinel<true>{ranges::end(_M_base)};
2480 size()
requires sized_range<_Vp>
2482 auto __n = ranges::size(_M_base);
2483 return std::min(__n,
static_cast<decltype(__n)
>(_M_count));
2487 size() const requires sized_range<const _Vp>
2489 auto __n = ranges::size(_M_base);
2490 return std::min(__n,
static_cast<decltype(__n)
>(_M_count));
2497 template<
typename _Range>
2498 take_view(_Range&&, range_difference_t<_Range>)
2499 -> take_view<views::all_t<_Range>>;
2501 template<
typename _Tp>
2502 inline constexpr bool enable_borrowed_range<take_view<_Tp>>
2503 = enable_borrowed_range<_Tp>;
2509 template<
typename _Range>
2510 inline constexpr bool __is_empty_view =
false;
2512 template<
typename _Tp>
2513 inline constexpr bool __is_empty_view<empty_view<_Tp>> =
true;
2515 template<
typename _Range>
2516 inline constexpr bool __is_basic_string_view =
false;
2518 template<
typename _CharT,
typename _Traits>
2519 inline constexpr bool __is_basic_string_view<basic_string_view<_CharT, _Traits>>
2522 using ranges::__detail::__is_subrange;
2524 template<
typename _Range>
2525 inline constexpr bool __is_iota_view =
false;
2527 template<
typename _Winc,
typename _Bound>
2528 inline constexpr bool __is_iota_view<iota_view<_Winc, _Bound>> =
true;
2530 template<
typename _Range>
2531 inline constexpr bool __is_repeat_view =
false;
2533 template<
typename _Range>
2535 __take_of_repeat_view(_Range&&, range_difference_t<_Range>);
2537 template<
typename _Range,
typename _Dp>
2538 concept __can_take_view
2542 struct _Take : __adaptor::_RangeAdaptor<_Take>
2544 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
2545 requires __detail::__can_take_view<_Range, _Dp>
2547 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
2549 using _Tp = remove_cvref_t<_Range>;
2550 if constexpr (__detail::__is_empty_view<_Tp>)
2552#ifdef __cpp_lib_optional_range_support
2553 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
2556 else if constexpr (random_access_range<_Tp>
2558 && (std::__detail::__is_span<_Tp>
2559 || __detail::__is_basic_string_view<_Tp>
2560 || __detail::__is_subrange<_Tp>
2561 || __detail::__is_iota_view<_Tp>))
2564 auto __begin = ranges::begin(__r);
2565 auto __end = __begin + __n;
2566 if constexpr (std::__detail::__is_span<_Tp>)
2567 return span<typename _Tp::element_type>(__begin, __end);
2568 else if constexpr (__detail::__is_basic_string_view<_Tp>)
2569 return _Tp(__begin, __end);
2570 else if constexpr (__detail::__is_subrange<_Tp>)
2571 return subrange<iterator_t<_Tp>>(__begin, __end);
2573 return iota_view(*__begin, *__end);
2575 else if constexpr (__detail::__is_repeat_view<_Tp>)
2581 using _RangeAdaptor<_Take>::operator();
2582 static constexpr int _S_arity = 2;
2586 template<
typename _Tp>
2587 static constexpr bool _S_has_simple_extra_args
2588 = ranges::__detail::__is_integer_like<_Tp>;
2591 inline constexpr _Take take;
2594 template<view _Vp,
typename _Pred>
2596 && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
2597 class take_while_view :
public view_interface<take_while_view<_Vp, _Pred>>
2599 template<
bool _Const>
2603 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2605 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
2606 const _Pred* _M_pred =
nullptr;
2609 _Sentinel() =
default;
2612 _Sentinel(sentinel_t<_Base> __end,
const _Pred* __pred)
2613 : _M_end(__end), _M_pred(__pred)
2617 _Sentinel(_Sentinel<!_Const> __s)
2618 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
2619 : _M_end(__s._M_end), _M_pred(__s._M_pred)
2622 constexpr sentinel_t<_Base>
2623 base()
const {
return _M_end; }
2625 friend constexpr bool
2626 operator==(
const iterator_t<_Base>& __x,
const _Sentinel& __y)
2627 {
return __y._M_end == __x || !
std::__invoke(*__y._M_pred, *__x); }
2629 template<
bool _OtherConst = !_Const,
2630 typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
2631 requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
2632 friend constexpr bool
2633 operator==(
const iterator_t<_Base2>& __x,
const _Sentinel& __y)
2634 {
return __y._M_end == __x || !
std::__invoke(*__y._M_pred, *__x); }
2636 friend _Sentinel<!_Const>;
2639 _Vp _M_base = _Vp();
2640 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
2643 take_while_view()
requires (default_initializable<_Vp>
2644 && default_initializable<_Pred>)
2648 take_while_view(_Vp __base, _Pred __pred)
2649 : _M_base(std::move(
__base)), _M_pred(std::move(__pred))
2653 base() const& requires copy_constructible<_Vp>
2660 constexpr const _Pred&
2662 {
return *_M_pred; }
2665 begin()
requires (!__detail::__simple_view<_Vp>)
2666 {
return ranges::begin(_M_base); }
2669 begin() const requires range<const _Vp>
2670 && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
2671 {
return ranges::begin(_M_base); }
2674 end()
requires (!__detail::__simple_view<_Vp>)
2675 {
return _Sentinel<false>(ranges::end(_M_base),
2679 end() const requires range<const _Vp>
2680 && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
2681 {
return _Sentinel<true>(ranges::end(_M_base),
2685 template<
typename _Range,
typename _Pred>
2686 take_while_view(_Range&&, _Pred)
2687 -> take_while_view<views::all_t<_Range>, _Pred>;
2693 template<
typename _Range,
typename _Pred>
2694 concept __can_take_while_view
2698 struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile>
2700 template<viewable_range _Range,
typename _Pred>
2701 requires __detail::__can_take_while_view<_Range, _Pred>
2703 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
2708 using _RangeAdaptor<_TakeWhile>::operator();
2709 static constexpr int _S_arity = 2;
2710 static constexpr bool _S_has_simple_extra_args =
true;
2713 inline constexpr _TakeWhile take_while;
2720 _Vp _M_base = _Vp();
2721 range_difference_t<_Vp> _M_count = 0;
2725 static constexpr bool _S_needs_cached_begin
2726 = !(random_access_range<const _Vp> && sized_range<const _Vp>);
2727 [[no_unique_address]]
2728 __detail::__maybe_present_t<_S_needs_cached_begin,
2729 __detail::_CachedPosition<_Vp>>
2733 drop_view()
requires default_initializable<_Vp> = default;
2736 drop_view(_Vp __base, range_difference_t<_Vp> __count)
2737 : _M_base(std::move(__base)), _M_count(__count)
2738 { __glibcxx_assert(__count >= 0); }
2741 base() const& requires copy_constructible<_Vp>
2751 requires (!(__detail::__simple_view<_Vp>
2752 && random_access_range<const _Vp>
2753 && sized_range<const _Vp>))
2755 if constexpr (_S_needs_cached_begin)
2756 if (_M_cached_begin._M_has_value())
2757 return _M_cached_begin._M_get(_M_base);
2759 auto __it = ranges::next(ranges::begin(_M_base),
2760 _M_count, ranges::end(_M_base));
2761 if constexpr (_S_needs_cached_begin)
2762 _M_cached_begin._M_set(_M_base, __it);
2770 requires random_access_range<const _Vp> && sized_range<const _Vp>
2772 return ranges::begin(_M_base) + ranges::min(ranges::distance(_M_base),
2777 end()
requires (!__detail::__simple_view<_Vp>)
2778 {
return ranges::end(_M_base); }
2781 end() const requires range<const _Vp>
2782 {
return ranges::end(_M_base); }
2785 size()
requires sized_range<_Vp>
2787 const auto __s = ranges::size(_M_base);
2788 const auto __c =
static_cast<decltype(__s)
>(_M_count);
2789 return __s < __c ? 0 : __s - __c;
2793 size() const requires sized_range<const _Vp>
2795 const auto __s = ranges::size(_M_base);
2796 const auto __c =
static_cast<decltype(__s)
>(_M_count);
2797 return __s < __c ? 0 : __s - __c;
2801 template<
typename _Range>
2802 drop_view(_Range&&, range_difference_t<_Range>)
2803 -> drop_view<views::all_t<_Range>>;
2805 template<
typename _Tp>
2806 inline constexpr bool enable_borrowed_range<drop_view<_Tp>>
2807 = enable_borrowed_range<_Tp>;
2813 template<
typename _Range>
2815 __drop_of_repeat_view(_Range&&, range_difference_t<_Range>);
2817 template<
typename _Range,
typename _Dp>
2818 concept __can_drop_view
2822 struct _Drop : __adaptor::_RangeAdaptor<_Drop>
2824 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
2825 requires __detail::__can_drop_view<_Range, _Dp>
2827 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
2829 using _Tp = remove_cvref_t<_Range>;
2830 if constexpr (__detail::__is_empty_view<_Tp>)
2832#ifdef __cpp_lib_optional_range_support
2833 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
2836 else if constexpr (random_access_range<_Tp>
2838 && (std::__detail::__is_span<_Tp>
2839 || __detail::__is_basic_string_view<_Tp>
2840 || __detail::__is_iota_view<_Tp>
2841 || __detail::__is_subrange<_Tp>))
2844 auto __begin = ranges::begin(__r) + __n;
2845 auto __end = ranges::end(__r);
2846 if constexpr (std::__detail::__is_span<_Tp>)
2847 return span<typename _Tp::element_type>(__begin, __end);
2848 else if constexpr (__detail::__is_subrange<_Tp>)
2850 if constexpr (_Tp::_S_store_size)
2852 using ranges::__detail::__to_unsigned_like;
2853 auto __m = ranges::distance(__r) - __n;
2854 return _Tp(__begin, __end, __to_unsigned_like(__m));
2857 return _Tp(__begin, __end);
2860 return _Tp(__begin, __end);
2862 else if constexpr (__detail::__is_repeat_view<_Tp>)
2868 using _RangeAdaptor<_Drop>::operator();
2869 static constexpr int _S_arity = 2;
2870 template<
typename _Tp>
2871 static constexpr bool _S_has_simple_extra_args
2872 = _Take::_S_has_simple_extra_args<_Tp>;
2875 inline constexpr _Drop drop;
2878 template<view _Vp,
typename _Pred>
2880 && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
2881 class drop_while_view :
public view_interface<drop_while_view<_Vp, _Pred>>
2884 _Vp _M_base = _Vp();
2885 [[no_unique_address]] __detail::__box<_Pred> _M_pred;
2886 [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
2889 drop_while_view()
requires (default_initializable<_Vp>
2890 && default_initializable<_Pred>)
2894 drop_while_view(_Vp __base, _Pred __pred)
2895 : _M_base(std::move(
__base)), _M_pred(std::move(__pred))
2899 base() const& requires copy_constructible<_Vp>
2906 constexpr const _Pred&
2908 {
return *_M_pred; }
2913 if (_M_cached_begin._M_has_value())
2914 return _M_cached_begin._M_get(_M_base);
2916 __glibcxx_assert(_M_pred.has_value());
2917 auto __it = ranges::find_if_not(ranges::begin(_M_base),
2918 ranges::end(_M_base),
2920 _M_cached_begin._M_set(_M_base, __it);
2926 {
return ranges::end(_M_base); }
2929 template<
typename _Range,
typename _Pred>
2930 drop_while_view(_Range&&, _Pred)
2931 -> drop_while_view<views::all_t<_Range>, _Pred>;
2933 template<
typename _Tp,
typename _Pred>
2934 inline constexpr bool enable_borrowed_range<drop_while_view<_Tp, _Pred>>
2935 = enable_borrowed_range<_Tp>;
2941 template<
typename _Range,
typename _Pred>
2942 concept __can_drop_while_view
2946 struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile>
2948 template<viewable_range _Range,
typename _Pred>
2949 requires __detail::__can_drop_while_view<_Range, _Pred>
2951 operator() [[nodiscard]] (_Range&& __r, _Pred&& __p)
const
2957 using _RangeAdaptor<_DropWhile>::operator();
2958 static constexpr int _S_arity = 2;
2959 static constexpr bool _S_has_simple_extra_args =
true;
2962 inline constexpr _DropWhile drop_while;
2967 template<
typename _Tp>
2969 __as_lvalue(_Tp&& __t)
2970 {
return static_cast<_Tp&
>(__t); }
2973 template<input_range _Vp>
2978 using _InnerRange = range_reference_t<_Vp>;
2980 template<
bool _Const>
2981 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
2983 template<
bool _Const>
2984 using _Outer_iter = iterator_t<_Base<_Const>>;
2986 template<
bool _Const>
2987 using _Inner_iter = iterator_t<range_reference_t<_Base<_Const>>>;
2989 template<
bool _Const>
2990 static constexpr bool _S_ref_is_glvalue
2991 = is_reference_v<range_reference_t<_Base<_Const>>>;
2993 template<
bool _Const>
2997 template<
bool _Const>
2998 requires _S_ref_is_glvalue<_Const>
2999 && forward_range<_Base<_Const>>
3000 && forward_range<range_reference_t<_Base<_Const>>>
3001 struct __iter_cat<_Const>
3004 static constexpr auto
3007 using _Outer_iter = join_view::_Outer_iter<_Const>;
3008 using _Inner_iter = join_view::_Inner_iter<_Const>;
3009 using _OuterCat =
typename iterator_traits<_Outer_iter>::iterator_category;
3010 using _InnerCat =
typename iterator_traits<_Inner_iter>::iterator_category;
3011 if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
3012 && derived_from<_InnerCat, bidirectional_iterator_tag>
3013 && common_range<range_reference_t<_Base<_Const>>>)
3014 return bidirectional_iterator_tag{};
3015 else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
3016 && derived_from<_InnerCat, forward_iterator_tag>)
3017 return forward_iterator_tag{};
3019 return input_iterator_tag{};
3022 using iterator_category =
decltype(_S_iter_cat());
3025 template<
bool _Const>
3028 template<
bool _Const>
3029 struct _Iterator : __iter_cat<_Const>
3032 using _Parent = __detail::__maybe_const_t<_Const, join_view>;
3033 using _Base = join_view::_Base<_Const>;
3037 static constexpr bool _S_ref_is_glvalue
3038 = join_view::_S_ref_is_glvalue<_Const>;
3043 auto __update_inner = [
this] (
const iterator_t<_Base>& __x) ->
auto&& {
3044 if constexpr (_S_ref_is_glvalue)
3047 return _M_parent->_M_inner._M_emplace_deref(__x);
3050 _Outer_iter& __outer = _M_get_outer();
3051 for (; __outer != ranges::end(_M_parent->_M_base); ++__outer)
3053 auto&& __inner = __update_inner(__outer);
3054 _M_inner = ranges::begin(__inner);
3055 if (_M_inner != ranges::end(__inner))
3059 if constexpr (_S_ref_is_glvalue)
3061 if constexpr (forward_iterator<_Inner_iter>)
3062 _M_inner = _Inner_iter();
3068 static constexpr auto
3071 if constexpr (_S_ref_is_glvalue
3072 && bidirectional_range<_Base>
3073 && bidirectional_range<range_reference_t<_Base>>
3074 && common_range<range_reference_t<_Base>>)
3075 return bidirectional_iterator_tag{};
3076 else if constexpr (_S_ref_is_glvalue
3077 && forward_range<_Base>
3078 && forward_range<range_reference_t<_Base>>)
3079 return forward_iterator_tag{};
3081 return input_iterator_tag{};
3084 using _Outer_iter = join_view::_Outer_iter<_Const>;
3085 using _Inner_iter = join_view::_Inner_iter<_Const>;
3087 constexpr _Outer_iter&
3090 if constexpr (forward_range<_Base>)
3093 return *_M_parent->_M_outer;
3096 constexpr const _Outer_iter&
3097 _M_get_outer()
const
3099 if constexpr (forward_range<_Base>)
3102 return *_M_parent->_M_outer;
3105 constexpr _Inner_iter&
3106 _M_get_inner() noexcept
3108 if constexpr (forward_iterator<_Inner_iter>)
3114 constexpr const _Inner_iter&
3115 _M_get_inner() const noexcept
3117 if constexpr (forward_iterator<_Inner_iter>)
3124 _Iterator(_Parent* __parent, _Outer_iter __outer)
requires forward_range<_Base>
3125 : _M_outer(
std::move(__outer)), _M_parent(__parent)
3129 _Iterator(_Parent* __parent)
requires (!forward_range<_Base>)
3130 : _M_parent(__parent)
3133 [[no_unique_address]]
3134 __detail::__maybe_present_t<forward_range<_Base>, _Outer_iter> _M_outer
3135 =
decltype(_M_outer)();
3136 __conditional_t<forward_iterator<_Inner_iter>,
3137 _Inner_iter, optional<_Inner_iter>> _M_inner
3138 =
decltype(_M_inner)();
3139 _Parent* _M_parent =
nullptr;
3142 using iterator_concept =
decltype(_S_iter_concept());
3144 using value_type = range_value_t<range_reference_t<_Base>>;
3145 using difference_type
3147 range_difference_t<range_reference_t<_Base>>>;
3149 _Iterator() =
default;
3152 _Iterator(_Iterator<!_Const> __i)
3154 && convertible_to<iterator_t<_Vp>, _Outer_iter>
3155 && convertible_to<iterator_t<_InnerRange>, _Inner_iter>
3157 _M_parent(__i._M_parent)
3160 constexpr decltype(
auto)
3162 {
return *_M_get_inner(); }
3166 constexpr _Inner_iter
3168 requires __detail::__has_arrow<_Inner_iter>
3169 && copyable<_Inner_iter>
3170 {
return _M_get_inner(); }
3172 constexpr _Iterator&
3175 auto&& __inner_range = [
this] () ->
auto&& {
3176 if constexpr (_S_ref_is_glvalue)
3177 return *_M_get_outer();
3179 return *_M_parent->_M_inner;
3181 if (++_M_get_inner() == ranges::end(__inner_range))
3195 requires _S_ref_is_glvalue && forward_range<_Base>
3196 && forward_range<range_reference_t<_Base>>
3203 constexpr _Iterator&
3205 requires _S_ref_is_glvalue && bidirectional_range<_Base>
3206 && bidirectional_range<range_reference_t<_Base>>
3207 && common_range<range_reference_t<_Base>>
3209 if (_M_outer == ranges::end(_M_parent->_M_base))
3210 _M_inner = ranges::end(__detail::__as_lvalue(*--_M_outer));
3211 while (_M_get_inner() == ranges::begin(__detail::__as_lvalue(*_M_outer)))
3212 _M_get_inner() = ranges::end(__detail::__as_lvalue(*--_M_outer));
3219 requires _S_ref_is_glvalue && bidirectional_range<_Base>
3220 && bidirectional_range<range_reference_t<_Base>>
3221 && common_range<range_reference_t<_Base>>
3228 friend constexpr bool
3229 operator==(
const _Iterator& __x,
const _Iterator& __y)
3230 requires _S_ref_is_glvalue
3231 && forward_range<_Base>
3232 && equality_comparable<_Inner_iter>
3234 return (__x._M_outer == __y._M_outer
3235 && __x._M_inner == __y._M_inner);
3238 friend constexpr decltype(
auto)
3239 iter_move(
const _Iterator& __i)
3240 noexcept(
noexcept(ranges::iter_move(__i._M_get_inner())))
3241 {
return ranges::iter_move(__i._M_get_inner()); }
3243 friend constexpr void
3244 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
3245 noexcept(
noexcept(ranges::iter_swap(__x._M_get_inner(), __y._M_get_inner())))
3246 requires indirectly_swappable<_Inner_iter>
3247 {
return ranges::iter_swap(__x._M_get_inner(), __y._M_get_inner()); }
3249 friend _Iterator<!_Const>;
3250 template<
bool>
friend struct _Sentinel;
3253 template<
bool _Const>
3257 using _Parent = __detail::__maybe_const_t<_Const, join_view>;
3258 using _Base = join_view::_Base<_Const>;
3260 template<
bool _Const2>
3262 __equal(
const _Iterator<_Const2>& __i)
const
3263 {
return __i._M_get_outer() == _M_end; }
3265 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
3268 _Sentinel() =
default;
3271 _Sentinel(_Parent* __parent)
3272 : _M_end(ranges::end(__parent->_M_base))
3276 _Sentinel(_Sentinel<!_Const> __s)
3277 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
3281 template<
bool _Const2>
3282 requires sentinel_for<sentinel_t<_Base>,
3283 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
3284 friend constexpr bool
3285 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
3286 {
return __y.__equal(__x); }
3288 friend _Sentinel<!_Const>;
3291 _Vp _M_base = _Vp();
3292 [[no_unique_address]]
3293 __detail::__maybe_present_t<!forward_range<_Vp>,
3294 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_outer;
3295 [[no_unique_address]]
3296 __detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner;
3299 join_view()
requires default_initializable<_Vp> = default;
3302 join_view(_Vp __base)
3303 : _M_base(std::move(__base))
3307 base() const& requires copy_constructible<_Vp>
3317 if constexpr (forward_range<_Vp>)
3319 constexpr bool __use_const
3320 = (__detail::__simple_view<_Vp>
3321 && is_reference_v<range_reference_t<_Vp>>);
3322 return _Iterator<__use_const>{
this, ranges::begin(_M_base)};
3326 _M_outer = ranges::begin(_M_base);
3327 return _Iterator<false>{
this};
3333 requires forward_range<const _Vp>
3334 && is_reference_v<range_reference_t<const _Vp>>
3335 && input_range<range_reference_t<const _Vp>>
3337 return _Iterator<true>{
this, ranges::begin(_M_base)};
3343 if constexpr (forward_range<_Vp> && is_reference_v<_InnerRange>
3344 && forward_range<_InnerRange>
3345 && common_range<_Vp> && common_range<_InnerRange>)
3346 return _Iterator<__detail::__simple_view<_Vp>>{
this,
3347 ranges::end(_M_base)};
3349 return _Sentinel<__detail::__simple_view<_Vp>>{
this};
3354 requires forward_range<const _Vp>
3355 && is_reference_v<range_reference_t<const _Vp>>
3356 && input_range<range_reference_t<const _Vp>>
3358 if constexpr (is_reference_v<range_reference_t<const _Vp>>
3359 && forward_range<range_reference_t<const _Vp>>
3360 && common_range<const _Vp>
3361 && common_range<range_reference_t<const _Vp>>)
3362 return _Iterator<true>{
this, ranges::end(_M_base)};
3364 return _Sentinel<true>{
this};
3368 template<
typename _Range>
3369 explicit join_view(_Range&&) -> join_view<views::all_t<_Range>>;
3375 template<
typename _Range>
3376 concept __can_join_view
3380 struct _Join : __adaptor::_RangeAdaptorClosure<_Join>
3382 template<viewable_range _Range>
3383 requires __detail::__can_join_view<_Range>
3385 operator() [[nodiscard]] (_Range&& __r)
const
3392 static constexpr bool _S_has_simple_call_op =
true;
3395 inline constexpr _Join join;
3401 struct __require_constant;
3403 template<
typename _Range>
3404 concept __tiny_range = sized_range<_Range>
3406 {
typename __require_constant<remove_reference_t<_Range>::size()>; }
3407 && (remove_reference_t<_Range>::size() <= 1);
3409 template<
typename _Base>
3410 struct __lazy_split_view_outer_iter_cat
3413 template<forward_range _Base>
3414 struct __lazy_split_view_outer_iter_cat<_Base>
3415 {
using iterator_category = input_iterator_tag; };
3417 template<
typename _Base>
3418 struct __lazy_split_view_inner_iter_cat
3421 template<forward_range _Base>
3422 struct __lazy_split_view_inner_iter_cat<_Base>
3425 static constexpr auto
3428 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
3429 if constexpr (derived_from<_Cat, forward_iterator_tag>)
3430 return forward_iterator_tag{};
3435 using iterator_category =
decltype(_S_iter_cat());
3439 template<input_range _Vp, forward_range _Pattern>
3441 && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
3444 class lazy_split_view : public
view_interface<lazy_split_view<_Vp, _Pattern>>
3447 template<
bool _Const>
3448 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
3450 template<
bool _Const>
3453 template<
bool _Const>
3455 : __detail::__lazy_split_view_outer_iter_cat<_Base<_Const>>
3458 using _Parent = __detail::__maybe_const_t<_Const, lazy_split_view>;
3459 using _Base = lazy_split_view::_Base<_Const>;
3463 {
return __current() == ranges::end(_M_parent->_M_base) && !_M_trailing_empty; }
3470 __current() noexcept
3472 if constexpr (forward_range<_Vp>)
3475 return *_M_parent->_M_current;
3479 __current() const noexcept
3481 if constexpr (forward_range<_Vp>)
3484 return *_M_parent->_M_current;
3487 _Parent* _M_parent =
nullptr;
3489 [[no_unique_address]]
3490 __detail::__maybe_present_t<forward_range<_Vp>,
3491 iterator_t<_Base>> _M_current
3492 =
decltype(_M_current)();
3493 bool _M_trailing_empty =
false;
3496 using iterator_concept = __conditional_t<forward_range<_Base>,
3497 forward_iterator_tag,
3498 input_iterator_tag>;
3500 using difference_type = range_difference_t<_Base>;
3502 struct value_type : view_interface<value_type>
3505 _OuterIter _M_i = _OuterIter();
3511 value_type(_OuterIter __i)
3512 : _M_i(std::move(__i))
3518 constexpr _InnerIter<_Const>
3520 {
return _InnerIter<_Const>{_M_i}; }
3522 constexpr default_sentinel_t
3523 end() const noexcept
3527 _OuterIter() =
default;
3530 _OuterIter(_Parent* __parent)
requires (!forward_range<_Base>)
3531 : _M_parent(__parent)
3535 _OuterIter(_Parent* __parent, iterator_t<_Base> __current)
3536 requires forward_range<_Base>
3537 : _M_parent(__parent),
3542 _OuterIter(_OuterIter<!_Const> __i)
3544 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
3545 : _M_parent(__i._M_parent), _M_current(
std::move(__i._M_current)),
3546 _M_trailing_empty(__i._M_trailing_empty)
3549 constexpr value_type
3551 {
return value_type{*
this}; }
3553 constexpr _OuterIter&
3558 const auto __end = ranges::end(_M_parent->_M_base);
3559 if (__current() == __end)
3561 _M_trailing_empty =
false;
3564 const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern};
3565 if (__pbegin == __pend)
3567 else if constexpr (__detail::__tiny_range<_Pattern>)
3569 __current() = ranges::find(
std::move(__current()), __end,
3571 if (__current() != __end)
3574 if (__current() == __end)
3575 _M_trailing_empty =
true;
3582 = ranges::mismatch(__current(), __end, __pbegin, __pend);
3586 if (__current() == __end)
3587 _M_trailing_empty =
true;
3590 }
while (++__current() != __end);
3594 constexpr decltype(
auto)
3597 if constexpr (forward_range<_Base>)
3607 friend constexpr bool
3608 operator==(
const _OuterIter& __x,
const _OuterIter& __y)
3609 requires forward_range<_Base>
3611 return __x._M_current == __y._M_current
3612 && __x._M_trailing_empty == __y._M_trailing_empty;
3615 friend constexpr bool
3616 operator==(
const _OuterIter& __x, default_sentinel_t)
3617 {
return __x.__at_end(); };
3619 friend _OuterIter<!_Const>;
3620 friend _InnerIter<_Const>;
3623 template<
bool _Const>
3625 : __detail::__lazy_split_view_inner_iter_cat<_Base<_Const>>
3628 using _Base = lazy_split_view::_Base<_Const>;
3633 auto [__pcur, __pend] = subrange{_M_i._M_parent->_M_pattern};
3634 auto __end = ranges::end(_M_i._M_parent->_M_base);
3635 if constexpr (__detail::__tiny_range<_Pattern>)
3637 const auto& __cur = _M_i_current();
3640 if (__pcur == __pend)
3641 return _M_incremented;
3642 return *__cur == *__pcur;
3646 auto __cur = _M_i_current();
3649 if (__pcur == __pend)
3650 return _M_incremented;
3653 if (*__cur != *__pcur)
3655 if (++__pcur == __pend)
3657 }
while (++__cur != __end);
3663 _M_i_current() noexcept
3664 {
return _M_i.__current(); }
3667 _M_i_current() const noexcept
3668 {
return _M_i.__current(); }
3670 _OuterIter<_Const> _M_i = _OuterIter<_Const>();
3671 bool _M_incremented =
false;
3674 using iterator_concept
3675 =
typename _OuterIter<_Const>::iterator_concept;
3677 using value_type = range_value_t<_Base>;
3678 using difference_type = range_difference_t<_Base>;
3680 _InnerIter() =
default;
3683 _InnerIter(_OuterIter<_Const> __i)
3684 : _M_i(std::move(__i))
3687 constexpr const iterator_t<_Base>&
3688 base() const& noexcept
3689 {
return _M_i_current(); }
3691 constexpr iterator_t<_Base>
3692 base() &&
requires forward_range<_Vp>
3695 constexpr decltype(
auto)
3697 {
return *_M_i_current(); }
3699 constexpr _InnerIter&
3702 _M_incremented =
true;
3703 if constexpr (!forward_range<_Base>)
3704 if constexpr (_Pattern::size() == 0)
3710 constexpr decltype(
auto)
3713 if constexpr (forward_range<_Base>)
3723 friend constexpr bool
3724 operator==(
const _InnerIter& __x,
const _InnerIter& __y)
3725 requires forward_range<_Base>
3726 {
return __x._M_i == __y._M_i; }
3728 friend constexpr bool
3729 operator==(
const _InnerIter& __x, default_sentinel_t)
3730 {
return __x.__at_end(); }
3732 friend constexpr decltype(
auto)
3733 iter_move(
const _InnerIter& __i)
3734 noexcept(
noexcept(ranges::iter_move(__i._M_i_current())))
3735 {
return ranges::iter_move(__i._M_i_current()); }
3737 friend constexpr void
3738 iter_swap(
const _InnerIter& __x,
const _InnerIter& __y)
3739 noexcept(
noexcept(ranges::iter_swap(__x._M_i_current(),
3740 __y._M_i_current())))
3741 requires indirectly_swappable<iterator_t<_Base>>
3742 { ranges::iter_swap(__x._M_i_current(), __y._M_i_current()); }
3745 _Vp _M_base = _Vp();
3746 _Pattern _M_pattern = _Pattern();
3747 [[no_unique_address]]
3748 __detail::__maybe_present_t<!forward_range<_Vp>,
3749 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_current;
3753 lazy_split_view()
requires (default_initializable<_Vp>
3754 && default_initializable<_Pattern>)
3758 lazy_split_view(_Vp __base, _Pattern __pattern)
3759 : _M_base(std::move(
__base)), _M_pattern(std::move(__pattern))
3762 template<input_range _Range>
3763 requires constructible_from<_Vp, views::all_t<_Range>>
3764 && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
3766 lazy_split_view(_Range&& __r, range_value_t<_Range> __e)
3767 : _M_base(views::all(std::
forward<_Range>(__r))),
3768 _M_pattern(views::single(std::move(__e)))
3772 base() const& requires copy_constructible<_Vp>
3782 if constexpr (forward_range<_Vp>)
3784 constexpr bool __simple
3785 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
3786 return _OuterIter<__simple>{
this, ranges::begin(_M_base)};
3790 _M_current = ranges::begin(_M_base);
3791 return _OuterIter<false>{
this};
3796 begin() const requires forward_range<_Vp> && forward_range<const _Vp>
3798 return _OuterIter<true>{
this, ranges::begin(_M_base)};
3802 end()
requires forward_range<_Vp> && common_range<_Vp>
3804 constexpr bool __simple
3805 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
3806 return _OuterIter<__simple>{
this, ranges::end(_M_base)};
3812 if constexpr (forward_range<_Vp>
3813 && forward_range<const _Vp>
3814 && common_range<const _Vp>)
3815 return _OuterIter<true>{
this, ranges::end(_M_base)};
3821 template<
typename _Range,
typename _Pattern>
3822 lazy_split_view(_Range&&, _Pattern&&)
3823 -> lazy_split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
3825 template<input_range _Range>
3826 lazy_split_view(_Range&&, range_value_t<_Range>)
3833 template<
typename _Range,
typename _Pattern>
3834 concept __can_lazy_split_view
3838 struct _LazySplit : __adaptor::_RangeAdaptor<_LazySplit>
3840 template<viewable_range _Range,
typename _Pattern>
3841 requires __detail::__can_lazy_split_view<_Range, _Pattern>
3843 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
3848 using _RangeAdaptor<_LazySplit>::operator();
3849 static constexpr int _S_arity = 2;
3854 template<
typename _Pattern>
3855 static constexpr bool _S_has_simple_extra_args
3856 = is_scalar_v<_Pattern> || (view<_Pattern>
3857 && copy_constructible<_Pattern>);
3860 inline constexpr _LazySplit lazy_split;
3863 template<forward_range _Vp, forward_range _Pattern>
3865 && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
3867 class split_view :
public view_interface<split_view<_Vp, _Pattern>>
3870 _Vp _M_base = _Vp();
3871 _Pattern _M_pattern = _Pattern();
3872 __detail::__non_propagating_cache<subrange<iterator_t<_Vp>>> _M_cached_begin;
3878 split_view()
requires (default_initializable<_Vp>
3879 && default_initializable<_Pattern>)
3883 split_view(_Vp __base, _Pattern __pattern)
3884 : _M_base(std::move(
__base)), _M_pattern(std::move(__pattern))
3887 template<forward_range _Range>
3888 requires constructible_from<_Vp, views::all_t<_Range>>
3889 && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
3891 split_view(_Range&& __r, range_value_t<_Range> __e)
3892 : _M_base(views::all(std::
forward<_Range>(__r))),
3893 _M_pattern(views::single(std::move(__e)))
3897 base() const& requires copy_constructible<_Vp>
3907 if (!_M_cached_begin)
3908 _M_cached_begin = _M_find_next(ranges::begin(_M_base));
3909 return {
this, ranges::begin(_M_base), *_M_cached_begin};
3915 if constexpr (common_range<_Vp>)
3916 return _Iterator{
this, ranges::end(_M_base), {}};
3918 return _Sentinel{
this};
3921 constexpr subrange<iterator_t<_Vp>>
3922 _M_find_next(iterator_t<_Vp> __it)
3924 auto [__b, __e] = ranges::search(subrange(__it, ranges::end(_M_base)), _M_pattern);
3925 if (__b != ranges::end(_M_base) && ranges::empty(_M_pattern))
3937 split_view* _M_parent =
nullptr;
3938 iterator_t<_Vp> _M_cur = iterator_t<_Vp>();
3939 subrange<iterator_t<_Vp>> _M_next = subrange<iterator_t<_Vp>>();
3940 bool _M_trailing_empty =
false;
3942 friend struct _Sentinel;
3945 using iterator_concept = forward_iterator_tag;
3946 using iterator_category = input_iterator_tag;
3947 using value_type = subrange<iterator_t<_Vp>>;
3948 using difference_type = range_difference_t<_Vp>;
3950 _Iterator() =
default;
3953 _Iterator(split_view* __parent,
3954 iterator_t<_Vp> __current,
3955 subrange<iterator_t<_Vp>> __next)
3956 : _M_parent(__parent),
3957 _M_cur(std::move(__current)),
3958 _M_next(std::move(__next))
3961 constexpr iterator_t<_Vp>
3965 constexpr value_type
3967 {
return {_M_cur, _M_next.begin()}; }
3969 constexpr _Iterator&
3972 _M_cur = _M_next.begin();
3973 if (_M_cur != ranges::end(_M_parent->_M_base))
3975 _M_cur = _M_next.end();
3976 if (_M_cur == ranges::end(_M_parent->_M_base))
3978 _M_trailing_empty =
true;
3979 _M_next = {_M_cur, _M_cur};
3982 _M_next = _M_parent->_M_find_next(_M_cur);
3985 _M_trailing_empty =
false;
3997 friend constexpr bool
3998 operator==(
const _Iterator& __x,
const _Iterator& __y)
4000 return __x._M_cur == __y._M_cur
4001 && __x._M_trailing_empty == __y._M_trailing_empty;
4008 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
4011 _M_equal(
const _Iterator& __x)
const
4012 {
return __x._M_cur == _M_end && !__x._M_trailing_empty; }
4015 _Sentinel() =
default;
4018 _Sentinel(split_view* __parent)
4019 : _M_end(ranges::end(__parent->_M_base))
4022 friend constexpr bool
4023 operator==(
const _Iterator& __x,
const _Sentinel& __y)
4024 {
return __y._M_equal(__x); }
4028 template<
typename _Range,
typename _Pattern>
4029 split_view(_Range&&, _Pattern&&)
4030 -> split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
4032 template<forward_range _Range>
4033 split_view(_Range&&, range_value_t<_Range>)
4040 template<
typename _Range,
typename _Pattern>
4041 concept __can_split_view
4045 struct _Split : __adaptor::_RangeAdaptor<_Split>
4047 template<viewable_range _Range,
typename _Pattern>
4048 requires __detail::__can_split_view<_Range, _Pattern>
4050 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
4055 using _RangeAdaptor<_Split>::operator();
4056 static constexpr int _S_arity = 2;
4057 template<
typename _Pattern>
4058 static constexpr bool _S_has_simple_extra_args
4059 = _LazySplit::_S_has_simple_extra_args<_Pattern>;
4062 inline constexpr _Split split;
4069 template<input_or_output_iterator _Iter>
4071 operator() [[nodiscard]] (_Iter __i, iter_difference_t<_Iter> __n)
const
4073 if constexpr (contiguous_iterator<_Iter>)
4075 else if constexpr (random_access_iterator<_Iter>)
4076 return subrange(__i, __i + __n);
4078 return subrange(counted_iterator(
std::move(__i), __n),
4083 inline constexpr _Counted counted{};
4091 _Vp _M_base = _Vp();
4094 common_view()
requires default_initializable<_Vp> = default;
4097 common_view(_Vp __r)
4098 : _M_base(std::move(__r))
4102 base() const& requires copy_constructible<_Vp>
4112 begin()
requires (!__detail::__simple_view<_Vp>)
4115 return ranges::begin(_M_base);
4117 return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
4118 (ranges::begin(_M_base));
4125 return ranges::begin(_M_base);
4127 return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
4128 (ranges::begin(_M_base));
4132 end()
requires (!__detail::__simple_view<_Vp>)
4135 return ranges::begin(_M_base) + ranges::size(_M_base);
4137 return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
4138 (ranges::end(_M_base));
4142 end() const requires
range<const _Vp>
4145 return ranges::begin(_M_base) + ranges::size(_M_base);
4147 return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
4148 (ranges::end(_M_base));
4153 {
return ranges::size(_M_base); }
4157 {
return ranges::size(_M_base); }
4160 template<
typename _Range>
4161 common_view(_Range&&) -> common_view<views::all_t<_Range>>;
4163 template<
typename _Tp>
4164 inline constexpr bool enable_borrowed_range<common_view<_Tp>>
4165 = enable_borrowed_range<_Tp>;
4171 template<
typename _Range>
4172 concept __already_common = common_range<_Range>
4175 template<
typename _Range>
4176 concept __can_common_view
4180 struct _Common : __adaptor::_RangeAdaptorClosure<_Common>
4182 template<viewable_range _Range>
4183 requires __detail::__already_common<_Range>
4184 || __detail::__can_common_view<_Range>
4186 operator() [[nodiscard]] (_Range&& __r)
const
4188 if constexpr (__detail::__already_common<_Range>)
4194 static constexpr bool _S_has_simple_call_op =
true;
4197 inline constexpr _Common common;
4205 static constexpr bool _S_needs_cached_begin
4206 = !common_range<_Vp> && !(random_access_range<_Vp>
4207 && sized_sentinel_for<sentinel_t<_Vp>,
4210 _Vp _M_base = _Vp();
4211 [[no_unique_address]]
4212 __detail::__maybe_present_t<_S_needs_cached_begin,
4213 __detail::_CachedPosition<_Vp>>
4217 reverse_view()
requires default_initializable<_Vp> = default;
4220 reverse_view(_Vp __r)
4221 : _M_base(std::move(__r))
4225 base() const& requires copy_constructible<_Vp>
4232 constexpr reverse_iterator<iterator_t<_Vp>>
4235 if constexpr (_S_needs_cached_begin)
4236 if (_M_cached_begin._M_has_value())
4239 auto __it = ranges::next(ranges::begin(_M_base), ranges::end(_M_base));
4240 if constexpr (_S_needs_cached_begin)
4241 _M_cached_begin._M_set(_M_base, __it);
4246 begin()
requires common_range<_Vp>
4250 begin() const requires common_range<const _Vp>
4253 constexpr reverse_iterator<iterator_t<_Vp>>
4258 end() const requires common_range<const _Vp>
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<
typename _Range>
4271 reverse_view(_Range&&) -> reverse_view<views::all_t<_Range>>;
4273 template<
typename _Tp>
4274 inline constexpr bool enable_borrowed_range<reverse_view<_Tp>>
4275 = enable_borrowed_range<_Tp>;
4282 inline constexpr bool __is_reversible_subrange =
false;
4284 template<
typename _Iter, subrange_kind _Kind>
4285 inline constexpr bool
4286 __is_reversible_subrange<subrange<reverse_iterator<_Iter>,
4287 reverse_iterator<_Iter>,
4291 inline constexpr bool __is_reverse_view =
false;
4293 template<
typename _Vp>
4294 inline constexpr bool __is_reverse_view<reverse_view<_Vp>> =
true;
4296 template<
typename _Range>
4297 concept __can_reverse_view
4301 struct _Reverse : __adaptor::_RangeAdaptorClosure<_Reverse>
4303 template<viewable_range _Range>
4304 requires __detail::__is_reverse_view<remove_cvref_t<_Range>>
4305 || __detail::__is_reversible_subrange<remove_cvref_t<_Range>>
4306 || __detail::__can_reverse_view<_Range>
4308 operator() [[nodiscard]] (_Range&& __r)
const
4310 using _Tp = remove_cvref_t<_Range>;
4311 if constexpr (__detail::__is_reverse_view<_Tp>)
4313#ifdef __cpp_lib_optional_range_support
4314 else if constexpr (__is_optional_v<_Tp> && view<_Tp>)
4317 else if constexpr (__detail::__is_reversible_subrange<_Tp>)
4319 using _Iter =
decltype(ranges::begin(__r).base());
4320 if constexpr (sized_range<_Tp>)
4321 return subrange<_Iter, _Iter, subrange_kind::sized>
4322 {__r.end().base(), __r.begin().base(), __r.size()};
4324 return subrange<_Iter, _Iter, subrange_kind::unsized>
4325 {__r.end().base(), __r.begin().base()};
4331 static constexpr bool _S_has_simple_call_op =
true;
4334 inline constexpr _Reverse reverse;
4339#if __cpp_lib_tuple_like
4340 template<
typename _Tp,
size_t _Nm>
4341 concept __has_tuple_element = __tuple_like<_Tp> && _Nm < tuple_size_v<_Tp>;
4343 template<
typename _Tp,
size_t _Nm>
4344 concept __has_tuple_element =
requires(_Tp __t)
4346 typename tuple_size<_Tp>::type;
4347 requires _Nm < tuple_size_v<_Tp>;
4348 typename tuple_element_t<_Nm, _Tp>;
4349 { std::get<_Nm>(__t) }
4350 -> convertible_to<const tuple_element_t<_Nm, _Tp>&>;
4354 template<
typename _Tp,
size_t _Nm>
4355 concept __returnable_element
4356 = is_reference_v<_Tp> || move_constructible<tuple_element_t<_Nm, _Tp>>;
4359 template<input_range _Vp,
size_t _Nm>
4361 && __detail::__has_tuple_element<range_value_t<_Vp>, _Nm>
4362 && __detail::__has_tuple_element<remove_reference_t<range_reference_t<_Vp>>,
4364 && __detail::__returnable_element<range_reference_t<_Vp>, _Nm>
4365 class elements_view :
public view_interface<elements_view<_Vp, _Nm>>
4368 elements_view()
requires default_initializable<_Vp> = default;
4371 elements_view(_Vp __base)
4372 : _M_base(std::move(__base))
4376 base() const& requires copy_constructible<_Vp>
4384 begin()
requires (!__detail::__simple_view<_Vp>)
4385 {
return _Iterator<false>(ranges::begin(_M_base)); }
4388 begin() const requires range<const _Vp>
4389 {
return _Iterator<true>(ranges::begin(_M_base)); }
4392 end()
requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>)
4393 {
return _Sentinel<false>{ranges::end(_M_base)}; }
4396 end()
requires (!__detail::__simple_view<_Vp> && common_range<_Vp>)
4397 {
return _Iterator<false>{ranges::end(_M_base)}; }
4400 end() const requires range<const _Vp>
4401 {
return _Sentinel<true>{ranges::end(_M_base)}; }
4404 end() const requires common_range<const _Vp>
4405 {
return _Iterator<true>{ranges::end(_M_base)}; }
4408 size()
requires sized_range<_Vp>
4409 {
return ranges::size(_M_base); }
4412 size() const requires sized_range<const _Vp>
4413 {
return ranges::size(_M_base); }
4416 template<
bool _Const>
4417 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
4419 template<
bool _Const>
4423 template<
bool _Const>
4424 requires forward_range<_Base<_Const>>
4425 struct __iter_cat<_Const>
4428 static auto _S_iter_cat()
4430 using _Base = elements_view::_Base<_Const>;
4431 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
4432 using _Res =
decltype((std::get<_Nm>(*
std::declval<iterator_t<_Base>>())));
4433 if constexpr (!is_lvalue_reference_v<_Res>)
4434 return input_iterator_tag{};
4435 else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
4436 return random_access_iterator_tag{};
4441 using iterator_category =
decltype(_S_iter_cat());
4444 template<
bool _Const>
4447 template<
bool _Const>
4448 struct _Iterator : __iter_cat<_Const>
4451 using _Base = elements_view::_Base<_Const>;
4453 iterator_t<_Base> _M_current = iterator_t<_Base>();
4455 static constexpr decltype(
auto)
4456 _S_get_element(
const iterator_t<_Base>& __i)
4458 if constexpr (is_reference_v<range_reference_t<_Base>>)
4459 return std::get<_Nm>(*__i);
4462 using _Et = remove_cv_t<tuple_element_t<_Nm, range_reference_t<_Base>>>;
4463 return static_cast<_Et
>(std::get<_Nm>(*__i));
4470 if constexpr (random_access_range<_Base>)
4471 return random_access_iterator_tag{};
4472 else if constexpr (bidirectional_range<_Base>)
4473 return bidirectional_iterator_tag{};
4474 else if constexpr (forward_range<_Base>)
4475 return forward_iterator_tag{};
4477 return input_iterator_tag{};
4480 friend _Iterator<!_Const>;
4483 using iterator_concept =
decltype(_S_iter_concept());
4486 = remove_cvref_t<tuple_element_t<_Nm, range_value_t<_Base>>>;
4487 using difference_type = range_difference_t<_Base>;
4489 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
4492 _Iterator(iterator_t<_Base> __current)
4493 : _M_current(std::move(__current))
4497 _Iterator(_Iterator<!_Const> __i)
4498 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
4502 constexpr const iterator_t<_Base>&
4503 base() const& noexcept
4504 {
return _M_current; }
4506 constexpr iterator_t<_Base>
4510 constexpr decltype(
auto)
4512 {
return _S_get_element(_M_current); }
4514 constexpr _Iterator&
4526 operator++(
int)
requires forward_range<_Base>
4533 constexpr _Iterator&
4534 operator--()
requires bidirectional_range<_Base>
4541 operator--(
int)
requires bidirectional_range<_Base>
4548 constexpr _Iterator&
4549 operator+=(difference_type __n)
4550 requires random_access_range<_Base>
4556 constexpr _Iterator&
4557 operator-=(difference_type __n)
4558 requires random_access_range<_Base>
4564 constexpr decltype(
auto)
4565 operator[](difference_type __n)
const
4566 requires random_access_range<_Base>
4567 {
return _S_get_element(_M_current + __n); }
4569 friend constexpr bool
4570 operator==(
const _Iterator& __x,
const _Iterator& __y)
4571 requires equality_comparable<iterator_t<_Base>>
4572 {
return __x._M_current == __y._M_current; }
4574 friend constexpr bool
4575 operator<(
const _Iterator& __x,
const _Iterator& __y)
4576 requires random_access_range<_Base>
4577 {
return __x._M_current < __y._M_current; }
4579 friend constexpr bool
4580 operator>(
const _Iterator& __x,
const _Iterator& __y)
4581 requires random_access_range<_Base>
4582 {
return __y._M_current < __x._M_current; }
4584 friend constexpr bool
4585 operator<=(
const _Iterator& __x,
const _Iterator& __y)
4586 requires random_access_range<_Base>
4587 {
return !(__y._M_current > __x._M_current); }
4589 friend constexpr bool
4590 operator>=(
const _Iterator& __x,
const _Iterator& __y)
4591 requires random_access_range<_Base>
4592 {
return !(__x._M_current > __y._M_current); }
4594#ifdef __cpp_lib_three_way_comparison
4595 friend constexpr auto
4596 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
4597 requires random_access_range<_Base>
4598 && three_way_comparable<iterator_t<_Base>>
4599 {
return __x._M_current <=> __y._M_current; }
4602 friend constexpr _Iterator
4603 operator+(
const _Iterator& __x, difference_type __y)
4604 requires random_access_range<_Base>
4605 {
return _Iterator{__x} += __y; }
4607 friend constexpr _Iterator
4608 operator+(difference_type __x,
const _Iterator& __y)
4609 requires random_access_range<_Base>
4610 {
return __y + __x; }
4612 friend constexpr _Iterator
4613 operator-(
const _Iterator& __x, difference_type __y)
4614 requires random_access_range<_Base>
4615 {
return _Iterator{__x} -= __y; }
4619 friend constexpr difference_type
4620 operator-(
const _Iterator& __x,
const _Iterator& __y)
4621 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
4622 {
return __x._M_current - __y._M_current; }
4624 template <
bool>
friend struct _Sentinel;
4627 template<
bool _Const>
4631 template<
bool _Const2>
4633 _M_equal(
const _Iterator<_Const2>& __x)
const
4634 {
return __x._M_current == _M_end; }
4636 template<
bool _Const2>
4638 _M_distance_from(
const _Iterator<_Const2>& __i)
const
4639 {
return _M_end - __i._M_current; }
4641 using _Base = elements_view::_Base<_Const>;
4642 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
4645 _Sentinel() =
default;
4648 _Sentinel(sentinel_t<_Base> __end)
4649 : _M_end(std::move(__end))
4653 _Sentinel(_Sentinel<!_Const> __other)
4655 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
4659 constexpr sentinel_t<_Base>
4663 template<
bool _Const2>
4664 requires sentinel_for<sentinel_t<_Base>,
4665 iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
4666 friend constexpr bool
4667 operator==(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
4668 {
return __y._M_equal(__x); }
4670 template<
bool _Const2,
4671 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
4672 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
4673 friend constexpr range_difference_t<_Base2>
4674 operator-(
const _Iterator<_Const2>& __x,
const _Sentinel& __y)
4675 {
return -__y._M_distance_from(__x); }
4677 template<
bool _Const2,
4678 typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
4679 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
4680 friend constexpr range_difference_t<_Base2>
4681 operator-(
const _Sentinel& __x,
const _Iterator<_Const2>& __y)
4682 {
return __x._M_distance_from(__y); }
4684 friend _Sentinel<!_Const>;
4687 _Vp _M_base = _Vp();
4690 template<
typename _Tp,
size_t _Nm>
4691 inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>>
4692 = enable_borrowed_range<_Tp>;
4696 template<
typename _Range>
4697 using keys_view = elements_view<_Range, 0>;
4699 template<
typename _Range>
4700 using values_view = elements_view<_Range, 1>;
4706 template<
size_t _Nm,
typename _Range>
4707 concept __can_elements_view
4711 template<
size_t _Nm>
4712 struct _Elements : __adaptor::_RangeAdaptorClosure<_Elements<_Nm>>
4714 template<viewable_range _Range>
4715 requires __detail::__can_elements_view<_Nm, _Range>
4717 operator() [[nodiscard]] (_Range&& __r)
const
4722 static constexpr bool _S_has_simple_call_op =
true;
4725 template<
size_t _Nm>
4726 inline constexpr _Elements<_Nm> elements;
4727 inline constexpr auto keys = elements<0>;
4728 inline constexpr auto values = elements<1>;
4731#ifdef __cpp_lib_ranges_zip
4734 template<
typename... _Rs>
4735 concept __zip_is_common = (
sizeof...(_Rs) == 1 && (common_range<_Rs> && ...))
4736 || (!(bidirectional_range<_Rs> && ...) && (common_range<_Rs> && ...))
4737 || ((random_access_range<_Rs> && ...) && (sized_range<_Rs> && ...));
4739 template<
typename _Fp,
typename _Tuple>
4741 __tuple_transform(_Fp&& __f, _Tuple&& __tuple)
4743 return std::apply([&]<
typename... _Ts>(_Ts&&... __elts) {
4744 return tuple<invoke_result_t<_Fp&, _Ts>...>
4749 template<
typename _Fp,
typename _Tuple>
4751 __tuple_for_each(_Fp&& __f, _Tuple&& __tuple)
4753 std::apply([&]<
typename... _Ts>(_Ts&&... __elts) {
4760 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
4763 tuple<_Vs...> _M_views;
4765 template<
bool>
class _Iterator;
4766 template<
bool>
class _Sentinel;
4769 zip_view() =
default;
4772 zip_view(_Vs... __views)
4773 : _M_views(std::move(__views)...)
4777 begin()
requires (!(__detail::__simple_view<_Vs> && ...))
4778 {
return _Iterator<false>(__detail::__tuple_transform(ranges::begin, _M_views)); }
4781 begin() const requires (
range<const _Vs> && ...)
4782 {
return _Iterator<true>(__detail::__tuple_transform(ranges::begin, _M_views)); }
4785 end()
requires (!(__detail::__simple_view<_Vs> && ...))
4787 if constexpr (!__detail::__zip_is_common<_Vs...>)
4788 return _Sentinel<false>(__detail::__tuple_transform(ranges::end, _M_views));
4790 return begin() + iter_difference_t<_Iterator<false>>(
size());
4792 return _Iterator<false>(__detail::__tuple_transform(ranges::end, _M_views));
4796 end() const requires (
range<const _Vs> && ...)
4798 if constexpr (!__detail::__zip_is_common<
const _Vs...>)
4799 return _Sentinel<true>(__detail::__tuple_transform(ranges::end, _M_views));
4801 return begin() + iter_difference_t<_Iterator<true>>(
size());
4803 return _Iterator<true>(__detail::__tuple_transform(ranges::end, _M_views));
4809 return std::apply([](
auto... sizes) {
4810 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(sizes)...>>;
4811 return ranges::min({_CT(sizes)...});
4812 }, __detail::__tuple_transform(ranges::size, _M_views));
4818 return std::apply([](
auto... sizes) {
4819 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(sizes)...>>;
4820 return ranges::min({_CT(sizes)...});
4821 }, __detail::__tuple_transform(ranges::size, _M_views));
4825 template<
typename... _Rs>
4826 zip_view(_Rs&&...) -> zip_view<views::all_t<_Rs>...>;
4828 template<
typename... _Views>
4829 inline constexpr bool enable_borrowed_range<zip_view<_Views...>>
4830 = (enable_borrowed_range<_Views> && ...);
4834 template<
bool _Const,
typename... _Vs>
4835 concept __all_random_access
4836 = (random_access_range<__maybe_const_t<_Const, _Vs>> && ...);
4838 template<
bool _Const,
typename... _Vs>
4839 concept __all_bidirectional
4840 = (bidirectional_range<__maybe_const_t<_Const, _Vs>> && ...);
4842 template<
bool _Const,
typename... _Vs>
4843 concept __all_forward
4844 = (forward_range<__maybe_const_t<_Const, _Vs>> && ...);
4846 template<
bool _Const,
typename... _Views>
4847 struct __zip_view_iter_cat
4850 template<
bool _Const,
typename... _Views>
4851 requires __all_forward<_Const, _Views...>
4852 struct __zip_view_iter_cat<_Const, _Views...>
4853 {
using iterator_category = input_iterator_tag; };
4857 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
4858 template<bool _Const>
4859 class zip_view<_Vs...>::_Iterator
4860 : public __detail::__zip_view_iter_cat<_Const, _Vs...>
4862#ifdef _GLIBCXX_CLANG
4865 tuple<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_current;
4868 _Iterator(
decltype(_M_current) __current)
4869 : _M_current(std::move(__current))
4875 if constexpr (__detail::__all_random_access<_Const, _Vs...>)
4876 return random_access_iterator_tag{};
4877 else if constexpr (__detail::__all_bidirectional<_Const, _Vs...>)
4878 return bidirectional_iterator_tag{};
4879 else if constexpr (__detail::__all_forward<_Const, _Vs...>)
4880 return forward_iterator_tag{};
4882 return input_iterator_tag{};
4885#ifndef _GLIBCXX_CLANG
4886 template<move_constructible _Fp,
input_range... _Ws>
4887 requires (
view<_Ws> && ...) && (
sizeof...(_Ws) > 0) && is_object_v<_Fp>
4888 && regular_invocable<_Fp&, range_reference_t<_Ws>...>
4889 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Ws>...>>
4890 friend class zip_transform_view;
4895 using iterator_concept =
decltype(_S_iter_concept());
4897 = tuple<range_value_t<__detail::__maybe_const_t<_Const, _Vs>>...>;
4898 using difference_type
4901 _Iterator() =
default;
4904 _Iterator(_Iterator<!_Const> __i)
4906 && (convertible_to<iterator_t<_Vs>,
4907 iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4908 : _M_current(std::move(__i._M_current))
4914 auto __f = [](
auto& __i) ->
decltype(
auto) {
4917 return __detail::__tuple_transform(__f, _M_current);
4920 constexpr _Iterator&
4923 __detail::__tuple_for_each([](
auto& __i) { ++__i; }, _M_current);
4933 requires __detail::__all_forward<_Const, _Vs...>
4940 constexpr _Iterator&
4942 requires __detail::__all_bidirectional<_Const, _Vs...>
4944 __detail::__tuple_for_each([](
auto& __i) { --__i; }, _M_current);
4950 requires __detail::__all_bidirectional<_Const, _Vs...>
4957 constexpr _Iterator&
4958 operator+=(difference_type __x)
4959 requires __detail::__all_random_access<_Const, _Vs...>
4961 auto __f = [&]<
typename _It>(_It& __i) {
4962 __i += iter_difference_t<_It>(__x);
4964 __detail::__tuple_for_each(__f, _M_current);
4968 constexpr _Iterator&
4969 operator-=(difference_type __x)
4970 requires __detail::__all_random_access<_Const, _Vs...>
4972 auto __f = [&]<
typename _It>(_It& __i) {
4973 __i -= iter_difference_t<_It>(__x);
4975 __detail::__tuple_for_each(__f, _M_current);
4980 operator[](difference_type __n)
const
4981 requires __detail::__all_random_access<_Const, _Vs...>
4983 auto __f = [&]<
typename _It>(_It& __i) ->
decltype(
auto) {
4984 return __i[iter_difference_t<_It>(__n)];
4986 return __detail::__tuple_transform(__f, _M_current);
4989 friend constexpr bool
4990 operator==(
const _Iterator& __x,
const _Iterator& __y)
4991 requires (equality_comparable<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
4993 if constexpr (__detail::__all_bidirectional<_Const, _Vs...>)
4994 return __x._M_current == __y._M_current;
4997 return ((std::get<_Is>(__x._M_current) == std::get<_Is>(__y._M_current)) || ...);
5001 friend constexpr auto
5002 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5003 requires __detail::__all_random_access<_Const, _Vs...>
5004 {
return __x._M_current <=> __y._M_current; }
5006 friend constexpr _Iterator
5007 operator+(
const _Iterator& __i, difference_type __n)
5008 requires __detail::__all_random_access<_Const, _Vs...>
5015 friend constexpr _Iterator
5016 operator+(difference_type __n,
const _Iterator& __i)
5017 requires __detail::__all_random_access<_Const, _Vs...>
5024 friend constexpr _Iterator
5025 operator-(
const _Iterator& __i, difference_type __n)
5026 requires __detail::__all_random_access<_Const, _Vs...>
5033 friend constexpr difference_type
5034 operator-(
const _Iterator& __x,
const _Iterator& __y)
5035 requires (sized_sentinel_for<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>,
5036 iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
5039 return ranges::min({difference_type(std::get<_Is>(__x._M_current)
5040 - std::get<_Is>(__y._M_current))...},
5042 [](difference_type __i) {
5043 return __detail::__to_unsigned_like(__i < 0 ? -__i : __i);
5048 friend constexpr auto
5049 iter_move(
const _Iterator& __i)
5050 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
5052 friend constexpr void
5053 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
5054 requires (indirectly_swappable<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
5057 (ranges::iter_swap(std::get<_Is>(__l._M_current), std::get<_Is>(__r._M_current)), ...);
5061 friend class zip_view;
5065 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0)
5066 template<bool _Const>
5067 class zip_view<_Vs...>::_Sentinel
5069 tuple<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_end;
5072 _Sentinel(
decltype(_M_end) __end)
5076 friend class zip_view;
5079 _Sentinel() =
default;
5082 _Sentinel(_Sentinel<!_Const> __i)
5084 && (convertible_to<sentinel_t<_Vs>,
5085 sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>> && ...)
5086 : _M_end(std::move(__i._M_end))
5089 template<
bool _OtherConst>
5090 requires (sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
5091 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
5092 friend constexpr bool
5093 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5096 return ((std::get<_Is>(__x._M_current) == std::get<_Is>(__y._M_end)) || ...);
5100 template<
bool _OtherConst>
5101 requires (sized_sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
5102 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
5103 friend constexpr auto
5104 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5109 return ranges::min({_Ret(std::get<_Is>(__x._M_current) - std::get<_Is>(__y._M_end))...},
5112 return __detail::__to_unsigned_like(__i < 0 ? -__i : __i);
5117 template<
bool _OtherConst>
5118 requires (sized_sentinel_for<sentinel_t<__detail::__maybe_const_t<_Const, _Vs>>,
5119 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vs>>> && ...)
5120 friend constexpr auto
5121 operator-(
const _Sentinel& __y,
const _Iterator<_OtherConst>& __x)
5122 {
return -(__x - __y); }
5129 template<
typename... _Ts>
5130 concept __can_zip_view
5136 template<
typename... _Ts>
5137 requires (
sizeof...(_Ts) == 0 || __detail::__can_zip_view<_Ts...>)
5139 operator() [[nodiscard]] (_Ts&&... __ts)
const
5141 if constexpr (
sizeof...(_Ts) == 0)
5142 return views::empty<tuple<>>;
5148 inline constexpr _Zip zip;
5153 template<
typename _Range,
bool _Const>
5154 using __range_iter_cat
5155 =
typename iterator_traits<iterator_t<__maybe_const_t<_Const, _Range>>>::iterator_category;
5158 template<move_constructible _Fp,
input_range... _Vs>
5159 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5160 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5161 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5162 class zip_transform_view : public
view_interface<zip_transform_view<_Fp, _Vs...>>
5164 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
5165 zip_view<_Vs...> _M_zip;
5167 using _InnerView = zip_view<_Vs...>;
5169 template<
bool _Const>
5170 using __ziperator = iterator_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5172 template<
bool _Const>
5173 using __zentinel = sentinel_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5175 template<
bool _Const>
5176 using _Base = __detail::__maybe_const_t<_Const, _InnerView>;
5178 template<
bool _Const>
5182 template<
bool _Const>
5184 struct __iter_cat<_Const>
5190 using __detail::__maybe_const_t;
5191 using __detail::__range_iter_cat;
5192 using _Res = invoke_result_t<__maybe_const_t<_Const, _Fp>&,
5193 range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
5196 if constexpr (!is_reference_v<_Res>)
5197 return input_iterator_tag{};
5198 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5199 random_access_iterator_tag> && ...))
5200 return random_access_iterator_tag{};
5201 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5202 bidirectional_iterator_tag> && ...))
5203 return bidirectional_iterator_tag{};
5204 else if constexpr ((derived_from<__range_iter_cat<_Vs, _Const>,
5205 forward_iterator_tag> && ...))
5206 return forward_iterator_tag{};
5208 return input_iterator_tag{};
5211 using iterator_category =
decltype(_S_iter_cat());
5214 template<
bool>
class _Iterator;
5215 template<
bool>
class _Sentinel;
5218 zip_transform_view() =
default;
5221 zip_transform_view(_Fp __fun, _Vs... __views)
5222 : _M_fun(std::move(__fun)), _M_zip(std::move(__views)...)
5227 {
return _Iterator<false>(*
this, _M_zip.begin()); }
5231 requires
range<const _InnerView>
5232 && regular_invocable<const _Fp&, range_reference_t<const _Vs>...>
5233 {
return _Iterator<true>(*
this, _M_zip.begin()); }
5239 return _Iterator<false>(*
this, _M_zip.end());
5241 return _Sentinel<false>(_M_zip.end());
5246 requires
range<const _InnerView>
5247 && regular_invocable<const _Fp&, range_reference_t<const _Vs>...>
5250 return _Iterator<true>(*
this, _M_zip.end());
5252 return _Sentinel<true>(_M_zip.end());
5257 {
return _M_zip.size(); }
5261 {
return _M_zip.size(); }
5264 template<
class _Fp,
class... _Rs>
5265 zip_transform_view(_Fp, _Rs&&...)
5266 -> zip_transform_view<_Fp, views::all_t<_Rs>...>;
5268 template<move_constructible _Fp,
input_range... _Vs>
5269 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5270 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5271 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5272 template<bool _Const>
5273 class zip_transform_view<_Fp, _Vs...>::_Iterator : public __iter_cat<_Const>
5275 using _Parent = __detail::__maybe_const_t<_Const, zip_transform_view>;
5276 using _Fun_handle = __detail::__func_handle_t<
5277 __detail::__maybe_const_t<_Const, _Fp>,
5278 iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...>;
5280 [[no_unique_address]] _Fun_handle _M_fun;
5281 __ziperator<_Const> _M_inner;
5284 _Iterator(_Fun_handle __fun, __ziperator<_Const> __inner)
5285 : _M_fun(__fun), _M_inner(std::move(__inner))
5289 _Iterator(_Parent& __parent, __ziperator<_Const> __inner)
5290 : _M_fun(*__parent._M_fun), _M_inner(std::move(__inner))
5293 friend class zip_transform_view;
5297 using iterator_concept =
typename __ziperator<_Const>::iterator_concept;
5299 = remove_cvref_t<invoke_result_t<__detail::__maybe_const_t<_Const, _Fp>&,
5300 range_reference_t<__detail::__maybe_const_t<_Const, _Vs>>...>>;
5301 using difference_type = range_difference_t<_Base<_Const>>;
5303 _Iterator() =
default;
5306 _Iterator(_Iterator<!_Const> __i)
5307 requires _Const && convertible_to<__ziperator<false>, __ziperator<_Const>>
5308 : _M_fun(__i._M_fun), _M_inner(
std::move(__i._M_inner))
5311 constexpr decltype(
auto)
5314 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
5315 return _M_fun._M_call_deref(__iters...);
5316 }, _M_inner._M_current);
5319 constexpr _Iterator&
5338 constexpr _Iterator&
5353 constexpr _Iterator&
5360 constexpr _Iterator&
5367 constexpr decltype(
auto)
5370 return std::apply([&]<
typename... _Is>(
const _Is&... __iters) ->
decltype(
auto) {
5371 return _M_fun._M_call_subscript(__n, __iters...);
5372 }, _M_inner._M_current);
5375 friend constexpr bool
5376 operator==(
const _Iterator& __x,
const _Iterator& __y)
5377 requires equality_comparable<__ziperator<_Const>>
5378 {
return __x._M_inner == __y._M_inner; }
5380 friend constexpr auto
5381 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5383 {
return __x._M_inner <=> __y._M_inner; }
5385 friend constexpr _Iterator
5386 operator+(
const _Iterator& __i, difference_type __n)
5388 {
return _Iterator(__i._M_fun, __i._M_inner + __n); }
5390 friend constexpr _Iterator
5391 operator+(difference_type __n,
const _Iterator& __i)
5393 {
return _Iterator(__i._M_fun, __i._M_inner + __n); }
5395 friend constexpr _Iterator
5396 operator-(
const _Iterator& __i, difference_type __n)
5398 {
return _Iterator(__i._M_fun, __i._M_inner - __n); }
5400 friend constexpr difference_type
5401 operator-(
const _Iterator& __x,
const _Iterator& __y)
5402 requires sized_sentinel_for<__ziperator<_Const>, __ziperator<_Const>>
5403 {
return __x._M_inner - __y._M_inner; }
5406 template<move_constructible _Fp,
input_range... _Vs>
5407 requires (
view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && is_object_v<_Fp>
5408 && regular_invocable<_Fp&, range_reference_t<_Vs>...>
5409 && std::__detail::__can_reference<invoke_result_t<_Fp&, range_reference_t<_Vs>...>>
5410 template<bool _Const>
5411 class zip_transform_view<_Fp, _Vs...>::_Sentinel
5413 __zentinel<_Const> _M_inner;
5416 _Sentinel(__zentinel<_Const> __inner)
5420 friend class zip_transform_view;
5423 _Sentinel() =
default;
5426 _Sentinel(_Sentinel<!_Const> __i)
5427 requires _Const && convertible_to<__zentinel<false>, __zentinel<_Const>>
5431 template<
bool _OtherConst>
5432 requires sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5433 friend constexpr bool
5434 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5435 {
return __x._M_inner == __y._M_inner; }
5437 template<
bool _OtherConst>
5438 requires sized_sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5439 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
5440 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5441 {
return __x._M_inner - __y._M_inner; }
5443 template<
bool _OtherConst>
5444 requires sized_sentinel_for<__zentinel<_Const>, __ziperator<_OtherConst>>
5445 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
5446 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
5447 {
return __x._M_inner - __y._M_inner; }
5454 template<
typename _Fp,
typename... _Ts>
5455 concept __can_zip_transform_view
5459 struct _ZipTransform
5461 template<
typename _Fp>
5462 requires move_constructible<decay_t<_Fp>> && regular_invocable<decay_t<_Fp>&>
5463 && is_object_v<decay_t<invoke_result_t<decay_t<_Fp>&>>>
5465 operator() [[nodiscard]] (_Fp&&)
const
5467 return views::empty<decay_t<invoke_result_t<decay_t<_Fp>&>>>;
5470 template<
typename _Fp,
typename... _Ts>
5471 requires (
sizeof...(_Ts) != 0) && __detail::__can_zip_transform_view<_Fp, _Ts...>
5473 operator() [[nodiscard]] (_Fp&& __f, _Ts&&... __ts)
const
5479 inline constexpr _ZipTransform zip_transform;
5482 template<forward_range _Vp,
size_t _Nm>
5484 class adjacent_view : public
view_interface<adjacent_view<_Vp, _Nm>>
5486 _Vp _M_base = _Vp();
5488 template<
bool>
class _Iterator;
5489 template<
bool>
class _Sentinel;
5491 struct __as_sentinel
5495 adjacent_view()
requires default_initializable<_Vp> = default;
5498 adjacent_view(_Vp __base)
5499 : _M_base(std::move(__base))
5505 base() const & requires copy_constructible<_Vp>
5513 begin()
requires (!__detail::__simple_view<_Vp>)
5514 {
return _Iterator<false>(ranges::begin(_M_base), ranges::end(_M_base)); }
5518 {
return _Iterator<true>(ranges::begin(_M_base), ranges::end(_M_base)); }
5521 end()
requires (!__detail::__simple_view<_Vp>)
5524 return _Iterator<false>(__as_sentinel{}, ranges::begin(_M_base), ranges::end(_M_base));
5526 return _Sentinel<false>(ranges::end(_M_base));
5530 end() const requires
range<const _Vp>
5533 return _Iterator<true>(__as_sentinel{}, ranges::begin(_M_base), ranges::end(_M_base));
5535 return _Sentinel<true>(ranges::end(_M_base));
5541 using _ST =
decltype(ranges::size(_M_base));
5543 auto __sz =
static_cast<_CT
>(ranges::size(_M_base));
5545 return static_cast<_ST
>(__sz);
5551 using _ST =
decltype(ranges::size(_M_base));
5553 auto __sz =
static_cast<_CT
>(ranges::size(_M_base));
5555 return static_cast<_ST
>(__sz);
5559 template<
typename _Vp,
size_t _Nm>
5560 inline constexpr bool enable_borrowed_range<adjacent_view<_Vp, _Nm>>
5561 = enable_borrowed_range<_Vp>;
5566 template<
typename _Tp,
size_t _Nm>
5567 using __repeated_tuple =
typename __make_tuple<array<_Tp, _Nm>>::__type;
5571 template<
typename _Fp,
size_t _Nm>
5574 template<
typename... _Ts>
5575 static invoke_result_t<_Fp, _Ts...>
5576 __tuple_apply(
const tuple<_Ts...>&);
5578 template<
typename _Tp>
5579 decltype(__tuple_apply(
std::declval<__repeated_tuple<_Tp, _Nm>>()))
5584 template<forward_range _Vp,
size_t _Nm>
5586 template<bool _Const>
5587 class adjacent_view<_Vp, _Nm>::_Iterator
5589#ifdef _GLIBCXX_CLANG
5592 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5593 array<iterator_t<_Base>, _Nm> _M_current = array<iterator_t<_Base>, _Nm>();
5596 _Iterator(iterator_t<_Base> __first, sentinel_t<_Base> __last)
5598 for (
auto& __i : _M_current)
5601 ranges::advance(__first, 1, __last);
5606 _Iterator(__as_sentinel, iterator_t<_Base> __first, iterator_t<_Base> __last)
5609 for (
auto& __it : _M_current)
5612 for (
size_t __i = 0; __i < _Nm; ++__i)
5614 _M_current[_Nm - 1 - __i] = __last;
5615 ranges::advance(__last, -1, __first);
5623 return random_access_iterator_tag{};
5625 return bidirectional_iterator_tag{};
5627 return forward_iterator_tag{};
5630 friend class adjacent_view;
5632#ifndef _GLIBCXX_CLANG
5633 template<forward_range _Wp, move_constructible _Fp,
size_t _Mm>
5634 requires view<_Wp> && (_Mm > 0) && is_object_v<_Fp>
5635 && regular_invocable<__detail::__unarize<_Fp&, _Mm>, range_reference_t<_Wp>>
5636 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Mm>,
5637 range_reference_t<_Wp>>>
5638 friend class adjacent_transform_view;
5642 using iterator_category = input_iterator_tag;
5643 using iterator_concept =
decltype(_S_iter_concept());
5644 using value_type = __detail::__repeated_tuple<range_value_t<_Base>, _Nm>;
5645 using difference_type = range_difference_t<_Base>;
5647 _Iterator() =
default;
5650 _Iterator(_Iterator<!_Const> __i)
5651 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
5653 for (
size_t __j = 0; __j < _Nm; ++__j)
5654 _M_current[__j] =
std::move(__i._M_current[__j]);
5660 auto __f = [](
auto& __i) ->
decltype(
auto) {
return *__i; };
5661 return __detail::__tuple_transform(__f, _M_current);
5664 constexpr _Iterator&
5667 for (
auto& __i : _M_current)
5680 constexpr _Iterator&
5683 for (
auto& __i : _M_current)
5696 constexpr _Iterator&
5697 operator+=(difference_type __x)
5700 for (
auto& __i : _M_current)
5705 constexpr _Iterator&
5706 operator-=(difference_type __x)
5709 for (
auto& __i : _M_current)
5715 operator[](difference_type __n)
const
5718 auto __f = [&](
auto& __i) ->
decltype(
auto) {
return __i[__n]; };
5719 return __detail::__tuple_transform(__f, _M_current);
5722 friend constexpr bool
5723 operator==(
const _Iterator& __x,
const _Iterator& __y)
5724 {
return __x._M_current.back() == __y._M_current.back(); }
5726 friend constexpr bool
5727 operator<(
const _Iterator& __x,
const _Iterator& __y)
5729 {
return __x._M_current.back() < __y._M_current.back(); }
5731 friend constexpr bool
5732 operator>(
const _Iterator& __x,
const _Iterator& __y)
5734 {
return __y < __x; }
5736 friend constexpr bool
5737 operator<=(
const _Iterator& __x,
const _Iterator& __y)
5739 {
return !(__y < __x); }
5741 friend constexpr bool
5742 operator>=(
const _Iterator& __x,
const _Iterator& __y)
5744 {
return !(__x < __y); }
5746 friend constexpr auto
5747 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
5749 && three_way_comparable<iterator_t<_Base>>
5750 {
return __x._M_current.back() <=> __y._M_current.back(); }
5752 friend constexpr _Iterator
5753 operator+(
const _Iterator& __i, difference_type __n)
5761 friend constexpr _Iterator
5762 operator+(difference_type __n,
const _Iterator& __i)
5770 friend constexpr _Iterator
5771 operator-(
const _Iterator& __i, difference_type __n)
5779 friend constexpr difference_type
5780 operator-(
const _Iterator& __x,
const _Iterator& __y)
5781 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
5782 {
return __x._M_current.back() - __y._M_current.back(); }
5784 friend constexpr auto
5785 iter_move(
const _Iterator& __i)
5786 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
5788 friend constexpr void
5789 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
5790 requires indirectly_swappable<iterator_t<_Base>>
5792 for (
size_t __i = 0; __i < _Nm; __i++)
5793 ranges::iter_swap(__l._M_current[__i], __r._M_current[__i]);
5797 template<forward_range _Vp,
size_t _Nm>
5799 template<bool _Const>
5800 class adjacent_view<_Vp, _Nm>::_Sentinel
5802 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5804 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
5807 _Sentinel(sentinel_t<_Base> __end)
5811 friend class adjacent_view;
5814 _Sentinel() =
default;
5817 _Sentinel(_Sentinel<!_Const> __i)
5818 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
5822 template<
bool _OtherConst>
5823 requires sentinel_for<sentinel_t<_Base>,
5824 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5825 friend constexpr bool
5826 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5827 {
return __x._M_current.back() == __y._M_end; }
5829 template<
bool _OtherConst>
5830 requires sized_sentinel_for<sentinel_t<_Base>,
5831 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5832 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _Vp>>
5833 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
5834 {
return __x._M_current.back() - __y._M_end; }
5836 template<
bool _OtherConst>
5837 requires sized_sentinel_for<sentinel_t<_Base>,
5838 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
5839 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _Vp>>
5840 operator-(
const _Sentinel& __y,
const _Iterator<_OtherConst>& __x)
5841 {
return __y._M_end - __x._M_current.back(); }
5848 template<
size_t _Nm,
typename _Range>
5849 concept __can_adjacent_view
5853 template<
size_t _Nm>
5854 struct _Adjacent : __adaptor::_RangeAdaptorClosure<_Adjacent<_Nm>>
5856 template<viewable_range _Range>
5857 requires (_Nm == 0) || __detail::__can_adjacent_view<_Nm, _Range>
5859 operator() [[nodiscard]] (_Range&& __r)
const
5861 if constexpr (_Nm == 0)
5862 return views::empty<tuple<>>;
5868 template<
size_t _Nm>
5869 inline constexpr _Adjacent<_Nm> adjacent;
5871 inline constexpr auto pairwise = adjacent<2>;
5874 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
5875 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
5876 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
5877 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
5878 range_reference_t<_Vp>>>
5879 class adjacent_transform_view : public
view_interface<adjacent_transform_view<_Vp, _Fp, _Nm>>
5881 [[no_unique_address]] __detail::__box<_Fp> _M_fun;
5882 adjacent_view<_Vp, _Nm> _M_inner;
5884 using _InnerView = adjacent_view<_Vp, _Nm>;
5886 template<
bool _Const>
5887 using _InnerIter = iterator_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5889 template<
bool _Const>
5890 using _InnerSent = sentinel_t<__detail::__maybe_const_t<_Const, _InnerView>>;
5892 template<
bool>
class _Iterator;
5893 template<
bool>
class _Sentinel;
5896 adjacent_transform_view() =
default;
5899 adjacent_transform_view(_Vp __base, _Fp __fun)
5900 : _M_fun(std::move(__fun)), _M_inner(std::move(
__base))
5907 base() const & requires copy_constructible<_Vp>
5908 {
return _M_inner.base(); }
5916 {
return _Iterator<false>(*
this, _M_inner.begin()); }
5920 requires
range<const _InnerView>
5921 && regular_invocable<__detail::__unarize<const _Fp&, _Nm>,
5922 range_reference_t<const _Vp>>
5923 {
return _Iterator<true>(*
this, _M_inner.begin()); }
5929 return _Iterator<false>(*
this, _M_inner.end());
5931 return _Sentinel<false>(_M_inner.end());
5936 requires
range<const _InnerView>
5937 && regular_invocable<__detail::__unarize<const _Fp&, _Nm>,
5938 range_reference_t<const _Vp>>
5941 return _Iterator<true>(*
this, _M_inner.end());
5943 return _Sentinel<true>(_M_inner.end());
5948 {
return _M_inner.size(); }
5952 {
return _M_inner.size(); }
5955 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
5956 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
5957 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
5958 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
5959 range_reference_t<_Vp>>>
5960 template<bool _Const>
5961 class adjacent_transform_view<_Vp, _Fp, _Nm>::_Iterator
5963 using _Parent = __detail::__maybe_const_t<_Const, adjacent_transform_view>;
5964 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
5966 return __detail::__func_handle_t<
5967 __detail::__maybe_const_t<_Const, _Fp>,
5968 iterator_t<__detail::__maybe_const_t<(_Ids, _Const), _Vp>>...>();
5971 [[no_unique_address]] _Fun_handle _M_fun;
5972 _InnerIter<_Const> _M_inner;
5975 _Iterator(_Fun_handle __fun, _InnerIter<_Const> __inner)
5976 : _M_fun(__fun), _M_inner(std::move(__inner))
5980 _Iterator(_Parent& __parent, _InnerIter<_Const> __inner)
5981 : _M_fun(*__parent._M_fun), _M_inner(std::move(__inner))
5987 using __detail::__maybe_const_t;
5988 using __detail::__unarize;
5989 using _Res = invoke_result_t<__unarize<__maybe_const_t<_Const, _Fp>&, _Nm>,
5990 range_reference_t<_Base>>;
5991 using _Cat =
typename iterator_traits<iterator_t<_Base>>::iterator_category;
5994 if constexpr (!is_reference_v<_Res>)
5995 return input_iterator_tag{};
5996 else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
5997 return random_access_iterator_tag{};
5998 else if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
5999 return bidirectional_iterator_tag{};
6000 else if constexpr (derived_from<_Cat, forward_iterator_tag>)
6001 return forward_iterator_tag{};
6003 return input_iterator_tag{};
6006 friend class adjacent_transform_view;
6009 using iterator_category =
decltype(_S_iter_cat());
6010 using iterator_concept =
typename _InnerIter<_Const>::iterator_concept;
6012 = remove_cvref_t<invoke_result_t
6013 <__detail::__unarize<__detail::__maybe_const_t<_Const, _Fp>&, _Nm>,
6014 range_reference_t<_Base>>>;
6015 using difference_type = range_difference_t<_Base>;
6017 _Iterator() =
default;
6020 _Iterator(_Iterator<!_Const> __i)
6021 requires _Const && convertible_to<_InnerIter<false>, _InnerIter<_Const>>
6022 : _M_fun(__i._M_fun), _M_inner(
std::move(__i._M_inner))
6025 constexpr decltype(
auto)
6028 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
6029 return _M_fun._M_call_deref(__iters...);
6030 }, _M_inner._M_current);
6033 constexpr _Iterator&
6048 constexpr _Iterator&
6063 constexpr _Iterator&
6070 constexpr _Iterator&
6077 constexpr decltype(
auto)
6080 return std::apply([&](
const auto&... __iters) ->
decltype(
auto) {
6081 return _M_fun._M_call_subscript(__n, __iters...);
6082 }, _M_inner._M_current);
6085 friend constexpr bool
6086 operator==(
const _Iterator& __x,
const _Iterator& __y)
6087 {
return __x._M_inner == __y._M_inner; }
6089 friend constexpr bool
6090 operator<(
const _Iterator& __x,
const _Iterator& __y)
6092 {
return __x._M_inner < __y._M_inner; }
6094 friend constexpr bool
6095 operator>(
const _Iterator& __x,
const _Iterator& __y)
6097 {
return __x._M_inner > __y._M_inner; }
6099 friend constexpr bool
6100 operator<=(
const _Iterator& __x,
const _Iterator& __y)
6102 {
return __x._M_inner <= __y._M_inner; }
6104 friend constexpr bool
6105 operator>=(
const _Iterator& __x,
const _Iterator& __y)
6107 {
return __x._M_inner >= __y._M_inner; }
6109 friend constexpr auto
6110 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
6112 three_way_comparable<_InnerIter<_Const>>
6113 {
return __x._M_inner <=> __y._M_inner; }
6115 friend constexpr _Iterator
6116 operator+(
const _Iterator& __i, difference_type __n)
6118 {
return _Iterator(__i._M_fun, __i._M_inner + __n); }
6120 friend constexpr _Iterator
6121 operator+(difference_type __n,
const _Iterator& __i)
6123 {
return _Iterator(__i._M_fun, __i._M_inner + __n); }
6125 friend constexpr _Iterator
6126 operator-(
const _Iterator& __i, difference_type __n)
6128 {
return _Iterator(__i._M_fun, __i._M_inner - __n); }
6130 friend constexpr difference_type
6131 operator-(
const _Iterator& __x,
const _Iterator& __y)
6132 requires sized_sentinel_for<_InnerIter<_Const>, _InnerIter<_Const>>
6133 {
return __x._M_inner - __y._M_inner; }
6136 template<forward_range _Vp, move_constructible _Fp,
size_t _Nm>
6137 requires view<_Vp> && (_Nm > 0) && is_object_v<_Fp>
6138 && regular_invocable<__detail::__unarize<_Fp&, _Nm>, range_reference_t<_Vp>>
6139 && std::__detail::__can_reference<invoke_result_t<__detail::__unarize<_Fp&, _Nm>,
6140 range_reference_t<_Vp>>>
6141 template<bool _Const>
6142 class adjacent_transform_view<_Vp, _Fp, _Nm>::_Sentinel
6144 _InnerSent<_Const> _M_inner;
6147 _Sentinel(_InnerSent<_Const> __inner)
6151 friend class adjacent_transform_view;
6154 _Sentinel() =
default;
6157 _Sentinel(_Sentinel<!_Const> __i)
6158 requires _Const && convertible_to<_InnerSent<false>, _InnerSent<_Const>>
6162 template<
bool _OtherConst>
6163 requires sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
6164 friend constexpr bool
6165 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
6166 {
return __x._M_inner == __y._M_inner; }
6168 template<
bool _OtherConst>
6169 requires sized_sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
6170 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
6171 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
6172 {
return __x._M_inner - __y._M_inner; }
6174 template<
bool _OtherConst>
6175 requires sized_sentinel_for<_InnerSent<_Const>, _InnerIter<_OtherConst>>
6176 friend constexpr range_difference_t<__detail::__maybe_const_t<_OtherConst, _InnerView>>
6177 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
6178 {
return __x._M_inner - __y._M_inner; }
6185 template<
size_t _Nm,
typename _Range,
typename _Fp>
6186 concept __can_adjacent_transform_view
6187 =
requires { adjacent_transform_view<all_t<_Range>,
decay_t<_Fp>, _Nm>
6191 template<
size_t _Nm>
6192 struct _AdjacentTransform : __adaptor::_RangeAdaptor<_AdjacentTransform<_Nm>>
6194 template<viewable_range _Range,
typename _Fp>
6195 requires (_Nm == 0) || __detail::__can_adjacent_transform_view<_Nm, _Range, _Fp>
6197 operator() [[nodiscard]] (_Range&& __r, _Fp&& __f)
const
6199 if constexpr (_Nm == 0)
6202 return adjacent_transform_view<all_t<_Range>, decay_t<_Fp>, _Nm>
6206 using __adaptor::_RangeAdaptor<_AdjacentTransform>::operator();
6207 static constexpr int _S_arity = 2;
6208 static constexpr bool _S_has_simple_extra_args =
true;
6211 template<
size_t _Nm>
6212 inline constexpr _AdjacentTransform<_Nm> adjacent_transform;
6214 inline constexpr auto pairwise_transform = adjacent_transform<2>;
6218#ifdef __cpp_lib_ranges_chunk
6221 template<
typename _Tp>
6222 constexpr _Tp __div_ceil(_Tp __num, _Tp __denom)
6224 _Tp __r = __num / __denom;
6225 if (__num % __denom)
6236 range_difference_t<_Vp> _M_n;
6237 range_difference_t<_Vp> _M_remainder = 0;
6238 __detail::__non_propagating_cache<iterator_t<_Vp>> _M_current;
6245 chunk_view(_Vp __base, range_difference_t<_Vp> __n)
6246 : _M_base(std::move(
__base)), _M_n(__n)
6247 { __glibcxx_assert(__n >= 0); }
6250 base() const & requires copy_constructible<_Vp>
6257 constexpr _OuterIter
6260 _M_current = ranges::begin(_M_base);
6261 _M_remainder = _M_n;
6262 return _OuterIter(*
this);
6265 constexpr default_sentinel_t
6266 end() const noexcept
6270 size()
requires sized_range<_Vp>
6272 return __detail::__to_unsigned_like(__detail::__div_ceil
6273 (ranges::distance(_M_base), _M_n));
6277 size() const requires sized_range<const _Vp>
6279 return __detail::__to_unsigned_like(__detail::__div_ceil
6280 (ranges::distance(_M_base), _M_n));
6284 template<
typename _Range>
6285 chunk_view(_Range&&, range_difference_t<_Range>) -> chunk_view<views::all_t<_Range>>;
6289 class chunk_view<_Vp>::_OuterIter
6291 chunk_view* _M_parent;
6294 _OuterIter(chunk_view& __parent) noexcept
6301 using iterator_concept = input_iterator_tag;
6302 using difference_type = range_difference_t<_Vp>;
6306 _OuterIter(_OuterIter&&) =
default;
6307 _OuterIter& operator=(_OuterIter&&) =
default;
6309 constexpr value_type
6312 __glibcxx_assert(*
this != default_sentinel);
6313 return value_type(*_M_parent);
6316 constexpr _OuterIter&
6319 __glibcxx_assert(*
this != default_sentinel);
6320 ranges::advance(*_M_parent->_M_current, _M_parent->_M_remainder,
6321 ranges::end(_M_parent->_M_base));
6322 _M_parent->_M_remainder = _M_parent->_M_n;
6330 friend constexpr bool
6331 operator==(
const _OuterIter& __x, default_sentinel_t)
6333 return *__x._M_parent->_M_current == ranges::end(__x._M_parent->_M_base)
6334 && __x._M_parent->_M_remainder != 0;
6337 friend constexpr difference_type
6338 operator-(default_sentinel_t,
const _OuterIter& __x)
6339 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6341 const auto __dist = ranges::end(__x._M_parent->_M_base) - *__x._M_parent->_M_current;
6343 if (__dist < __x._M_parent->_M_remainder)
6344 return __dist == 0 ? 0 : 1;
6346 return 1 + __detail::__div_ceil(__dist - __x._M_parent->_M_remainder,
6347 __x._M_parent->_M_n);
6350 friend constexpr difference_type
6351 operator-(
const _OuterIter& __x, default_sentinel_t __y)
6352 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6353 {
return -(__y - __x); }
6358 struct chunk_view<_Vp>::_OuterIter::value_type :
view_interface<value_type>
6361 chunk_view* _M_parent;
6364 value_type(chunk_view& __parent) noexcept
6371 constexpr _InnerIter
6372 begin() const noexcept
6373 {
return _InnerIter(*_M_parent); }
6375 constexpr default_sentinel_t
6376 end() const noexcept
6381 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6383 return __detail::__to_unsigned_like
6384 (ranges::min(_M_parent->_M_remainder,
6385 ranges::end(_M_parent->_M_base) - *_M_parent->_M_current));
6391 class chunk_view<_Vp>::_InnerIter
6393 chunk_view* _M_parent;
6396 _InnerIter(chunk_view& __parent) noexcept
6400 friend _OuterIter::value_type;
6403 using iterator_concept = input_iterator_tag;
6404 using difference_type = range_difference_t<_Vp>;
6405 using value_type = range_value_t<_Vp>;
6407 _InnerIter(_InnerIter&&) =
default;
6408 _InnerIter& operator=(_InnerIter&&) =
default;
6410 constexpr const iterator_t<_Vp>&
6412 {
return *_M_parent->_M_current; }
6414 constexpr range_reference_t<_Vp>
6417 __glibcxx_assert(*
this != default_sentinel);
6418 return **_M_parent->_M_current;
6421 constexpr _InnerIter&
6424 __glibcxx_assert(*
this != default_sentinel);
6425 ++*_M_parent->_M_current;
6426 if (*_M_parent->_M_current == ranges::end(_M_parent->_M_base))
6427 _M_parent->_M_remainder = 0;
6429 --_M_parent->_M_remainder;
6437 friend constexpr bool
6438 operator==(
const _InnerIter& __x, default_sentinel_t)
noexcept
6439 {
return __x._M_parent->_M_remainder == 0; }
6441 friend constexpr difference_type
6442 operator-(default_sentinel_t,
const _InnerIter& __x)
6443 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6445 return ranges::min(__x._M_parent->_M_remainder,
6446 ranges::end(__x._M_parent->_M_base) - *__x._M_parent->_M_current);
6449 friend constexpr difference_type
6450 operator-(
const _InnerIter& __x, default_sentinel_t __y)
6451 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
6452 {
return -(__y - __x); }
6456 friend constexpr range_rvalue_reference_t<_Vp>
6457 iter_move(
const _InnerIter& __i)
6458 noexcept(
noexcept(ranges::iter_move(*__i._M_parent->_M_current)))
6459 {
return ranges::iter_move(*__i._M_parent->_M_current); }
6461 friend constexpr void
6462 iter_swap(
const _InnerIter& __x,
const _InnerIter& __y)
6463 noexcept(
noexcept(ranges::iter_swap(*__x._M_parent->_M_current,
6464 *__x._M_parent->_M_current)))
6465 requires indirectly_swappable<iterator_t<_Vp>>
6466 {
return ranges::iter_swap(*__x._M_parent->_M_current, *__y._M_parent->_M_current); }
6474 range_difference_t<_Vp> _M_n;
6475 template<
bool>
class _Iterator;
6479 chunk_view(_Vp __base, range_difference_t<_Vp> __n)
6480 : _M_base(std::move(
__base)), _M_n(__n)
6481 { __glibcxx_assert(__n > 0); }
6484 base() const & requires copy_constructible<_Vp>
6492 begin()
requires (!__detail::__simple_view<_Vp>)
6493 {
return _Iterator<false>(
this, ranges::begin(_M_base)); }
6496 begin() const requires forward_range<const _Vp>
6497 {
return _Iterator<true>(
this, ranges::begin(_M_base)); }
6500 end()
requires (!__detail::__simple_view<_Vp>)
6502 if constexpr (common_range<_Vp> && sized_range<_Vp>)
6504 auto __missing = (_M_n - ranges::distance(_M_base) % _M_n) % _M_n;
6505 return _Iterator<false>(
this, ranges::end(_M_base), __missing);
6507 else if constexpr (common_range<_Vp> && !bidirectional_range<_Vp>)
6508 return _Iterator<false>(
this, ranges::end(_M_base));
6514 end() const requires forward_range<const _Vp>
6516 if constexpr (common_range<const _Vp> && sized_range<const _Vp>)
6518 auto __missing = (_M_n - ranges::distance(_M_base) % _M_n) % _M_n;
6519 return _Iterator<true>(
this, ranges::end(_M_base), __missing);
6521 else if constexpr (common_range<const _Vp> && !bidirectional_range<const _Vp>)
6522 return _Iterator<true>(
this, ranges::end(_M_base));
6528 size()
requires sized_range<_Vp>
6530 return __detail::__to_unsigned_like(__detail::__div_ceil
6531 (ranges::distance(_M_base), _M_n));
6535 size() const requires sized_range<const _Vp>
6537 return __detail::__to_unsigned_like(__detail::__div_ceil
6538 (ranges::distance(_M_base), _M_n));
6542 template<
typename _Vp>
6543 inline constexpr bool enable_borrowed_range<chunk_view<_Vp>>
6548 template<
bool _Const>
6549 class chunk_view<_Vp>::_Iterator
6551 using _Parent = __detail::__maybe_const_t<_Const, chunk_view>;
6552 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
6554 iterator_t<_Base> _M_current = iterator_t<_Base>();
6555 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
6556 range_difference_t<_Base> _M_n = 0;
6557 range_difference_t<_Base> _M_missing = 0;
6560 _Iterator(_Parent* __parent, iterator_t<_Base> __current,
6561 range_difference_t<_Base> __missing = 0)
6562 : _M_current(__current), _M_end(ranges::end(__parent->_M_base)),
6563 _M_n(__parent->_M_n), _M_missing(__missing)
6569 if constexpr (random_access_range<_Base>)
6570 return random_access_iterator_tag{};
6571 else if constexpr (bidirectional_range<_Base>)
6572 return bidirectional_iterator_tag{};
6574 return forward_iterator_tag{};
6580 using iterator_category = input_iterator_tag;
6581 using iterator_concept =
decltype(_S_iter_cat());
6582 using value_type =
decltype(views::take(subrange(_M_current, _M_end), _M_n));
6583 using difference_type = range_difference_t<_Base>;
6585 _Iterator() =
default;
6587 constexpr _Iterator(_Iterator<!_Const> __i)
6589 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
6590 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
6592 _M_n(__i._M_n), _M_missing(__i._M_missing)
6595 constexpr iterator_t<_Base>
6597 {
return _M_current; }
6599 constexpr value_type
6602 __glibcxx_assert(_M_current != _M_end);
6603 return views::take(subrange(_M_current, _M_end), _M_n);
6606 constexpr _Iterator&
6609 __glibcxx_assert(_M_current != _M_end);
6610 _M_missing = ranges::advance(_M_current, _M_n, _M_end);
6622 constexpr _Iterator&
6623 operator--()
requires bidirectional_range<_Base>
6625 ranges::advance(_M_current, _M_missing - _M_n);
6631 operator--(
int)
requires bidirectional_range<_Base>
6638 constexpr _Iterator&
6639 operator+=(difference_type __x)
6640 requires random_access_range<_Base>
6644 __glibcxx_assert(ranges::distance(_M_current, _M_end) > _M_n * (__x - 1));
6645 _M_missing = ranges::advance(_M_current, _M_n * __x, _M_end);
6649 ranges::advance(_M_current, _M_n * __x + _M_missing);
6655 constexpr _Iterator&
6656 operator-=(difference_type __x)
6657 requires random_access_range<_Base>
6658 {
return *
this += -__x; }
6660 constexpr value_type
6661 operator[](difference_type __n)
const
6662 requires random_access_range<_Base>
6663 {
return *(*
this + __n); }
6665 friend constexpr bool
6666 operator==(
const _Iterator& __x,
const _Iterator& __y)
6667 {
return __x._M_current == __y._M_current; }
6669 friend constexpr bool
6670 operator==(
const _Iterator& __x, default_sentinel_t)
6671 {
return __x._M_current == __x._M_end; }
6673 friend constexpr bool
6674 operator<(
const _Iterator& __x,
const _Iterator& __y)
6675 requires random_access_range<_Base>
6676 {
return __x._M_current > __y._M_current; }
6678 friend constexpr bool
6679 operator>(
const _Iterator& __x,
const _Iterator& __y)
6680 requires random_access_range<_Base>
6681 {
return __y < __x; }
6683 friend constexpr bool
6684 operator<=(
const _Iterator& __x,
const _Iterator& __y)
6685 requires random_access_range<_Base>
6686 {
return !(__y < __x); }
6688 friend constexpr bool
6689 operator>=(
const _Iterator& __x,
const _Iterator& __y)
6690 requires random_access_range<_Base>
6691 {
return !(__x < __y); }
6693 friend constexpr auto
6694 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
6695 requires random_access_range<_Base>
6696 && three_way_comparable<iterator_t<_Base>>
6697 {
return __x._M_current <=> __y._M_current; }
6699 friend constexpr _Iterator
6700 operator+(
const _Iterator& __i, difference_type __n)
6701 requires random_access_range<_Base>
6708 friend constexpr _Iterator
6709 operator+(difference_type __n,
const _Iterator& __i)
6710 requires random_access_range<_Base>
6717 friend constexpr _Iterator
6718 operator-(
const _Iterator& __i, difference_type __n)
6719 requires random_access_range<_Base>
6726 friend constexpr difference_type
6727 operator-(
const _Iterator& __x,
const _Iterator& __y)
6728 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
6730 return (__x._M_current - __y._M_current
6731 + __x._M_missing - __y._M_missing) / __x._M_n;
6734 friend constexpr difference_type
6735 operator-(default_sentinel_t,
const _Iterator& __x)
6736 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
6737 {
return __detail::__div_ceil(__x._M_end - __x._M_current, __x._M_n); }
6739 friend constexpr difference_type
6740 operator-(
const _Iterator& __x, default_sentinel_t __y)
6741 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
6742 {
return -(__y - __x); }
6749 template<
typename _Range,
typename _Dp>
6750 concept __can_chunk_view
6754 struct _Chunk : __adaptor::_RangeAdaptor<_Chunk>
6756 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
6757 requires __detail::__can_chunk_view<_Range, _Dp>
6759 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
6762 using __adaptor::_RangeAdaptor<_Chunk>::operator();
6763 static constexpr int _S_arity = 2;
6764 static constexpr bool _S_has_simple_extra_args =
true;
6767 inline constexpr _Chunk chunk;
6771#ifdef __cpp_lib_ranges_slide
6774 template<
typename _Vp>
6775 concept __slide_caches_nothing = random_access_range<_Vp> && sized_range<_Vp>;
6777 template<
typename _Vp>
6778 concept __slide_caches_last
6779 = !__slide_caches_nothing<_Vp> && bidirectional_range<_Vp> && common_range<_Vp>;
6781 template<
typename _Vp>
6782 concept __slide_caches_first
6783 = !__slide_caches_nothing<_Vp> && !__slide_caches_last<_Vp>;
6786 template<forward_range _Vp>
6791 range_difference_t<_Vp> _M_n;
6792 [[no_unique_address]]
6793 __detail::__maybe_present_t<__detail::__slide_caches_first<_Vp>,
6794 __detail::_CachedPosition<_Vp>, 0> _M_cached_begin;
6795 [[no_unique_address]]
6796 __detail::__maybe_present_t<__detail::__slide_caches_last<_Vp>,
6797 __detail::_CachedPosition<_Vp>, 1> _M_cached_end;
6799 template<
bool>
class _Iterator;
6804 slide_view(_Vp __base, range_difference_t<_Vp> __n)
6805 : _M_base(std::move(
__base)), _M_n(__n)
6806 { __glibcxx_assert(__n > 0); }
6811 base() const & requires copy_constructible<_Vp>
6819 begin()
requires (!(__detail::__simple_view<_Vp>
6820 && __detail::__slide_caches_nothing<const _Vp>))
6822 if constexpr (__detail::__slide_caches_first<_Vp>)
6824 iterator_t<_Vp> __it;
6825 if (_M_cached_begin._M_has_value())
6826 __it = _M_cached_begin._M_get(_M_base);
6829 __it = ranges::next(ranges::begin(_M_base), _M_n - 1, ranges::end(_M_base));
6830 _M_cached_begin._M_set(_M_base, __it);
6832 return _Iterator<false>(ranges::begin(_M_base),
std::move(__it), _M_n);
6835 return _Iterator<false>(ranges::begin(_M_base), _M_n);
6839 begin() const requires __detail::__slide_caches_nothing<const _Vp>
6840 {
return _Iterator<true>(ranges::begin(_M_base), _M_n); }
6843 end()
requires (!(__detail::__simple_view<_Vp>
6844 && __detail::__slide_caches_nothing<const _Vp>))
6846 if constexpr (__detail::__slide_caches_nothing<_Vp>)
6847 return _Iterator<false>(ranges::begin(_M_base) + range_difference_t<_Vp>(size()),
6849 else if constexpr (__detail::__slide_caches_last<_Vp>)
6851 iterator_t<_Vp> __it;
6852 if (_M_cached_end._M_has_value())
6853 __it = _M_cached_end._M_get(_M_base);
6856 __it = ranges::prev(ranges::end(_M_base), _M_n - 1, ranges::begin(_M_base));
6857 _M_cached_end._M_set(_M_base, __it);
6859 return _Iterator<false>(
std::move(__it), _M_n);
6861 else if constexpr (common_range<_Vp>)
6862 return _Iterator<false>(ranges::end(_M_base), ranges::end(_M_base), _M_n);
6864 return _Sentinel(ranges::end(_M_base));
6868 end() const requires __detail::__slide_caches_nothing<const _Vp>
6869 {
return begin() + range_difference_t<const _Vp>(size()); }
6872 size()
requires sized_range<_Vp>
6874 auto __sz = ranges::distance(_M_base) - _M_n + 1;
6877 return __detail::__to_unsigned_like(__sz);
6881 size() const requires sized_range<const _Vp>
6883 auto __sz = ranges::distance(_M_base) - _M_n + 1;
6886 return __detail::__to_unsigned_like(__sz);
6890 template<
typename _Range>
6891 slide_view(_Range&&, range_difference_t<_Range>) -> slide_view<views::all_t<_Range>>;
6893 template<
typename _Vp>
6894 inline constexpr bool enable_borrowed_range<slide_view<_Vp>>
6895 = enable_borrowed_range<_Vp>;
6897 template<forward_range _Vp>
6899 template<
bool _Const>
6900 class slide_view<_Vp>::_Iterator
6902 using _Base = __detail::__maybe_const_t<_Const, _Vp>;
6903 static constexpr bool _S_last_elt_present
6904 = __detail::__slide_caches_first<_Base>;
6906 iterator_t<_Base> _M_current = iterator_t<_Base>();
6907 [[no_unique_address]]
6908 __detail::__maybe_present_t<_S_last_elt_present, iterator_t<_Base>>
6909 _M_last_elt =
decltype(_M_last_elt)();
6910 range_difference_t<_Base> _M_n = 0;
6913 _Iterator(iterator_t<_Base> __current, range_difference_t<_Base> __n)
6914 requires (!_S_last_elt_present)
6915 : _M_current(__current), _M_n(__n)
6919 _Iterator(iterator_t<_Base> __current, iterator_t<_Base> __last_elt,
6920 range_difference_t<_Base> __n)
6921 requires _S_last_elt_present
6922 : _M_current(__current), _M_last_elt(__last_elt), _M_n(__n)
6928 if constexpr (random_access_range<_Base>)
6929 return random_access_iterator_tag{};
6930 else if constexpr (bidirectional_range<_Base>)
6931 return bidirectional_iterator_tag{};
6933 return forward_iterator_tag{};
6937 friend slide_view::_Sentinel;
6940 using iterator_category = input_iterator_tag;
6941 using iterator_concept =
decltype(_S_iter_concept());
6942 using value_type =
decltype(views::counted(_M_current, _M_n));
6943 using difference_type = range_difference_t<_Base>;
6945 _Iterator() =
default;
6948 _Iterator(_Iterator<!_Const> __i)
6949 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
6950 : _M_current(
std::move(__i._M_current)), _M_n(__i._M_n)
6955 {
return views::counted(_M_current, _M_n); }
6957 constexpr _Iterator&
6961 if constexpr (_S_last_elt_present)
6974 constexpr _Iterator&
6975 operator--()
requires bidirectional_range<_Base>
6978 if constexpr (_S_last_elt_present)
6984 operator--(
int)
requires bidirectional_range<_Base>
6991 constexpr _Iterator&
6992 operator+=(difference_type __x)
6993 requires random_access_range<_Base>
6996 if constexpr (_S_last_elt_present)
7001 constexpr _Iterator&
7002 operator-=(difference_type __x)
7003 requires random_access_range<_Base>
7006 if constexpr (_S_last_elt_present)
7012 operator[](difference_type __n)
const
7013 requires random_access_range<_Base>
7014 {
return views::counted(_M_current + __n, _M_n); }
7016 friend constexpr bool
7017 operator==(
const _Iterator& __x,
const _Iterator& __y)
7019 if constexpr (_S_last_elt_present)
7020 return __x._M_last_elt == __y._M_last_elt;
7022 return __x._M_current == __y._M_current;
7025 friend constexpr bool
7026 operator<(
const _Iterator& __x,
const _Iterator& __y)
7027 requires random_access_range<_Base>
7028 {
return __x._M_current < __y._M_current; }
7030 friend constexpr bool
7031 operator>(
const _Iterator& __x,
const _Iterator& __y)
7032 requires random_access_range<_Base>
7033 {
return __y < __x; }
7035 friend constexpr bool
7036 operator<=(
const _Iterator& __x,
const _Iterator& __y)
7037 requires random_access_range<_Base>
7038 {
return !(__y < __x); }
7040 friend constexpr bool
7041 operator>=(
const _Iterator& __x,
const _Iterator& __y)
7042 requires random_access_range<_Base>
7043 {
return !(__x < __y); }
7045 friend constexpr auto
7046 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
7047 requires random_access_range<_Base>
7048 && three_way_comparable<iterator_t<_Base>>
7049 {
return __x._M_current <=> __y._M_current; }
7051 friend constexpr _Iterator
7052 operator+(
const _Iterator& __i, difference_type __n)
7053 requires random_access_range<_Base>
7060 friend constexpr _Iterator
7061 operator+(difference_type __n,
const _Iterator& __i)
7062 requires random_access_range<_Base>
7069 friend constexpr _Iterator
7070 operator-(
const _Iterator& __i, difference_type __n)
7071 requires random_access_range<_Base>
7078 friend constexpr difference_type
7079 operator-(
const _Iterator& __x,
const _Iterator& __y)
7080 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
7082 if constexpr (_S_last_elt_present)
7083 return __x._M_last_elt - __y._M_last_elt;
7085 return __x._M_current - __y._M_current;
7089 template<forward_range _Vp>
7091 class slide_view<_Vp>::_Sentinel
7093 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
7096 _Sentinel(sentinel_t<_Vp> __end)
7103 _Sentinel() =
default;
7105 friend constexpr bool
7106 operator==(
const _Iterator<false>& __x,
const _Sentinel& __y)
7107 {
return __x._M_last_elt == __y._M_end; }
7109 friend constexpr range_difference_t<_Vp>
7110 operator-(
const _Iterator<false>& __x,
const _Sentinel& __y)
7111 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
7112 {
return __x._M_last_elt - __y._M_end; }
7114 friend constexpr range_difference_t<_Vp>
7115 operator-(
const _Sentinel& __y,
const _Iterator<false>& __x)
7116 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
7117 {
return __y._M_end -__x._M_last_elt; }
7124 template<
typename _Range,
typename _Dp>
7125 concept __can_slide_view
7129 struct _Slide : __adaptor::_RangeAdaptor<_Slide>
7131 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
7132 requires __detail::__can_slide_view<_Range, _Dp>
7134 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
7137 using __adaptor::_RangeAdaptor<_Slide>::operator();
7138 static constexpr int _S_arity = 2;
7139 static constexpr bool _S_has_simple_extra_args =
true;
7142 inline constexpr _Slide slide;
7146#ifdef __cpp_lib_ranges_chunk_by
7148 indirect_binary_predicate<iterator_t<_Vp>, iterator_t<_Vp>> _Pred>
7149 requires view<_Vp> && is_object_v<_Pred>
7150 class chunk_by_view :
public view_interface<chunk_by_view<_Vp, _Pred>>
7152 _Vp _M_base = _Vp();
7153 __detail::__box<_Pred> _M_pred;
7154 __detail::_CachedPosition<_Vp> _M_cached_begin;
7156 constexpr iterator_t<_Vp>
7157 _M_find_next(iterator_t<_Vp> __current)
7159 __glibcxx_assert(_M_pred.has_value());
7160 auto __pred = [
this]<
typename _Tp,
typename _Up>(_Tp&& __x, _Up&& __y) {
7163 auto __it = ranges::adjacent_find(__current, ranges::end(_M_base), __pred);
7164 return ranges::next(__it, 1, ranges::end(_M_base));
7167 constexpr iterator_t<_Vp>
7168 _M_find_prev(iterator_t<_Vp> __current)
requires bidirectional_range<_Vp>
7170 __glibcxx_assert(_M_pred.has_value());
7171 auto __pred = [
this]<
typename _Tp,
typename _Up>(_Tp&& __x, _Up&& __y) {
7176 __glibcxx_assert(__rbegin != __rend);
7177 auto __it = ranges::adjacent_find(__rbegin, __rend, __pred).base();
7178 return ranges::prev(__it, 1, ranges::begin(_M_base));
7184 chunk_by_view()
requires (default_initializable<_Vp>
7185 && default_initializable<_Pred>)
7189 chunk_by_view(_Vp __base, _Pred __pred)
7190 : _M_base(std::move(
__base)), _M_pred(std::move(__pred))
7194 base() const & requires copy_constructible<_Vp>
7201 constexpr const _Pred&
7203 {
return *_M_pred; }
7208 __glibcxx_assert(_M_pred.has_value());
7209 iterator_t<_Vp> __it;
7210 if (_M_cached_begin._M_has_value())
7211 __it = _M_cached_begin._M_get(_M_base);
7214 __it = _M_find_next(ranges::begin(_M_base));
7215 _M_cached_begin._M_set(_M_base, __it);
7217 return _Iterator(*
this, ranges::begin(_M_base), __it);
7223 if constexpr (common_range<_Vp>)
7224 return _Iterator(*
this, ranges::end(_M_base), ranges::end(_M_base));
7230 template<
typename _Range,
typename _Pred>
7231 chunk_by_view(_Range&&, _Pred) -> chunk_by_view<views::all_t<_Range>, _Pred>;
7234 indirect_binary_predicate<iterator_t<_Vp>, iterator_t<_Vp>> _Pred>
7235 requires view<_Vp> && is_object_v<_Pred>
7236 class chunk_by_view<_Vp, _Pred>::_Iterator
7238 chunk_by_view* _M_parent =
nullptr;
7239 iterator_t<_Vp> _M_current = iterator_t<_Vp>();
7240 iterator_t<_Vp> _M_next = iterator_t<_Vp>();
7243 _Iterator(chunk_by_view& __parent, iterator_t<_Vp> __current, iterator_t<_Vp> __next)
7244 : _M_parent(std::
__addressof(__parent)), _M_current(__current), _M_next(__next)
7250 if constexpr (bidirectional_range<_Vp>)
7251 return bidirectional_iterator_tag{};
7253 return forward_iterator_tag{};
7256 friend chunk_by_view;
7259 using value_type = subrange<iterator_t<_Vp>>;
7260 using difference_type = range_difference_t<_Vp>;
7261 using iterator_category = input_iterator_tag;
7262 using iterator_concept =
decltype(_S_iter_concept());
7264 _Iterator() =
default;
7266 constexpr value_type
7269 __glibcxx_assert(_M_current != _M_next);
7270 return ranges::subrange(_M_current, _M_next);
7273 constexpr _Iterator&
7276 __glibcxx_assert(_M_current != _M_next);
7277 _M_current = _M_next;
7278 _M_next = _M_parent->_M_find_next(_M_current);
7290 constexpr _Iterator&
7291 operator--()
requires bidirectional_range<_Vp>
7293 _M_next = _M_current;
7294 _M_current = _M_parent->_M_find_prev(_M_next);
7299 operator--(
int)
requires bidirectional_range<_Vp>
7306 friend constexpr bool
7307 operator==(
const _Iterator& __x,
const _Iterator& __y)
7308 {
return __x._M_current == __y._M_current; }
7310 friend constexpr bool
7311 operator==(
const _Iterator& __x, default_sentinel_t)
7312 {
return __x._M_current == __x._M_next; }
7319 template<
typename _Range,
typename _Pred>
7320 concept __can_chunk_by_view
7324 struct _ChunkBy : __adaptor::_RangeAdaptor<_ChunkBy>
7326 template<viewable_range _Range,
typename _Pred>
7327 requires __detail::__can_chunk_by_view<_Range, _Pred>
7329 operator() [[nodiscard]] (_Range&& __r, _Pred&& __pred)
const
7332 using __adaptor::_RangeAdaptor<_ChunkBy>::operator();
7333 static constexpr int _S_arity = 2;
7334 static constexpr bool _S_has_simple_extra_args =
true;
7337 inline constexpr _ChunkBy chunk_by;
7341#ifdef __cpp_lib_ranges_join_with
7344 template<
typename _Range,
typename _Pattern>
7345 concept __compatible_joinable_ranges
7346 = common_with<range_value_t<_Range>, range_value_t<_Pattern>>
7347 && common_reference_with<range_reference_t<_Range>,
7348 range_reference_t<_Pattern>>
7349 && common_reference_with<range_rvalue_reference_t<_Range>,
7350 range_rvalue_reference_t<_Pattern>>;
7352 template<
typename _Range>
7353 concept __bidirectional_common = bidirectional_range<_Range> && common_range<_Range>;
7356 template<input_range _Vp, forward_range _Pattern>
7359 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7360 class join_with_view :
public view_interface<join_with_view<_Vp, _Pattern>>
7362 using _InnerRange = range_reference_t<_Vp>;
7364 _Vp _M_base = _Vp();
7365 [[no_unique_address]]
7366 __detail::__maybe_present_t<!forward_range<_Vp>,
7367 __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_outer_it;
7368 __detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner;
7369 _Pattern _M_pattern = _Pattern();
7371 template<
bool _Const>
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
7372 template<
bool _Const>
using _InnerBase = range_reference_t<_Base<_Const>>;
7373 template<
bool _Const>
using _PatternBase = __detail::__maybe_const_t<_Const, _Pattern>;
7375 template<
bool _Const>
using _OuterIter = iterator_t<_Base<_Const>>;
7376 template<
bool _Const>
using _InnerIter = iterator_t<_InnerBase<_Const>>;
7377 template<
bool _Const>
using _PatternIter = iterator_t<_PatternBase<_Const>>;
7379 template<
bool _Const>
7380 static constexpr bool _S_ref_is_glvalue = is_reference_v<_InnerBase<_Const>>;
7382 template<
bool _Const>
7386 template<
bool _Const>
7387 requires _S_ref_is_glvalue<_Const>
7388 && forward_range<_Base<_Const>>
7389 && forward_range<_InnerBase<_Const>>
7390 struct __iter_cat<_Const>
7396 using _OuterIter = join_with_view::_OuterIter<_Const>;
7397 using _InnerIter = join_with_view::_InnerIter<_Const>;
7398 using _PatternIter = join_with_view::_PatternIter<_Const>;
7399 using _OuterCat =
typename iterator_traits<_OuterIter>::iterator_category;
7400 using _InnerCat =
typename iterator_traits<_InnerIter>::iterator_category;
7401 using _PatternCat =
typename iterator_traits<_PatternIter>::iterator_category;
7404 if constexpr (!is_reference_v<common_reference_t<iter_reference_t<_InnerIter>,
7405 iter_reference_t<_PatternIter>>>)
7406 return input_iterator_tag{};
7407 else if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
7408 && derived_from<_InnerCat, bidirectional_iterator_tag>
7409 && derived_from<_PatternCat, bidirectional_iterator_tag>
7410 && common_range<_InnerBase<_Const>>
7411 && common_range<_PatternBase<_Const>>)
7412 return bidirectional_iterator_tag{};
7413 else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
7414 && derived_from<_InnerCat, forward_iterator_tag>
7415 && derived_from<_PatternCat, forward_iterator_tag>)
7416 return forward_iterator_tag{};
7418 return input_iterator_tag{};
7421 using iterator_category =
decltype(_S_iter_cat());
7424 template<
bool>
class _Iterator;
7425 template<
bool>
class _Sentinel;
7428 join_with_view()
requires (default_initializable<_Vp>
7429 && default_initializable<_Pattern>)
7433 join_with_view(_Vp __base, _Pattern __pattern)
7434 : _M_base(std::move(
__base)), _M_pattern(std::move(__pattern))
7437 template<input_range _Range>
7438 requires constructible_from<_Vp, views::all_t<_Range>>
7439 && constructible_from<_Pattern, single_view<range_value_t<_InnerRange>>>
7441 join_with_view(_Range&& __r, range_value_t<_InnerRange> __e)
7442 : _M_base(views::all(std::
forward<_Range>(__r))),
7443 _M_pattern(views::single(std::move(__e)))
7447 base() const& requires copy_constructible<_Vp>
7457 if constexpr (forward_range<_Vp>)
7459 constexpr bool __use_const = is_reference_v<_InnerRange>
7460 && __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
7461 return _Iterator<__use_const>{*
this, ranges::begin(_M_base)};
7465 _M_outer_it = ranges::begin(_M_base);
7466 return _Iterator<false>{*
this};
7472 requires forward_range<const _Vp>
7473 && forward_range<const _Pattern>
7474 && is_reference_v<range_reference_t<const _Vp>>
7475 && input_range<range_reference_t<const _Vp>>
7476 {
return _Iterator<true>{*
this, ranges::begin(_M_base)}; }
7481 constexpr bool __use_const
7482 = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
7483 if constexpr (is_reference_v<_InnerRange>
7484 && forward_range<_Vp> && common_range<_Vp>
7485 && forward_range<_InnerRange> && common_range<_InnerRange>)
7486 return _Iterator<__use_const>{*
this, ranges::end(_M_base)};
7488 return _Sentinel<__use_const>{*
this};
7493 requires forward_range<const _Vp>
7494 && forward_range<const _Pattern>
7495 && is_reference_v<range_reference_t<const _Vp>>
7496 && input_range<range_reference_t<const _Vp>>
7498 using _InnerConstRange = range_reference_t<const _Vp>;
7499 if constexpr (forward_range<_InnerConstRange>
7500 && common_range<const _Vp>
7501 && common_range<_InnerConstRange>)
7502 return _Iterator<true>{*
this, ranges::end(_M_base)};
7504 return _Sentinel<true>{*
this};
7508 template<
typename _Range,
typename _Pattern>
7509 join_with_view(_Range&&, _Pattern&&)
7510 -> join_with_view<views::all_t<_Range>, views::all_t<_Pattern>>;
7512 template<input_range _Range>
7513 join_with_view(_Range&&, range_value_t<range_reference_t<_Range>>)
7514 -> join_with_view<views::all_t<_Range>,
7517 template<input_range _Vp, forward_range _Pattern>
7520 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7521 template<
bool _Const>
7522 class join_with_view<_Vp, _Pattern>::_Iterator :
public __iter_cat<_Const>
7524 using _Parent = __detail::__maybe_const_t<_Const, join_with_view>;
7525 using _Base = join_with_view::_Base<_Const>;
7526 using _InnerBase = join_with_view::_InnerBase<_Const>;
7527 using _PatternBase = join_with_view::_PatternBase<_Const>;
7529 using _OuterIter = join_with_view::_OuterIter<_Const>;
7530 using _InnerIter = join_with_view::_InnerIter<_Const>;
7531 using _PatternIter = join_with_view::_PatternIter<_Const>;
7533 static constexpr bool _S_ref_is_glvalue = join_with_view::_S_ref_is_glvalue<_Const>;
7535 _Parent* _M_parent =
nullptr;
7536 [[no_unique_address]]
7537 __detail::__maybe_present_t<forward_range<_Base>, _OuterIter> _M_outer_it
7538 =
decltype(_M_outer_it)();
7539 variant<_PatternIter, _InnerIter> _M_inner_it;
7541 constexpr _OuterIter&
7544 if constexpr (forward_range<_Base>)
7547 return *_M_parent->_M_outer_it;
7550 constexpr const _OuterIter&
7551 _M_get_outer()
const
7553 if constexpr (forward_range<_Base>)
7556 return *_M_parent->_M_outer_it;
7560 _Iterator(_Parent& __parent, _OuterIter __outer)
7561 requires forward_range<_Base>
7564 if (_M_get_outer() != ranges::end(_M_parent->_M_base))
7566 auto&& __inner = _M_update_inner();
7567 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7573 _Iterator(_Parent& __parent)
7574 requires (!forward_range<_Base>)
7577 if (_M_get_outer() != ranges::end(_M_parent->_M_base))
7579 auto&& __inner = _M_update_inner();
7580 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7588 _OuterIter& __outer = _M_get_outer();
7589 if constexpr (_S_ref_is_glvalue)
7590 return __detail::__as_lvalue(*__outer);
7592 return _M_parent->_M_inner._M_emplace_deref(__outer);
7598 if constexpr (_S_ref_is_glvalue)
7599 return __detail::__as_lvalue(*_M_get_outer());
7601 return *_M_parent->_M_inner;
7609 if (_M_inner_it.index() == 0)
7611 if (std::get<0>(_M_inner_it) != ranges::end(_M_parent->_M_pattern))
7614 auto&& __inner = _M_update_inner();
7615 _M_inner_it.template emplace<1>(ranges::begin(__inner));
7619 auto&& __inner = _M_get_inner();
7620 if (std::get<1>(_M_inner_it) != ranges::end(__inner))
7623 if (++_M_get_outer() == ranges::end(_M_parent->_M_base))
7625 if constexpr (_S_ref_is_glvalue)
7626 _M_inner_it.template emplace<0>();
7630 _M_inner_it.template emplace<0>(ranges::begin(_M_parent->_M_pattern));
7638 if constexpr (_S_ref_is_glvalue
7639 && bidirectional_range<_Base>
7640 && __detail::__bidirectional_common<_InnerBase>
7641 && __detail::__bidirectional_common<_PatternBase>)
7642 return bidirectional_iterator_tag{};
7643 else if constexpr (_S_ref_is_glvalue
7644 && forward_range<_Base>
7645 && forward_range<_InnerBase>)
7646 return forward_iterator_tag{};
7648 return input_iterator_tag{};
7651 friend join_with_view;
7654 using iterator_concept =
decltype(_S_iter_concept());
7656 using value_type = common_type_t<iter_value_t<_InnerIter>,
7657 iter_value_t<_PatternIter>>;
7658 using difference_type = common_type_t<iter_difference_t<_OuterIter>,
7659 iter_difference_t<_InnerIter>,
7660 iter_difference_t<_PatternIter>>;
7662 _Iterator() =
default;
7665 _Iterator(_Iterator<!_Const> __i)
7667 && convertible_to<iterator_t<_Vp>, _OuterIter>
7668 && convertible_to<iterator_t<_InnerRange>, _InnerIter>
7669 && convertible_to<iterator_t<_Pattern>, _PatternIter>
7670 : _M_parent(__i._M_parent),
7673 if (__i._M_inner_it.index() == 0)
7674 _M_inner_it.template emplace<0>(std::get<0>(
std::move(__i._M_inner_it)));
7676 _M_inner_it.template emplace<1>(std::get<1>(
std::move(__i._M_inner_it)));
7679 constexpr common_reference_t<iter_reference_t<_InnerIter>,
7680 iter_reference_t<_PatternIter>>
7683 if (_M_inner_it.index() == 0)
7684 return *std::get<0>(_M_inner_it);
7686 return *std::get<1>(_M_inner_it);
7689 constexpr _Iterator&
7692 if (_M_inner_it.index() == 0)
7693 ++std::get<0>(_M_inner_it);
7695 ++std::get<1>(_M_inner_it);
7706 requires _S_ref_is_glvalue
7707 && forward_iterator<_OuterIter> && forward_iterator<_InnerIter>
7709 _Iterator __tmp = *
this;
7714 constexpr _Iterator&
7716 requires _S_ref_is_glvalue
7717 && bidirectional_range<_Base>
7718 && __detail::__bidirectional_common<_InnerBase>
7719 && __detail::__bidirectional_common<_PatternBase>
7721 if (_M_outer_it == ranges::end(_M_parent->_M_base))
7723 auto&& __inner = *--_M_outer_it;
7724 _M_inner_it.template emplace<1>(ranges::end(__inner));
7729 if (_M_inner_it.index() == 0)
7731 auto& __it = std::get<0>(_M_inner_it);
7732 if (__it == ranges::begin(_M_parent->_M_pattern))
7734 auto&& __inner = *--_M_outer_it;
7735 _M_inner_it.template emplace<1>(ranges::end(__inner));
7742 auto& __it = std::get<1>(_M_inner_it);
7743 auto&& __inner = *_M_outer_it;
7744 if (__it == ranges::begin(__inner))
7745 _M_inner_it.template emplace<0>(ranges::end(_M_parent->_M_pattern));
7751 if (_M_inner_it.index() == 0)
7752 --std::get<0>(_M_inner_it);
7754 --std::get<1>(_M_inner_it);
7760 requires _S_ref_is_glvalue && bidirectional_range<_Base>
7761 && __detail::__bidirectional_common<_InnerBase>
7762 && __detail::__bidirectional_common<_PatternBase>
7764 _Iterator __tmp = *
this;
7769 friend constexpr bool
7770 operator==(
const _Iterator& __x,
const _Iterator& __y)
7771 requires _S_ref_is_glvalue
7772 && forward_range<_Base> && equality_comparable<_InnerIter>
7773 {
return __x._M_outer_it == __y._M_outer_it && __x._M_inner_it ==__y._M_inner_it; }
7775 friend constexpr common_reference_t<iter_rvalue_reference_t<_InnerIter>,
7776 iter_rvalue_reference_t<_PatternIter>>
7777 iter_move(
const _Iterator& __x)
7779 if (__x._M_inner_it.index() == 0)
7780 return ranges::iter_move(std::get<0>(__x._M_inner_it));
7782 return ranges::iter_move(std::get<1>(__x._M_inner_it));
7785 friend constexpr void
7786 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
7787 requires indirectly_swappable<_InnerIter, _PatternIter>
7789 if (__x._M_inner_it.index() == 0)
7791 if (__y._M_inner_it.index() == 0)
7792 ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
7794 ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
7798 if (__y._M_inner_it.index() == 0)
7799 ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
7801 ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
7806 template<input_range _Vp, forward_range _Pattern>
7809 && __detail::__compatible_joinable_ranges<range_reference_t<_Vp>, _Pattern>
7810 template<
bool _Const>
7811 class join_with_view<_Vp, _Pattern>::_Sentinel
7813 using _Parent = __detail::__maybe_const_t<_Const, join_with_view>;
7814 using _Base = join_with_view::_Base<_Const>;
7816 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
7819 _Sentinel(_Parent& __parent)
7820 : _M_end(ranges::end(__parent._M_base))
7823 friend join_with_view;
7826 _Sentinel() =
default;
7829 _Sentinel(_Sentinel<!_Const> __s)
7830 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
7834 template<
bool _OtherConst>
7835 requires sentinel_for<sentinel_t<_Base>,
7836 iterator_t<__detail::__maybe_const_t<_OtherConst, _Vp>>>
7837 friend constexpr bool
7838 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
7839 {
return __x._M_get_outer() == __y._M_end; }
7846 template<
typename _Range,
typename _Pattern>
7847 concept __can_join_with_view
7851 struct _JoinWith : __adaptor::_RangeAdaptor<_JoinWith>
7853 template<viewable_range _Range,
typename _Pattern>
7854 requires __detail::__can_join_with_view<_Range, _Pattern>
7856 operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f)
const
7861 using _RangeAdaptor<_JoinWith>::operator();
7862 static constexpr int _S_arity = 2;
7863 template<
typename _Pattern>
7864 static constexpr bool _S_has_simple_extra_args
7865 = _LazySplit::_S_has_simple_extra_args<_Pattern>;
7868 inline constexpr _JoinWith join_with;
7872#ifdef __cpp_lib_ranges_repeat
7873 template<move_constructible _Tp, semiregular _Bound = unreachable_sentinel_t>
7874 requires is_object_v<_Tp> && same_as<_Tp, remove_cv_t<_Tp>>
7875 && (__detail::__is_integer_like<_Bound> || same_as<_Bound, unreachable_sentinel_t>)
7876 class repeat_view : public
view_interface<repeat_view<_Tp, _Bound>>
7878 [[no_unique_address]] __detail::__box<_Tp> _M_value;
7879 [[no_unique_address]] _Bound _M_bound = _Bound();
7883 template<
typename _Range>
7884 friend constexpr auto
7885 views::__detail::__take_of_repeat_view(_Range&&, range_difference_t<_Range>);
7887 template<
typename _Range>
7888 friend constexpr auto
7889 views::__detail::__drop_of_repeat_view(_Range&&, range_difference_t<_Range>);
7892 repeat_view()
requires default_initializable<_Tp> = default;
7895 repeat_view(const _Tp& __value, _Bound __bound = _Bound())
7896 requires copy_constructible<_Tp>
7897 : _M_value(__value), _M_bound(__bound)
7899 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7900 __glibcxx_assert(__bound >= 0);
7904 repeat_view(_Tp&& __value, _Bound __bound = _Bound())
7905 : _M_value(std::move(__value)), _M_bound(__bound)
7908 template<
typename... _Args,
typename... _BoundArgs>
7909 requires constructible_from<_Tp, _Args...>
7910 && constructible_from<_Bound, _BoundArgs...>
7912 repeat_view(piecewise_construct_t,
7913 tuple<_Args...> __args,
7914 tuple<_BoundArgs...> __bound_args = tuple<>{})
7915 : _M_value(std::make_from_tuple<_Tp>(std::move(__args))),
7916 _M_bound(std::make_from_tuple<_Bound>(std::move(__bound_args)))
7924 end() const requires (!same_as<_Bound, unreachable_sentinel_t>)
7927 constexpr unreachable_sentinel_t
7928 end() const noexcept
7929 {
return unreachable_sentinel; }
7932 size() const requires (!same_as<_Bound, unreachable_sentinel_t>)
7933 {
return __detail::__to_unsigned_like(_M_bound); }
7938 template<
typename _Tp,
typename _Bound = unreachable_sentinel_t>
7939 repeat_view(_Tp, _Bound = _Bound()) -> repeat_view<_Tp, _Bound>;
7941 template<move_constructible _Tp, semiregular _Bound>
7942 requires is_object_v<_Tp> && same_as<_Tp, remove_cv_t<_Tp>>
7943 && (__detail::__is_integer_like<_Bound> || same_as<_Bound, unreachable_sentinel_t>)
7944 class repeat_view<_Tp, _Bound>::_Iterator
7947 = __conditional_t<same_as<_Bound, unreachable_sentinel_t>, ptrdiff_t, _Bound>;
7949 const _Tp* _M_value =
nullptr;
7950 __index_type _M_current = __index_type();
7953 _Iterator(
const _Tp* __value, __index_type __bound = __index_type())
7954 : _M_value(__value), _M_current(__bound)
7956 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7957 __glibcxx_assert(__bound >= 0);
7963 using iterator_concept = random_access_iterator_tag;
7964 using iterator_category = random_access_iterator_tag;
7965 using value_type = _Tp;
7966 using difference_type = __conditional_t<__detail::__is_signed_integer_like<__index_type>,
7968 __detail::__iota_diff_t<__index_type>>;
7970 _Iterator() =
default;
7972 constexpr const _Tp&
7974 {
return *_M_value; }
7976 constexpr _Iterator&
7991 constexpr _Iterator&
7994 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
7995 __glibcxx_assert(_M_current > 0);
8008 constexpr _Iterator&
8009 operator+=(difference_type __n)
8011 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
8012 __glibcxx_assert(_M_current + __n >= 0);
8017 constexpr _Iterator&
8018 operator-=(difference_type __n)
8020 if constexpr (!same_as<_Bound, unreachable_sentinel_t>)
8021 __glibcxx_assert(_M_current - __n >= 0);
8026 constexpr const _Tp&
8027 operator[](difference_type __n)
const noexcept
8028 {
return *(*
this + __n); }
8030 friend constexpr bool
8031 operator==(
const _Iterator& __x,
const _Iterator& __y)
8032 {
return __x._M_current == __y._M_current; }
8034 friend constexpr auto
8035 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
8036 {
return __x._M_current <=> __y._M_current; }
8038 friend constexpr _Iterator
8039 operator+(_Iterator __i, difference_type __n)
8045 friend constexpr _Iterator
8046 operator+(difference_type __n, _Iterator __i)
8047 {
return __i + __n; }
8049 friend constexpr _Iterator
8050 operator-(_Iterator __i, difference_type __n)
8056 friend constexpr difference_type
8057 operator-(
const _Iterator& __x,
const _Iterator& __y)
8059 return (
static_cast<difference_type
>(__x._M_current)
8060 -
static_cast<difference_type
>(__y._M_current));
8068 template<
typename _Tp,
typename _Bound>
8069 inline constexpr bool __is_repeat_view<repeat_view<_Tp, _Bound>> =
true;
8071 template<
typename _Tp>
8072 concept __can_repeat_view
8075 template<
typename _Tp,
typename _Bound>
8076 concept __can_bounded_repeat_view
8082 template<
typename _Tp>
8083 requires __detail::__can_repeat_view<_Tp>
8085 operator() [[nodiscard]] (_Tp&& __value)
const
8092 template<
typename _Tp,
typename _Bound>
8093 requires __detail::__can_bounded_repeat_view<_Tp, _Bound>
8095 operator() [[nodiscard]] (_Tp&& __value, _Bound __bound)
const
8099 inline constexpr _Repeat repeat;
8103 template<
typename _Range>
8105 __take_of_repeat_view(_Range&& __r, range_difference_t<_Range> __n)
8107 using _Tp = remove_cvref_t<_Range>;
8108 static_assert(__is_repeat_view<_Tp>);
8109 if constexpr (sized_range<_Tp>)
8111 std::min(ranges::distance(__r), __n));
8116 template<
typename _Range>
8118 __drop_of_repeat_view(_Range&& __r, range_difference_t<_Range> __n)
8120 using _Tp = remove_cvref_t<_Range>;
8121 static_assert(__is_repeat_view<_Tp>);
8122 if constexpr (sized_range<_Tp>)
8124 auto __sz = ranges::distance(__r);
8135#ifdef __cpp_lib_ranges_stride
8136 template<input_range _Vp>
8141 range_difference_t<_Vp> _M_stride;
8143 template<
bool _Const>
using _Base = __detail::__maybe_const_t<_Const, _Vp>;
8145 template<
bool _Const>
8149 template<
bool _Const>
8150 requires forward_range<_Base<_Const>>
8151 struct __iter_cat<_Const>
8157 using _Cat =
typename iterator_traits<iterator_t<_Base<_Const>>>::iterator_category;
8158 if constexpr (derived_from<_Cat, random_access_iterator_tag>)
8159 return random_access_iterator_tag{};
8164 using iterator_category =
decltype(_S_iter_cat());
8167 template<
bool>
class _Iterator;
8171 stride_view(_Vp __base, range_difference_t<_Vp> __stride)
8172 : _M_base(std::move(
__base)), _M_stride(__stride)
8173 { __glibcxx_assert(__stride > 0); }
8176 base() const& requires copy_constructible<_Vp>
8183 constexpr range_difference_t<_Vp>
8184 stride() const noexcept
8185 {
return _M_stride; }
8188 begin()
requires (!__detail::__simple_view<_Vp>)
8189 {
return _Iterator<false>(
this, ranges::begin(_M_base)); }
8192 begin() const requires range<const _Vp>
8193 {
return _Iterator<true>(
this, ranges::begin(_M_base)); }
8196 end()
requires (!__detail::__simple_view<_Vp>)
8198 if constexpr (common_range<_Vp> && sized_range<_Vp> && forward_range<_Vp>)
8200 auto __missing = (_M_stride - ranges::distance(_M_base) % _M_stride) % _M_stride;
8201 return _Iterator<false>(
this, ranges::end(_M_base), __missing);
8203 else if constexpr (common_range<_Vp> && !bidirectional_range<_Vp>)
8204 return _Iterator<false>(
this, ranges::end(_M_base));
8210 end() const requires range<const _Vp>
8212 if constexpr (common_range<const _Vp> && sized_range<const _Vp>
8213 && forward_range<const _Vp>)
8215 auto __missing = (_M_stride - ranges::distance(_M_base) % _M_stride) % _M_stride;
8216 return _Iterator<true>(
this, ranges::end(_M_base), __missing);
8218 else if constexpr (common_range<const _Vp> && !bidirectional_range<const _Vp>)
8219 return _Iterator<true>(
this, ranges::end(_M_base));
8225 size()
requires sized_range<_Vp>
8227 return __detail::__to_unsigned_like
8228 (__detail::__div_ceil(ranges::distance(_M_base), _M_stride));
8232 size() const requires sized_range<const _Vp>
8234 return __detail::__to_unsigned_like
8235 (__detail::__div_ceil(ranges::distance(_M_base), _M_stride));
8239 template<
typename _Range>
8240 stride_view(_Range&&, range_difference_t<_Range>) -> stride_view<views::all_t<_Range>>;
8242 template<
typename _Vp>
8243 inline constexpr bool enable_borrowed_range<stride_view<_Vp>>
8244 = enable_borrowed_range<_Vp>;
8246 template<input_range _Vp>
8248 template<
bool _Const>
8249 class stride_view<_Vp>::_Iterator :
public __iter_cat<_Const>
8251 using _Parent = __detail::__maybe_const_t<_Const, stride_view>;
8252 using _Base = stride_view::_Base<_Const>;
8254 iterator_t<_Base> _M_current = iterator_t<_Base>();
8255 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
8256 range_difference_t<_Base> _M_stride = 0;
8257 range_difference_t<_Base> _M_missing = 0;
8260 _Iterator(_Parent* __parent, iterator_t<_Base> __current,
8261 range_difference_t<_Base> __missing = 0)
8262 : _M_current(std::move(__current)), _M_end(ranges::end(__parent->_M_base)),
8263 _M_stride(__parent->_M_stride), _M_missing(__missing)
8269 if constexpr (random_access_range<_Base>)
8270 return random_access_iterator_tag{};
8271 else if constexpr (bidirectional_range<_Base>)
8272 return bidirectional_iterator_tag{};
8273 else if constexpr (forward_range<_Base>)
8274 return forward_iterator_tag{};
8276 return input_iterator_tag{};
8282 using difference_type = range_difference_t<_Base>;
8283 using value_type = range_value_t<_Base>;
8284 using iterator_concept =
decltype(_S_iter_concept());
8287 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
8290 _Iterator(_Iterator<!_Const> __other)
8292 && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
8293 && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
8294 : _M_current(std::move(__other._M_current)), _M_end(std::move(__other._M_end)),
8295 _M_stride(__other._M_stride), _M_missing(__other._M_missing)
8298 constexpr iterator_t<_Base>
8302 constexpr const iterator_t<_Base>&
8303 base() const & noexcept
8304 {
return _M_current; }
8306 constexpr decltype(
auto)
8308 {
return *_M_current; }
8310 constexpr _Iterator&
8313 __glibcxx_assert(_M_current != _M_end);
8314 _M_missing = ranges::advance(_M_current, _M_stride, _M_end);
8323 operator++(
int)
requires forward_range<_Base>
8330 constexpr _Iterator&
8331 operator--()
requires bidirectional_range<_Base>
8333 ranges::advance(_M_current, _M_missing - _M_stride);
8339 operator--(
int)
requires bidirectional_range<_Base>
8346 constexpr _Iterator&
8347 operator+=(difference_type __n)
requires random_access_range<_Base>
8351 __glibcxx_assert(ranges::distance(_M_current, _M_end) > _M_stride * (__n - 1));
8352 _M_missing = ranges::advance(_M_current, _M_stride * __n, _M_end);
8356 ranges::advance(_M_current, _M_stride * __n + _M_missing);
8362 constexpr _Iterator&
8363 operator-=(difference_type __n)
requires random_access_range<_Base>
8364 {
return *
this += -__n; }
8366 constexpr decltype(
auto)
operator[](difference_type __n)
const
8367 requires random_access_range<_Base>
8368 {
return *(*
this + __n); }
8370 friend constexpr bool
8371 operator==(
const _Iterator& __x, default_sentinel_t)
8372 {
return __x._M_current == __x._M_end; }
8374 friend constexpr bool
8375 operator==(
const _Iterator& __x,
const _Iterator& __y)
8376 requires equality_comparable<iterator_t<_Base>>
8377 {
return __x._M_current == __y._M_current; }
8379 friend constexpr bool
8380 operator<(
const _Iterator& __x,
const _Iterator& __y)
8381 requires random_access_range<_Base>
8382 {
return __x._M_current < __y._M_current; }
8384 friend constexpr bool
8385 operator>(
const _Iterator& __x,
const _Iterator& __y)
8386 requires random_access_range<_Base>
8387 {
return __y._M_current < __x._M_current; }
8389 friend constexpr bool
8390 operator<=(
const _Iterator& __x,
const _Iterator& __y)
8391 requires random_access_range<_Base>
8392 {
return !(__y._M_current < __x._M_current); }
8394 friend constexpr bool
8395 operator>=(
const _Iterator& __x,
const _Iterator& __y)
8396 requires random_access_range<_Base>
8397 {
return !(__x._M_current < __y._M_current); }
8399 friend constexpr auto
8400 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
8401 requires random_access_range<_Base> && three_way_comparable<iterator_t<_Base>>
8402 {
return __x._M_current <=> __y._M_current; }
8404 friend constexpr _Iterator
8405 operator+(
const _Iterator& __i, difference_type __n)
8406 requires random_access_range<_Base>
8413 friend constexpr _Iterator
8414 operator+(difference_type __n,
const _Iterator& __i)
8415 requires random_access_range<_Base>
8416 {
return __i + __n; }
8418 friend constexpr _Iterator
8419 operator-(
const _Iterator& __i, difference_type __n)
8420 requires random_access_range<_Base>
8427 friend constexpr difference_type
8428 operator-(
const _Iterator& __x,
const _Iterator& __y)
8429 requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
8431 auto __n = __x._M_current - __y._M_current;
8432 if constexpr (forward_range<_Base>)
8433 return (__n + __x._M_missing - __y._M_missing) / __x._M_stride;
8435 return -__detail::__div_ceil(-__n, __x._M_stride);
8437 return __detail::__div_ceil(__n, __x._M_stride);
8440 friend constexpr difference_type
8441 operator-(default_sentinel_t,
const _Iterator& __x)
8442 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
8443 {
return __detail::__div_ceil(__x._M_end - __x._M_current, __x._M_stride); }
8445 friend constexpr difference_type
8446 operator-(
const _Iterator& __x, default_sentinel_t __y)
8447 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
8448 {
return -(__y - __x); }
8450 friend constexpr range_rvalue_reference_t<_Base>
8451 iter_move(
const _Iterator& __i)
8452 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
8453 {
return ranges::iter_move(__i._M_current); }
8455 friend constexpr void
8456 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
8457 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
8458 requires indirectly_swappable<iterator_t<_Base>>
8459 { ranges::iter_swap(__x._M_current, __y._M_current); }
8466 template<
typename _Range,
typename _Dp>
8467 concept __can_stride_view
8471 struct _Stride : __adaptor::_RangeAdaptor<_Stride>
8473 template<viewable_range _Range,
typename _Dp = range_difference_t<_Range>>
8474 requires __detail::__can_stride_view<_Range, _Dp>
8476 operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n)
const
8479 using __adaptor::_RangeAdaptor<_Stride>::operator();
8480 static constexpr int _S_arity = 2;
8481 static constexpr bool _S_has_simple_extra_args =
true;
8484 inline constexpr _Stride stride;
8488#ifdef __cpp_lib_ranges_cartesian_product
8491 template<
bool _Const,
typename _First,
typename... _Vs>
8492 concept __cartesian_product_is_random_access
8493 = (random_access_range<__maybe_const_t<_Const, _First>>
8495 && (random_access_range<__maybe_const_t<_Const, _Vs>>
8496 && sized_range<__maybe_const_t<_Const, _Vs>>));
8498 template<
typename _Range>
8499 concept __cartesian_product_common_arg
8500 = common_range<_Range> || (sized_range<_Range> && random_access_range<_Range>);
8502 template<
bool _Const,
typename _First,
typename... _Vs>
8503 concept __cartesian_product_is_bidirectional
8504 = (bidirectional_range<__maybe_const_t<_Const, _First>>
8506 && (bidirectional_range<__maybe_const_t<_Const, _Vs>>
8507 && __cartesian_product_common_arg<__maybe_const_t<_Const, _Vs>>));
8509 template<
typename _First,
typename... _Vs>
8510 concept __cartesian_product_is_common = __cartesian_product_common_arg<_First>;
8512 template<
typename... _Vs>
8513 concept __cartesian_product_is_sized = (sized_range<_Vs> && ...);
8515 template<
bool _Const,
template<
typename>
class _FirstSent,
8516 typename _First,
typename... _Vs>
8517 concept __cartesian_is_sized_sentinel
8518 = (sized_sentinel_for<_FirstSent<__maybe_const_t<_Const, _First>>,
8519 iterator_t<__maybe_const_t<_Const, _First>>>
8521 && (sized_range<__maybe_const_t<_Const, _Vs>>
8522 && sized_sentinel_for<iterator_t<__maybe_const_t<_Const, _Vs>>,
8523 iterator_t<__maybe_const_t<_Const, _Vs>>>));
8525 template<__cartesian_product_common_arg _Range>
8527 __cartesian_common_arg_end(_Range& __r)
8529 if constexpr (common_range<_Range>)
8530 return ranges::end(__r);
8532 return ranges::begin(__r) + ranges::distance(__r);
8538 class cartesian_product_view : public
view_interface<cartesian_product_view<_First, _Vs...>>
8540 tuple<_First, _Vs...> _M_bases;
8542 template<
bool>
class _Iterator;
8545 _S_difference_type()
8551 range_difference_t<_First>,
8552 range_difference_t<_Vs>...>{};
8556 cartesian_product_view() =
default;
8559 cartesian_product_view(_First __first, _Vs... __rest)
8560 : _M_bases(std::move(__first), std::move(__rest)...)
8563 constexpr _Iterator<false>
8564 begin()
requires (!__detail::__simple_view<_First> || ... || !__detail::__simple_view<_Vs>)
8565 {
return _Iterator<false>(*
this, __detail::__tuple_transform(ranges::begin, _M_bases)); }
8567 constexpr _Iterator<true>
8568 begin() const requires (
range<const _First> && ... &&
range<const _Vs>)
8569 {
return _Iterator<true>(*
this, __detail::__tuple_transform(ranges::begin, _M_bases)); }
8571 constexpr _Iterator<false>
8572 end()
requires ((!__detail::__simple_view<_First> || ... || !__detail::__simple_view<_Vs>)
8573 && __detail::__cartesian_product_is_common<_First, _Vs...>)
8576 using _Ret = tuple<iterator_t<_First>, iterator_t<_Vs>...>;
8577 bool __empty_tail = (ranges::empty(std::get<1 + _Is>(_M_bases)) || ...);
8578 auto& __first = std::get<0>(_M_bases);
8579 return _Ret{(__empty_tail
8580 ? ranges::begin(__first)
8581 : __detail::__cartesian_common_arg_end(__first)),
8582 ranges::
begin(std::get<1 + _Is>(_M_bases))...};
8585 return _Iterator<false>{*
this,
std::move(__its)};
8588 constexpr _Iterator<true>
8589 end() const requires __detail::__cartesian_product_is_common<const _First, const _Vs...>
8592 using _Ret = tuple<iterator_t<const _First>, iterator_t<const _Vs>...>;
8593 bool __empty_tail = (ranges::empty(std::get<1 + _Is>(_M_bases)) || ...);
8594 auto& __first = std::get<0>(_M_bases);
8595 return _Ret{(__empty_tail
8596 ? ranges::begin(__first)
8597 : __detail::__cartesian_common_arg_end(__first)),
8598 ranges::
begin(std::get<1 + _Is>(_M_bases))...};
8601 return _Iterator<true>{*
this,
std::move(__its)};
8604 constexpr default_sentinel_t
8605 end() const noexcept
8609 size()
requires __detail::__cartesian_product_is_sized<_First, _Vs...>
8611 using _ST = __detail::__make_unsigned_like_t<
decltype(_S_difference_type())>;
8613 auto __size =
static_cast<_ST
>(1);
8614#ifdef _GLIBCXX_ASSERTIONS
8615 if constexpr (integral<_ST>)
8618 = (__builtin_mul_overflow(__size,
8619 static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))),
8622 __glibcxx_assert(!__overflow);
8626 __size = (
static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))) * ...);
8632 size() const requires __detail::__cartesian_product_is_sized<const _First, const _Vs...>
8634 using _ST = __detail::__make_unsigned_like_t<
decltype(_S_difference_type())>;
8636 auto __size =
static_cast<_ST
>(1);
8637#ifdef _GLIBCXX_ASSERTIONS
8638 if constexpr (integral<_ST>)
8641 = (__builtin_mul_overflow(__size,
8642 static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))),
8645 __glibcxx_assert(!__overflow);
8649 __size = (
static_cast<_ST
>(ranges::size(std::get<_Is>(_M_bases))) * ...);
8655 template<
typename... _Vs>
8656 cartesian_product_view(_Vs&&...) -> cartesian_product_view<views::all_t<_Vs>...>;
8660 template<bool _Const>
8661 class cartesian_product_view<_First, _Vs...>::_Iterator
8663 using _Parent = __maybe_const_t<_Const, cartesian_product_view>;
8664 _Parent* _M_parent =
nullptr;
8665 tuple<iterator_t<__maybe_const_t<_Const, _First>>,
8666 iterator_t<__maybe_const_t<_Const, _Vs>>...> _M_current;
8669 _Iterator(_Parent& __parent,
decltype(_M_current) __current)
8671 _M_current(std::move(__current))
8677 if constexpr (__detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>)
8678 return random_access_iterator_tag{};
8679 else if constexpr (__detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>)
8680 return bidirectional_iterator_tag{};
8682 return forward_iterator_tag{};
8684 return input_iterator_tag{};
8687 friend cartesian_product_view;
8690 using iterator_category = input_iterator_tag;
8691 using iterator_concept =
decltype(_S_iter_concept());
8693 = tuple<range_value_t<__maybe_const_t<_Const, _First>>,
8694 range_value_t<__maybe_const_t<_Const, _Vs>>...>;
8696 = tuple<range_reference_t<__maybe_const_t<_Const, _First>>,
8697 range_reference_t<__maybe_const_t<_Const, _Vs>>...>;
8698 using difference_type =
decltype(cartesian_product_view::_S_difference_type());
8700 _Iterator() =
default;
8703 _Iterator(_Iterator<!_Const> __i)
8705 && (convertible_to<iterator_t<_First>, iterator_t<const _First>>
8706 && ... && convertible_to<iterator_t<_Vs>, iterator_t<const _Vs>>)
8708 _M_current(std::move(__i._M_current))
8714 auto __f = [](
auto& __i) ->
decltype(
auto) {
8717 return __detail::__tuple_transform(__f, _M_current);
8720 constexpr _Iterator&
8739 constexpr _Iterator&
8741 requires __detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>
8749 requires __detail::__cartesian_product_is_bidirectional<_Const, _First, _Vs...>
8756 constexpr _Iterator&
8757 operator+=(difference_type __x)
8758 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8764 constexpr _Iterator&
8765 operator-=(difference_type __x)
8766 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8767 {
return *
this += -__x; }
8770 operator[](difference_type __n)
const
8771 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8772 {
return *((*this) + __n); }
8774 friend constexpr bool
8775 operator==(
const _Iterator& __x,
const _Iterator& __y)
8776 requires equality_comparable<iterator_t<__maybe_const_t<_Const, _First>>>
8777 {
return __x._M_current == __y._M_current; }
8779 friend constexpr bool
8780 operator==(
const _Iterator& __x, default_sentinel_t)
8783 return ((std::get<_Is>(__x._M_current)
8784 == ranges::end(std::get<_Is>(__x._M_parent->_M_bases)))
8789 friend constexpr auto
8790 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
8791 requires __detail::__all_random_access<_Const, _First, _Vs...>
8792 {
return __x._M_current <=> __y._M_current; }
8794 friend constexpr _Iterator
8795 operator+(_Iterator __x, difference_type __y)
8796 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8797 {
return __x += __y; }
8799 friend constexpr _Iterator
8800 operator+(difference_type __x, _Iterator __y)
8801 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8802 {
return __y += __x; }
8804 friend constexpr _Iterator
8805 operator-(_Iterator __x, difference_type __y)
8806 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8807 {
return __x -= __y; }
8809 friend constexpr difference_type
8810 operator-(
const _Iterator& __x,
const _Iterator& __y)
8811 requires __detail::__cartesian_is_sized_sentinel<_Const, iterator_t, _First, _Vs...>
8812 {
return __x._M_distance_from(__y._M_current); }
8814 friend constexpr difference_type
8815 operator-(
const _Iterator& __i, default_sentinel_t)
8816 requires __detail::__cartesian_is_sized_sentinel<_Const, sentinel_t, _First, _Vs...>
8819 return tuple{ranges::end(std::get<0>(__i._M_parent->_M_bases)),
8820 ranges::begin(std::get<1 + _Is>(__i._M_parent->_M_bases))...};
8822 return __i._M_distance_from(__end_tuple);
8825 friend constexpr difference_type
8826 operator-(default_sentinel_t,
const _Iterator& __i)
8827 requires __detail::__cartesian_is_sized_sentinel<_Const, sentinel_t, _First, _Vs...>
8830 friend constexpr auto
8831 iter_move(
const _Iterator& __i)
8832 {
return __detail::__tuple_transform(ranges::iter_move, __i._M_current); }
8834 friend constexpr void
8835 iter_swap(
const _Iterator& __l,
const _Iterator& __r)
8836 requires (indirectly_swappable<iterator_t<__maybe_const_t<_Const, _First>>>
8838 && indirectly_swappable<iterator_t<__maybe_const_t<_Const, _Vs>>>)
8841 (ranges::iter_swap(std::get<_Is>(__l._M_current), std::get<_Is>(__r._M_current)), ...);
8846 template<
size_t _Nm =
sizeof...(_Vs)>
8850 auto& __it = std::get<_Nm>(_M_current);
8852 if constexpr (_Nm > 0)
8853 if (__it == ranges::end(std::get<_Nm>(_M_parent->_M_bases)))
8855 __it = ranges::begin(std::get<_Nm>(_M_parent->_M_bases));
8860 template<
size_t _Nm =
sizeof...(_Vs)>
8864 auto& __it = std::get<_Nm>(_M_current);
8865 if constexpr (_Nm > 0)
8866 if (__it == ranges::begin(std::get<_Nm>(_M_parent->_M_bases)))
8868 __it = __detail::__cartesian_common_arg_end(std::get<_Nm>(_M_parent->_M_bases));
8874 template<
size_t _Nm =
sizeof...(_Vs)>
8876 _M_advance(difference_type __x)
8877 requires __detail::__cartesian_product_is_random_access<_Const, _First, _Vs...>
8886 auto& __r = std::get<_Nm>(_M_parent->_M_bases);
8887 auto& __it = std::get<_Nm>(_M_current);
8888 if constexpr (_Nm == 0)
8890#ifdef _GLIBCXX_ASSERTIONS
8893 auto __size = ranges::ssize(__r);
8894 auto __begin = ranges::begin(__r);
8895 auto __offset = __it - __begin;
8896 __glibcxx_assert(__offset + __x >= 0 && __offset + __x <= __size);
8903 auto __size = ranges::ssize(__r);
8904 auto __begin = ranges::begin(__r);
8905 auto __offset = __it - __begin;
8907 __x = __offset / __size;
8911 __offset = __size + __offset;
8914 __it = __begin + __offset;
8915 _M_advance<_Nm - 1>(__x);
8920 template<
typename _Tuple>
8921 constexpr difference_type
8922 _M_distance_from(
const _Tuple& __t)
const
8925 auto __sum =
static_cast<difference_type
>(0);
8926#ifdef _GLIBCXX_ASSERTIONS
8927 if constexpr (integral<difference_type>)
8930 = (__builtin_add_overflow(__sum, _M_scaled_distance<_Is>(__t), &__sum)
8932 __glibcxx_assert(!__overflow);
8936 __sum = (_M_scaled_distance<_Is>(__t) + ...);
8941 template<
size_t _Nm,
typename _Tuple>
8942 constexpr difference_type
8943 _M_scaled_distance(
const _Tuple& __t)
const
8945 auto __dist =
static_cast<difference_type
>(std::get<_Nm>(_M_current)
8946 - std::get<_Nm>(__t));
8947#ifdef _GLIBCXX_ASSERTIONS
8948 if constexpr (integral<difference_type>)
8950 bool __overflow = __builtin_mul_overflow(__dist, _M_scaled_size<_Nm+1>(), &__dist);
8951 __glibcxx_assert(!__overflow);
8955 __dist *= _M_scaled_size<_Nm+1>();
8959 template<
size_t _Nm>
8960 constexpr difference_type
8961 _M_scaled_size()
const
8963 if constexpr (_Nm <=
sizeof...(_Vs))
8965 auto __size =
static_cast<difference_type
>(ranges::size
8966 (std::get<_Nm>(_M_parent->_M_bases)));
8967#ifdef _GLIBCXX_ASSERTIONS
8968 if constexpr (integral<difference_type>)
8970 bool __overflow = __builtin_mul_overflow(__size, _M_scaled_size<_Nm+1>(), &__size);
8971 __glibcxx_assert(!__overflow);
8975 __size *= _M_scaled_size<_Nm+1>();
8979 return static_cast<difference_type
>(1);
8987 template<
typename... _Ts>
8988 concept __can_cartesian_product_view
8992 struct _CartesianProduct
8994 template<
typename... _Ts>
8995 requires (
sizeof...(_Ts) == 0 || __detail::__can_cartesian_product_view<_Ts...>)
8997 operator() [[nodiscard]] (_Ts&&... __ts)
const
8999 if constexpr (
sizeof...(_Ts) == 0)
9000 return views::single(tuple{});
9006 inline constexpr _CartesianProduct cartesian_product;
9010#ifdef __cpp_lib_ranges_as_rvalue
9011 template<input_range _Vp>
9013 class as_rvalue_view :
public view_interface<as_rvalue_view<_Vp>>
9015 _Vp _M_base = _Vp();
9018 as_rvalue_view()
requires default_initializable<_Vp> = default;
9021 as_rvalue_view(_Vp __base)
9022 : _M_base(std::move(__base))
9026 base() const& requires copy_constructible<_Vp>
9034 begin()
requires (!__detail::__simple_view<_Vp>)
9035 {
return move_iterator(ranges::begin(_M_base)); }
9038 begin() const requires range<const _Vp>
9039 {
return move_iterator(ranges::begin(_M_base)); }
9042 end()
requires (!__detail::__simple_view<_Vp>)
9044 if constexpr (common_range<_Vp>)
9045 return move_iterator(ranges::end(_M_base));
9047 return move_sentinel(ranges::end(_M_base));
9051 end() const requires range<const _Vp>
9053 if constexpr (common_range<const _Vp>)
9054 return move_iterator(ranges::end(_M_base));
9056 return move_sentinel(ranges::end(_M_base));
9060 size()
requires sized_range<_Vp>
9061 {
return ranges::size(_M_base); }
9064 size() const requires sized_range<const _Vp>
9065 {
return ranges::size(_M_base); }
9068 template<
typename _Range>
9069 as_rvalue_view(_Range&&) -> as_rvalue_view<views::all_t<_Range>>;
9071 template<
typename _Tp>
9072 inline constexpr bool enable_borrowed_range<as_rvalue_view<_Tp>>
9073 = enable_borrowed_range<_Tp>;
9079 template<
typename _Tp>
9080 concept __can_as_rvalue_view =
requires { as_rvalue_view(
std::declval<_Tp>()); };
9083 struct _AsRvalue : __adaptor::_RangeAdaptorClosure<_AsRvalue>
9085 template<viewable_range _Range>
9086 requires __detail::__can_as_rvalue_view<_Range>
9088 operator() [[nodiscard]] (_Range&& __r)
const
9090 if constexpr (same_as<range_rvalue_reference_t<_Range>,
9091 range_reference_t<_Range>>)
9098 inline constexpr _AsRvalue as_rvalue;
9102#ifdef __cpp_lib_ranges_enumerate
9105 template<
typename _Range>
9106 concept __range_with_movable_reference = input_range<_Range>
9107 && move_constructible<range_reference_t<_Range>>
9108 && move_constructible<range_rvalue_reference_t<_Range>>;
9112 requires __detail::__range_with_movable_reference<_Vp>
9113 class enumerate_view :
public view_interface<enumerate_view<_Vp>>
9115 _Vp _M_base = _Vp();
9117 template<
bool _Const>
class _Iterator;
9118 template<
bool _Const>
class _Sentinel;
9121 enumerate_view()
requires default_initializable<_Vp> = default;
9124 enumerate_view(_Vp __base)
9125 : _M_base(std::move(__base))
9129 begin()
requires (!__detail::__simple_view<_Vp>)
9130 {
return _Iterator<false>(ranges::begin(_M_base), 0); }
9133 begin() const requires __detail::__range_with_movable_reference<const _Vp>
9134 {
return _Iterator<true>(ranges::begin(_M_base), 0); }
9137 end()
requires (!__detail::__simple_view<_Vp>)
9139 if constexpr (common_range<_Vp> && sized_range<_Vp>)
9140 return _Iterator<false>(ranges::end(_M_base), ranges::distance(_M_base));
9142 return _Sentinel<false>(ranges::end(_M_base));
9146 end() const requires __detail::__range_with_movable_reference<const _Vp>
9148 if constexpr (common_range<const _Vp> && sized_range<const _Vp>)
9149 return _Iterator<true>(ranges::end(_M_base), ranges::distance(_M_base));
9151 return _Sentinel<true>(ranges::end(_M_base));
9155 size()
requires sized_range<_Vp>
9156 {
return ranges::size(_M_base); }
9159 size() const requires sized_range<const _Vp>
9160 {
return ranges::size(_M_base); }
9163 base() const & requires copy_constructible<_Vp>
9171 template<
typename _Range>
9172 enumerate_view(_Range&&) -> enumerate_view<views::all_t<_Range>>;
9174 template<
typename _Tp>
9175 inline constexpr bool enable_borrowed_range<enumerate_view<_Tp>>
9176 = enable_borrowed_range<_Tp>;
9179 requires __detail::__range_with_movable_reference<_Vp>
9180 template<
bool _Const>
9181 class enumerate_view<_Vp>::_Iterator
9183 using _Base = __maybe_const_t<_Const, _Vp>;
9188 if constexpr (random_access_range<_Base>)
9189 return random_access_iterator_tag{};
9190 else if constexpr (bidirectional_range<_Base>)
9191 return bidirectional_iterator_tag{};
9192 else if constexpr (forward_range<_Base>)
9193 return forward_iterator_tag{};
9195 return input_iterator_tag{};
9198 friend enumerate_view;
9201 using iterator_category = input_iterator_tag;
9202 using iterator_concept =
decltype(_S_iter_concept());
9203 using difference_type = range_difference_t<_Base>;
9204 using value_type = tuple<difference_type, range_value_t<_Base>>;
9207 using __reference_type = tuple<difference_type, range_reference_t<_Base>>;
9209 iterator_t<_Base> _M_current = iterator_t<_Base>();
9210 difference_type _M_pos = 0;
9213 _Iterator(iterator_t<_Base> __current, difference_type __pos)
9214 : _M_current(std::move(__current)), _M_pos(__pos)
9218 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
9221 _Iterator(_Iterator<!_Const> __i)
9222 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
9223 : _M_current(std::move(__i._M_current)), _M_pos(__i._M_pos)
9226 constexpr const iterator_t<_Base> &
9227 base() const & noexcept
9228 {
return _M_current; }
9230 constexpr iterator_t<_Base>
9234 constexpr difference_type
9235 index() const noexcept
9240 {
return __reference_type(_M_pos, *_M_current); }
9242 constexpr _Iterator&
9255 operator++(
int)
requires forward_range<_Base>
9262 constexpr _Iterator&
9263 operator--()
requires bidirectional_range<_Base>
9271 operator--(
int)
requires bidirectional_range<_Base>
9278 constexpr _Iterator&
9279 operator+=(difference_type __n)
requires random_access_range<_Base>
9286 constexpr _Iterator&
9287 operator-=(difference_type __n)
requires random_access_range<_Base>
9295 operator[](difference_type __n)
const requires random_access_range<_Base>
9296 {
return __reference_type(_M_pos + __n, _M_current[__n]); }
9298 friend constexpr bool
9299 operator==(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9300 {
return __x._M_pos == __y._M_pos; }
9302 friend constexpr strong_ordering
9303 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9304 {
return __x._M_pos <=> __y._M_pos; }
9306 friend constexpr _Iterator
9307 operator+(
const _Iterator& __x, difference_type __y)
9308 requires random_access_range<_Base>
9309 {
return (
auto(__x) += __y); }
9311 friend constexpr _Iterator
9312 operator+(difference_type __x,
const _Iterator& __y)
9313 requires random_access_range<_Base>
9314 {
return auto(__y) += __x; }
9316 friend constexpr _Iterator
9317 operator-(
const _Iterator& __x, difference_type __y)
9318 requires random_access_range<_Base>
9319 {
return auto(__x) -= __y; }
9321 friend constexpr difference_type
9322 operator-(
const _Iterator& __x,
const _Iterator& __y)
noexcept
9323 {
return __x._M_pos - __y._M_pos; }
9325 friend constexpr auto
9326 iter_move(
const _Iterator& __i)
9327 noexcept(
noexcept(ranges::iter_move(__i._M_current))
9328 && is_nothrow_move_constructible_v<range_rvalue_reference_t<_Base>>)
9330 return tuple<difference_type, range_rvalue_reference_t<_Base>>
9331 (__i._M_pos, ranges::iter_move(__i._M_current));
9336 requires __detail::__range_with_movable_reference<_Vp>
9337 template<
bool _Const>
9338 class enumerate_view<_Vp>::_Sentinel
9340 using _Base = __maybe_const_t<_Const, _Vp>;
9342 sentinel_t<_Base> _M_end = sentinel_t<_Base>();
9345 _Sentinel(sentinel_t<_Base> __end)
9346 : _M_end(std::move(__end))
9349 friend enumerate_view;
9352 _Sentinel() =
default;
9355 _Sentinel(_Sentinel<!_Const> __other)
9356 requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
9360 constexpr sentinel_t<_Base>
9364 template<
bool _OtherConst>
9365 requires sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9366 friend constexpr bool
9367 operator==(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
9368 {
return __x._M_current == __y._M_end; }
9370 template<
bool _OtherConst>
9371 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9372 friend constexpr range_difference_t<__maybe_const_t<_OtherConst, _Vp>>
9373 operator-(
const _Iterator<_OtherConst>& __x,
const _Sentinel& __y)
9374 {
return __x._M_current - __y._M_end; }
9376 template<
bool _OtherConst>
9377 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const_t<_OtherConst, _Vp>>>
9378 friend constexpr range_difference_t<__maybe_const_t<_OtherConst, _Vp>>
9379 operator-(
const _Sentinel& __x,
const _Iterator<_OtherConst>& __y)
9380 {
return __x._M_end - __y._M_current; }
9387 template<
typename _Tp>
9388 concept __can_enumerate_view
9392 struct _Enumerate : __adaptor::_RangeAdaptorClosure<_Enumerate>
9394 template<viewable_range _Range>
9395 requires __detail::__can_enumerate_view<_Range>
9397 operator() [[nodiscard]] (_Range&& __r)
const
9401 inline constexpr _Enumerate enumerate;
9405#ifdef __cpp_lib_ranges_as_const
9410 _Vp _M_base = _Vp();
9413 as_const_view()
requires default_initializable<_Vp> = default;
9416 as_const_view(_Vp __base)
9417 noexcept(is_nothrow_move_constructible_v<_Vp>)
9418 : _M_base(std::move(__base))
9423 noexcept(is_nothrow_copy_constructible_v<_Vp>)
9424 requires copy_constructible<_Vp>
9429 noexcept(is_nothrow_move_constructible_v<_Vp>)
9433 begin()
requires (!__detail::__simple_view<_Vp>)
9434 {
return ranges::cbegin(_M_base); }
9437 begin() const requires range<const _Vp>
9438 {
return ranges::cbegin(_M_base); }
9441 end()
requires (!__detail::__simple_view<_Vp>)
9442 {
return ranges::cend(_M_base); }
9445 end() const requires range<const _Vp>
9446 {
return ranges::cend(_M_base); }
9449 size()
requires sized_range<_Vp>
9450 {
return ranges::size(_M_base); }
9453 size() const requires sized_range<const _Vp>
9454 {
return ranges::size(_M_base); }
9457 template<
typename _Range>
9458 as_const_view(_Range&&) -> as_const_view<views::all_t<_Range>>;
9460 template<
typename _Tp>
9461 inline constexpr bool enable_borrowed_range<as_const_view<_Tp>>
9462 = enable_borrowed_range<_Tp>;
9468 template<
typename _Tp>
9469 inline constexpr bool __is_constable_ref_view =
false;
9471 template<
typename _Range>
9472 inline constexpr bool __is_constable_ref_view<ref_view<_Range>>
9473 = constant_range<const _Range>;
9475 template<
typename _Range>
9479 struct _AsConst : __adaptor::_RangeAdaptorClosure<_AsConst>
9481 template<viewable_range _Range>
9483 operator()(_Range&& __r)
const
9485 requires __detail::__can_as_const_view<_Range>
9487 using _Tp = remove_cvref_t<_Range>;
9488 using element_type = remove_reference_t<range_reference_t<_Range>>;
9489 if constexpr (constant_range<views::all_t<_Range>>)
9491 else if constexpr (__detail::__is_empty_view<_Tp>)
9492 return views::empty<const element_type>;
9493#if __cpp_lib_optional >= 202506L && __cpp_lib_optional_range_support
9494 else if constexpr (__is_optional_ref_v<_Tp>)
9495 return optional<const typename _Tp::value_type&>(__r);
9497 else if constexpr (std::__detail::__is_span<_Tp>)
9499 else if constexpr (__detail::__is_constable_ref_view<_Tp>)
9501 else if constexpr (is_lvalue_reference_v<_Range>
9502 && constant_range<const _Tp>
9504 return ref_view(
static_cast<const _Tp&
>(__r));
9510 inline constexpr _AsConst as_const;
9515 namespace views = ranges::views;
9517#if __cpp_lib_ranges_to_container
9523 template<
typename _Container>
9524 constexpr bool __reservable_container
9525 = sized_range<_Container>
9526 &&
requires(_Container& __c, range_size_t<_Container> __n) {
9528 { __c.capacity() } -> same_as<
decltype(__n)>;
9529 { __c.max_size() } -> same_as<
decltype(__n)>;
9532 template<
typename _Cont,
typename _Range>
9533 constexpr bool __toable =
requires {
9534 requires (!input_range<_Cont>
9535 || convertible_to<range_reference_t<_Range>,
9536 range_value_t<_Cont>>);
9557 template<
typename _Cont, input_range _Rg,
typename... _Args>
9558 requires (!view<_Cont>)
9560 to [[nodiscard]] (_Rg&& __r, _Args&&... __args)
9562 static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
9563 static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
9565 if constexpr (__detail::__toable<_Cont, _Rg>)
9567 if constexpr (constructible_from<_Cont, _Rg, _Args...>)
9570 else if constexpr (constructible_from<_Cont, from_range_t, _Rg, _Args...>)
9573 else if constexpr (
requires {
requires common_range<_Rg>;
9574 typename __iter_category_t<iterator_t<_Rg>>;
9575 requires derived_from<__iter_category_t<iterator_t<_Rg>>,
9576 input_iterator_tag>;
9577 requires constructible_from<_Cont, iterator_t<_Rg>,
9578 sentinel_t<_Rg>, _Args...>;
9580 return _Cont(ranges::begin(__r), ranges::end(__r),
9584 static_assert(constructible_from<_Cont, _Args...>);
9586 if constexpr (sized_range<_Rg>
9587 && __detail::__reservable_container<_Cont>)
9588 __c.reserve(
static_cast<range_size_t<_Cont>
>(ranges::size(__r)));
9592 auto __it = ranges::begin(__r);
9593 const auto __sent = ranges::end(__r);
9594 while (__it != __sent)
9596 if constexpr (
requires { __c.emplace_back(*__it); })
9597 __c.emplace_back(*__it);
9598 else if constexpr (
requires { __c.push_back(*__it); })
9599 __c.push_back(*__it);
9600 else if constexpr (
requires { __c.emplace(__c.end(), *__it); })
9601 __c.emplace(__c.end(), *__it);
9603 __c.insert(__c.end(), *__it);
9611 static_assert(input_range<range_reference_t<_Rg>>);
9614 return ranges::to<_Cont>(ref_view(__r) | views::transform(
9615 []<
typename _Elt>(_Elt&& __elem) {
9616 using _ValT = range_value_t<_Cont>;
9625 template<
typename _Rg>
9628 using iterator_category = input_iterator_tag;
9629 using value_type = range_value_t<_Rg>;
9630 using difference_type = ptrdiff_t;
9631 using pointer = add_pointer_t<range_reference_t<_Rg>>;
9632 using reference = range_reference_t<_Rg>;
9634 pointer operator->()
const;
9635 _InputIter& operator++();
9636 _InputIter operator++(
int);
9637 bool operator==(
const _InputIter&)
const;
9640 template<
template<
typename...>
typename _Cont, input_range _Rg,
9645 template<
template<
typename...>
typename _Cont, input_range _Rg,
9651 template<
template<
typename...>
typename _Cont, input_range _Rg,
9661 template<
template<
typename...>
typename _Cont, input_range _Rg,
9664 to [[nodiscard]] (_Rg&& __r, _Args&&... __args)
9666 using __detail::_DeduceExpr1;
9667 using __detail::_DeduceExpr2;
9668 using __detail::_DeduceExpr3;
9669 if constexpr (
requires {
typename _DeduceExpr1<_Cont, _Rg, _Args...>; })
9670 return ranges::to<_DeduceExpr1<_Cont, _Rg, _Args...>>(
9672 else if constexpr (
requires {
typename _DeduceExpr2<_Cont, _Rg, _Args...>; })
9673 return ranges::to<_DeduceExpr2<_Cont, _Rg, _Args...>>(
9675 else if constexpr (
requires {
typename _DeduceExpr3<_Cont, _Rg, _Args...>; })
9676 return ranges::to<_DeduceExpr3<_Cont, _Rg, _Args...>>(
9679 static_assert(
false);
9685 template<
typename _Cont>
9688 template<
typename _Range,
typename... _Args>
9692 operator()(_Range&& __r, _Args&&... __args)
const
9716 template<
typename _Cont,
typename... _Args>
9717 requires (!view<_Cont>)
9719 to [[nodiscard]] (_Args&&... __args)
9721 static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
9722 static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
9724 using __detail::_To;
9725 using views::__adaptor::_Partial;
9732 template<
template<
typename...>
typename _Cont>
9735 template<
typename _Range,
typename... _Args>
9739 operator()(_Range&& __r, _Args&&... __args)
const
9765 template<
template<
typename...>
typename _Cont,
typename... _Args>
9767 to [[nodiscard]] (_Args&&... __args)
9769 using __detail::_To2;
9770 using views::__adaptor::_Partial;
9777#if __cpp_lib_ranges_concat
9782 template<
typename... _Rs>
9783 using __concat_reference_t = common_reference_t<range_reference_t<_Rs>...>;
9785 template<
typename... _Rs>
9786 using __concat_value_t = common_type_t<range_value_t<_Rs>...>;
9788 template<
typename... _Rs>
9789 using __concat_rvalue_reference_t
9790 = common_reference_t<range_rvalue_reference_t<_Rs>...>;
9792 template<
typename _Ref,
typename _RRef,
typename _It>
9793 concept __concat_indirectly_readable_impl =
requires(
const _It __it) {
9794 { *__it } -> convertible_to<_Ref>;
9795 { ranges::iter_move(__it) } -> convertible_to<_RRef>;
9798 template<
typename... _Rs>
9799 concept __concat_indirectly_readable
9800 = common_reference_with<__concat_reference_t<_Rs...>&&, __concat_value_t<_Rs...>&>
9801 && common_reference_with<__concat_reference_t<_Rs...>&&,
9802 __concat_rvalue_reference_t<_Rs...>&&>
9803 && common_reference_with<__concat_rvalue_reference_t<_Rs...>&&,
9804 __concat_value_t<_Rs...>
const&>
9805 && (__concat_indirectly_readable_impl<__concat_reference_t<_Rs...>,
9806 __concat_rvalue_reference_t<_Rs...>,
9810 template<
typename... _Rs>
9811 concept __concatable =
requires {
9812 typename __concat_reference_t<_Rs...>;
9813 typename __concat_value_t<_Rs...>;
9814 typename __concat_rvalue_reference_t<_Rs...>;
9815 } && __concat_indirectly_readable<_Rs...>;
9817 template<
bool _Const,
typename _Range,
typename... _Rs>
9818 struct __all_but_last_common
9820 static inline constexpr bool value
9821 =
requires {
requires (common_range<__maybe_const_t<_Const, _Range>>
9822 && __all_but_last_common<_Const, _Rs...>::value); };
9825 template<
bool _Const,
typename _Range>
9826 struct __all_but_last_common<_Const, _Range>
9827 {
static inline constexpr bool value =
true; };
9829 template<
bool _Const,
typename... _Rs>
9830 concept __concat_is_random_access = __all_random_access<_Const, _Rs...>
9831 && __all_but_last_common<_Const, _Rs...>::value;
9833 template<
bool _Const,
typename... _Rs>
9834 concept __concat_is_bidirectional = __all_bidirectional<_Const, _Rs...>
9835 && __all_but_last_common<_Const, _Rs...>::value;
9837 template<
typename _Range,
typename... _Rs>
9838 struct __all_but_first_sized
9839 {
static inline constexpr bool value = (sized_range<_Rs> && ...); };
9842 template<input_range... _Vs>
9843 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && __detail::__concatable<_Vs...>
9844 class concat_view : public view_interface<concat_view<_Vs...>>
9846 tuple<_Vs...> _M_views;
9848 template<
bool _Const>
class _Iterator;
9851 constexpr concat_view() =
default;
9854 concat_view(_Vs... __views)
9855 : _M_views(std::move(__views)...)
9858 constexpr _Iterator<false>
9859 begin()
requires (!(__detail::__simple_view<_Vs> && ...))
9861 _Iterator<false> __it(
this, in_place_index<0>, ranges::begin(std::get<0>(_M_views)));
9862 __it.template _M_satisfy<0>();
9866 constexpr _Iterator<true>
9867 begin() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
9869 _Iterator<true> __it(
this, in_place_index<0>, ranges::begin(std::get<0>(_M_views)));
9870 __it.template _M_satisfy<0>();
9875 end()
requires (!(__detail::__simple_view<_Vs> && ...))
9877 constexpr auto __n =
sizeof...(_Vs);
9878 if constexpr (__detail::__all_forward<
false, _Vs...>
9879 && common_range<_Vs...[__n - 1]>)
9880 return _Iterator<false>(
this, in_place_index<__n - 1>,
9881 ranges::end(std::get<__n - 1>(_M_views)));
9887 end() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
9889 constexpr auto __n =
sizeof...(_Vs);
9890 if constexpr (__detail::__all_forward<
true, _Vs...>
9891 && common_range<
const _Vs...[__n - 1]>)
9892 return _Iterator<true>(
this, in_place_index<__n - 1>,
9893 ranges::end(std::get<__n - 1>(_M_views)));
9899 size()
requires (sized_range<_Vs>&&...)
9901 return std::apply([](
auto... __sizes) {
9902 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(__sizes)...>>;
9903 return (_CT(__sizes) + ...);
9904 }, __detail::__tuple_transform(ranges::size, _M_views));
9908 size() const requires (sized_range<const _Vs>&&...)
9910 return std::apply([](
auto... __sizes) {
9911 using _CT = __detail::__make_unsigned_like_t<
common_type_t<
decltype(__sizes)...>>;
9912 return (_CT(__sizes) + ...);
9913 }, __detail::__tuple_transform(ranges::size, _M_views));
9917 template<
typename... _Rs>
9918 concat_view(_Rs&&...) -> concat_view<views::all_t<_Rs>...>;
9922 template<
bool _Const,
typename... _Vs>
9923 struct __concat_view_iter_cat
9926 template<
bool _Const,
typename... _Vs>
9927 requires __detail::__all_forward<_Const, _Vs...>
9928 struct __concat_view_iter_cat<_Const, _Vs...>
9933 if constexpr (!is_reference_v<__concat_reference_t<__maybe_const_t<_Const, _Vs>...>>)
9934 return input_iterator_tag{};
9936 return []<
typename... _Cats>(_Cats... __cats) {
9937 if constexpr ((derived_from<_Cats, random_access_iterator_tag> && ...)
9938 && __concat_is_random_access<_Const, _Vs...>)
9939 return random_access_iterator_tag{};
9940 else if constexpr ((derived_from<_Cats, bidirectional_iterator_tag> && ...)
9941 && __concat_is_bidirectional<_Const, _Vs...>)
9942 return bidirectional_iterator_tag{};
9943 else if constexpr ((derived_from<_Cats, forward_iterator_tag> && ...))
9944 return forward_iterator_tag{};
9946 return input_iterator_tag{};
9947 }(
typename iterator_traits<iterator_t<__maybe_const_t<_Const, _Vs>>>
9948 ::iterator_category{}...);
9953 template<input_range... _Vs>
9954 requires (view<_Vs> && ...) && (
sizeof...(_Vs) > 0) && __detail::__concatable<_Vs...>
9955 template<bool _Const>
9956 class concat_view<_Vs...>::_Iterator
9957 : public __detail::__concat_view_iter_cat<_Const, _Vs...>
9962 if constexpr (__detail::__concat_is_random_access<_Const, _Vs...>)
9963 return random_access_iterator_tag{};
9964 else if constexpr (__detail::__concat_is_bidirectional<_Const, _Vs...>)
9965 return bidirectional_iterator_tag{};
9966 else if constexpr (__detail::__all_forward<_Const, _Vs...>)
9967 return forward_iterator_tag{};
9969 return input_iterator_tag{};
9973 friend _Iterator<!_Const>;
9977 using iterator_concept =
decltype(_S_iter_concept());
9978 using value_type = __detail::__concat_value_t<__maybe_const_t<_Const, _Vs>...>;
9979 using difference_type = common_type_t<range_difference_t<__maybe_const_t<_Const, _Vs>>...>;
9982 using __base_iter = variant<iterator_t<__maybe_const_t<_Const, _Vs>>...>;
9984 __maybe_const_t<_Const, concat_view>* _M_parent =
nullptr;
9987 template<
size_t _Nm>
9991 if constexpr (_Nm < (
sizeof...(_Vs) - 1))
9993 if (std::get<_Nm>(_M_it) == ranges::end(std::get<_Nm>(_M_parent->_M_views)))
9995 _M_it.template emplace<_Nm + 1>(ranges::begin
9996 (std::get<_Nm + 1>(_M_parent->_M_views)));
9997 _M_satisfy<_Nm + 1>();
10002 template<
size_t _Nm>
10006 if constexpr (_Nm == 0)
10007 --std::get<0>(_M_it);
10010 if (std::get<_Nm>(_M_it) == ranges::begin(std::get<_Nm>(_M_parent->_M_views)))
10012 _M_it.template emplace<_Nm - 1>(ranges::end
10013 (std::get<_Nm - 1>(_M_parent->_M_views)));
10014 _M_prev<_Nm - 1>();
10017 --std::get<_Nm>(_M_it);
10021 template<
size_t _Nm>
10023 _M_advance_fwd(difference_type __offset, difference_type __steps)
10025 using _Dt = iter_difference_t<variant_alternative_t<_Nm, __base_iter>>;
10026 if constexpr (_Nm ==
sizeof...(_Vs) - 1)
10027 std::get<_Nm>(_M_it) +=
static_cast<_Dt
>(__steps);
10030 auto __n_size = ranges::distance(std::get<_Nm>(_M_parent->_M_views));
10031 if (__offset + __steps < __n_size)
10032 std::get<_Nm>(_M_it) +=
static_cast<_Dt
>(__steps);
10035 _M_it.template emplace<_Nm + 1>(ranges::begin
10036 (std::get<_Nm + 1>(_M_parent->_M_views)));
10037 _M_advance_fwd<_Nm + 1>(0, __offset + __steps - __n_size);
10042 template<
size_t _Nm>
10044 _M_advance_bwd(difference_type __offset, difference_type __steps)
10046 using _Dt = iter_difference_t<variant_alternative_t<_Nm, __base_iter>>;
10047 if constexpr (_Nm == 0)
10048 std::get<_Nm>(_M_it) -=
static_cast<_Dt
>(__steps);
10050 if (__offset >= __steps)
10051 std::get<_Nm>(_M_it) -=
static_cast<_Dt
>(__steps);
10054 auto __prev_size = ranges::distance(std::get<_Nm - 1>(_M_parent->_M_views));
10055 _M_it.template emplace<_Nm - 1>(ranges::end
10056 (std::get<_Nm - 1>(_M_parent->_M_views)));
10057 _M_advance_bwd<_Nm - 1>(__prev_size, __steps - __offset);
10065 template<
typename _Fp>
10066 static constexpr auto
10067 _S_invoke_with_runtime_index(_Fp&& __f,
size_t __index)
10069 return [&__f, __index]<
size_t _Idx>(
this auto&& __self) {
10070 if (_Idx == __index)
10071 return __f.template operator()<_Idx>();
10072 if constexpr (_Idx + 1 <
sizeof...(_Vs))
10073 return __self.template
operator()<_Idx + 1>();
10074 __builtin_unreachable();
10075 }.template operator()<0>();
10078 template<
typename _Fp>
10080 _M_invoke_with_runtime_index(_Fp&& __f)
10081 {
return _S_invoke_with_runtime_index(
std::forward<_Fp>(__f), _M_it.index()); }
10083 template<
typename... _Args>
10085 _Iterator(__maybe_const_t<_Const, concat_view>* __parent, _Args&&... __args)
10086 requires constructible_from<__base_iter, _Args&&...>
10091 _Iterator() =
default;
10094 _Iterator(_Iterator<!_Const> __it)
10095 requires _Const && (convertible_to<iterator_t<_Vs>, iterator_t<const _Vs>> && ...)
10096 : _M_parent(__it._M_parent),
10097 _M_it(_S_invoke_with_runtime_index([this, &__it]<size_t _Idx>() {
10098 return __base_iter(in_place_index<_Idx>,
10099 std::get<_Idx>(
std::move(__it._M_it)));
10100 }, __it._M_it.index()))
10103 constexpr decltype(
auto)
10106 __glibcxx_assert(!_M_it.valueless_by_exception());
10107 using reference = __detail::__concat_reference_t<__maybe_const_t<_Const, _Vs>...>;
10108 return std::visit([](
auto&& __it) -> reference {
return *__it; }, _M_it);
10111 constexpr _Iterator&
10114 _M_invoke_with_runtime_index([
this]<
size_t _Idx>() {
10115 ++std::get<_Idx>(_M_it);
10116 _M_satisfy<_Idx>();
10125 constexpr _Iterator
10127 requires __detail::__all_forward<_Const, _Vs...>
10129 auto __tmp = *
this;
10134 constexpr _Iterator&
10136 requires __detail::__concat_is_bidirectional<_Const, _Vs...>
10138 __glibcxx_assert(!_M_it.valueless_by_exception());
10139 _M_invoke_with_runtime_index([
this]<
size_t _Idx>() {
10145 constexpr _Iterator
10147 requires __detail::__concat_is_bidirectional<_Const, _Vs...>
10149 auto __tmp = *
this;
10154 constexpr _Iterator&
10155 operator+=(difference_type __n)
10156 requires __detail::__concat_is_random_access<_Const, _Vs...>
10158 __glibcxx_assert(!_M_it.valueless_by_exception());
10159 _M_invoke_with_runtime_index([
this, __n]<
size_t _Idx>() {
10160 auto __begin = ranges::begin(std::get<_Idx>(_M_parent->_M_views));
10162 _M_advance_fwd<_Idx>(std::get<_Idx>(_M_it) - __begin, __n);
10164 _M_advance_bwd<_Idx>(std::get<_Idx>(_M_it) - __begin, -__n);
10169 constexpr _Iterator&
10170 operator-=(difference_type __n)
10171 requires __detail::__concat_is_random_access<_Const, _Vs...>
10177 constexpr decltype(
auto)
10178 operator[](difference_type __n)
const
10179 requires __detail::__concat_is_random_access<_Const, _Vs...>
10180 {
return *((*this) + __n); }
10182 friend constexpr bool
10183 operator==(
const _Iterator& __x,
const _Iterator& __y)
10184 requires (equality_comparable<iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10186 __glibcxx_assert(!__x._M_it.valueless_by_exception());
10187 __glibcxx_assert(!__y._M_it.valueless_by_exception());
10188 return __x._M_it == __y._M_it;
10191 friend constexpr bool
10192 operator==(
const _Iterator& __it, default_sentinel_t)
10194 __glibcxx_assert(!__it._M_it.valueless_by_exception());
10195 constexpr auto __last_idx =
sizeof...(_Vs) - 1;
10196 return (__it._M_it.index() == __last_idx
10197 && (std::get<__last_idx>(__it._M_it)
10198 == ranges::end(std::get<__last_idx>(__it._M_parent->_M_views))));
10201 friend constexpr bool
10202 operator<(
const _Iterator& __x,
const _Iterator& __y)
10203 requires __detail::__all_random_access<_Const, _Vs...>
10204 {
return __x._M_it < __y._M_it; }
10206 friend constexpr bool
10207 operator>(
const _Iterator& __x,
const _Iterator& __y)
10208 requires __detail::__all_random_access<_Const, _Vs...>
10209 {
return __x._M_it > __y._M_it; }
10211 friend constexpr bool
10212 operator<=(
const _Iterator& __x,
const _Iterator& __y)
10213 requires __detail::__all_random_access<_Const, _Vs...>
10214 {
return __x._M_it <= __y._M_it; }
10216 friend constexpr bool
10217 operator>=(
const _Iterator& __x,
const _Iterator& __y)
10218 requires __detail::__all_random_access<_Const, _Vs...>
10219 {
return __x._M_it >= __y._M_it; }
10221 friend constexpr auto
10222 operator<=>(
const _Iterator& __x,
const _Iterator& __y)
10223 requires __detail::__all_random_access<_Const, _Vs...>
10224 && (three_way_comparable<iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10225 {
return __x._M_it <=> __y._M_it; }
10227 friend constexpr _Iterator
10228 operator+(
const _Iterator& __it, difference_type __n)
10229 requires __detail::__concat_is_random_access<_Const, _Vs...>
10230 {
return auto(__it) += __n; }
10232 friend constexpr _Iterator
10233 operator+(difference_type __n,
const _Iterator& __it)
10234 requires __detail::__concat_is_random_access<_Const, _Vs...>
10235 {
return __it + __n; }
10237 friend constexpr _Iterator
10238 operator-(
const _Iterator& __it, difference_type __n)
10239 requires __detail::__concat_is_random_access<_Const, _Vs...>
10240 {
return auto(__it) -= __n; }
10242 friend constexpr difference_type
10243 operator-(
const _Iterator& __x,
const _Iterator& __y)
10244 requires __detail::__concat_is_random_access<_Const, _Vs...>
10246 return _S_invoke_with_runtime_index([&]<
size_t _Ix>() -> difference_type {
10247 return _S_invoke_with_runtime_index([&]<
size_t _Iy>() -> difference_type {
10248 if constexpr (_Ix > _Iy)
10250 auto __dy = ranges::distance(std::get<_Iy>(__y._M_it),
10251 ranges::end(std::get<_Iy>(__y._M_parent
10253 auto __dx = ranges::distance(ranges::begin(std::get<_Ix>(__x._M_parent
10255 std::get<_Ix>(__x._M_it));
10256 difference_type __s = 0;
10257 [&]<
size_t _Idx = _Iy + 1>(
this auto&& __self) {
10258 if constexpr (_Idx < _Ix)
10260 __s += ranges::size(std::get<_Idx>(__x._M_parent->_M_views));
10261 __self.template operator()<_Idx + 1>();
10264 return __dy + __s + __dx;
10266 else if constexpr (_Ix < _Iy)
10267 return -(__y - __x);
10269 return std::get<_Ix>(__x._M_it) - std::get<_Iy>(__y._M_it);
10270 }, __y._M_it.index());
10271 }, __x._M_it.index());
10274 friend constexpr difference_type
10275 operator-(
const _Iterator& __x, default_sentinel_t)
10276 requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
10277 iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10278 && __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
10280 return _S_invoke_with_runtime_index([&]<
size_t _Ix>() -> difference_type {
10281 auto __dx = ranges::distance(std::get<_Ix>(__x._M_it),
10282 ranges::end(std::get<_Ix>(__x._M_parent->_M_views)));
10283 difference_type __s = 0;
10284 [&]<
size_t _Idx = _Ix + 1>(
this auto&& __self) {
10285 if constexpr (_Idx <
sizeof...(_Vs))
10287 __s += ranges::size(std::get<_Idx>(__x._M_parent->_M_views));
10288 __self.template operator()<_Idx + 1>();
10291 return -(__dx + __s);
10292 }, __x._M_it.index());
10295 friend constexpr difference_type
10296 operator-(default_sentinel_t,
const _Iterator& __x)
10297 requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
10298 iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
10299 && __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
10302 friend constexpr decltype(
auto)
10303 iter_move(
const _Iterator& __it)
10305 using _Res = __detail::__concat_rvalue_reference_t<__maybe_const_t<_Const, _Vs>...>;
10306 return std::visit([](
const auto& __i) -> _Res {
10307 return ranges::iter_move(__i);
10311 friend constexpr void
10312 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10313 requires swappable_with<iter_reference_t<_Iterator>, iter_reference_t<_Iterator>>
10314 && (... && indirectly_swappable<iterator_t<__maybe_const_t<_Const, _Vs>>>)
10316 std::visit([&]<
typename _Tp,
typename _Up>(
const _Tp& __it1,
const _Up& __it2) {
10317 if constexpr (is_same_v<_Tp, _Up>)
10318 ranges::iter_swap(__it1, __it2);
10320 ranges::swap(*__it1, *__it2);
10321 }, __x._M_it, __y._M_it);
10329 template<
typename... _Ts>
10335 template<
typename... _Ts>
10336 requires __detail::__can_concat_view<_Ts...>
10338 operator() [[nodiscard]] (_Ts&&... __ts)
const
10341 template<input_range _Range>
10343 operator() [[nodiscard]] (_Range&& __t)
const
10347 inline constexpr _Concat concat;
10353#if __cpp_lib_ranges_cache_latest
10356 template<input_range _Vp>
10358 class cache_latest_view :
public view_interface<cache_latest_view<_Vp>>
10360 _Vp _M_base = _Vp();
10362 using __cache_t = __conditional_t<is_reference_v<range_reference_t<_Vp>>,
10363 add_pointer_t<range_reference_t<_Vp>>,
10364 range_reference_t<_Vp>>;
10365 __detail::__non_propagating_cache<__cache_t> _M_cache;
10371 cache_latest_view()
requires default_initializable<_Vp> = default;
10374 cache_latest_view(_Vp __base)
10375 : _M_base(std::move(__base))
10379 base() const & requires copy_constructible<_Vp>
10380 {
return _M_base; }
10388 {
return _Iterator(*
this); }
10392 {
return _Sentinel(*
this); }
10395 size()
requires sized_range<_Vp>
10396 {
return ranges::size(_M_base); }
10399 size() const requires sized_range<const _Vp>
10400 {
return ranges::size(_M_base); }
10403 template<
typename _Range>
10404 cache_latest_view(_Range&&) -> cache_latest_view<views::all_t<_Range>>;
10406 template<input_range _Vp>
10408 class cache_latest_view<_Vp>::_Iterator
10410 cache_latest_view* _M_parent;
10411 iterator_t<_Vp> _M_current;
10414 _Iterator(cache_latest_view& __parent)
10416 _M_current(ranges::begin(__parent._M_base))
10419 friend class cache_latest_view;
10422 using difference_type = range_difference_t<_Vp>;
10423 using value_type = range_value_t<_Vp>;
10424 using iterator_concept = input_iterator_tag;
10426 _Iterator(_Iterator&&) =
default;
10429 operator=(_Iterator&&) =
default;
10431 constexpr iterator_t<_Vp>
10435 constexpr const iterator_t<_Vp>&
10436 base() const & noexcept
10437 {
return _M_current; }
10439 constexpr range_reference_t<_Vp>&
10442 if constexpr (is_reference_v<range_reference_t<_Vp>>)
10444 if (!_M_parent->_M_cache)
10445 _M_parent->_M_cache =
std::__addressof(__detail::__as_lvalue(*_M_current));
10446 return **_M_parent->_M_cache;
10450 if (!_M_parent->_M_cache)
10451 _M_parent->_M_cache._M_emplace_deref(_M_current);
10452 return *_M_parent->_M_cache;
10456 constexpr _Iterator&
10459 _M_parent->_M_cache._M_reset();
10468 friend constexpr range_rvalue_reference_t<_Vp>
10469 iter_move(
const _Iterator& __i)
10470 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
10471 {
return ranges::iter_move(__i._M_current); }
10473 friend constexpr void
10474 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10475 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
10476 requires indirectly_swappable<iterator_t<_Vp>>
10477 { ranges::iter_swap(__x._M_current, __y._M_current); }
10480 template<input_range _Vp>
10482 class cache_latest_view<_Vp>::_Sentinel
10484 sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
10487 _Sentinel(cache_latest_view& __parent)
10488 : _M_end(ranges::end(__parent._M_base))
10491 friend class cache_latest_view;
10494 _Sentinel() =
default;
10496 constexpr sentinel_t<_Vp>
10500 friend constexpr bool
10501 operator==(
const _Iterator& __x,
const _Sentinel& __y)
10502 {
return __x._M_current == __y._M_end; }
10504 friend constexpr range_difference_t<_Vp>
10505 operator-(
const _Iterator& __x,
const _Sentinel& __y)
10506 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
10507 {
return __x._M_current - __y._M_end; }
10509 friend constexpr range_difference_t<_Vp>
10510 operator-(
const _Sentinel& __x,
const _Iterator& __y)
10511 requires sized_sentinel_for<sentinel_t<_Vp>, iterator_t<_Vp>>
10512 {
return __x._M_end - __y._M_current; }
10519 template<
typename _Tp>
10520 concept __can_cache_latest =
requires { cache_latest_view(
std::declval<_Tp>()); };
10523 struct _CacheLatest : __adaptor::_RangeAdaptorClosure<_CacheLatest>
10525 template<viewable_range _Range>
10526 requires __detail::__can_cache_latest<_Range>
10528 operator() [[nodiscard]] (_Range&& __r)
const
10531 static constexpr bool _S_has_simple_call_op =
true;
10534 inline constexpr _CacheLatest cache_latest;
10539#if __cpp_lib_ranges_to_input
10542 template<input_range _Vp>
10544 class to_input_view :
public view_interface<to_input_view<_Vp>>
10546 _Vp _M_base = _Vp();
10548 template<
bool _Const>
10552 to_input_view()
requires default_initializable<_Vp> = default;
10555 to_input_view(_Vp __base)
10556 : _M_base(std::move(__base))
10560 base() const & requires copy_constructible<_Vp>
10561 {
return _M_base; }
10568 begin()
requires (!__detail::__simple_view<_Vp>)
10569 {
return _Iterator<false>(ranges::begin(_M_base)); }
10572 begin() const requires range<const _Vp>
10573 {
return _Iterator<true>(ranges::begin(_M_base)); }
10576 end()
requires (!__detail::__simple_view<_Vp>)
10577 {
return ranges::end(_M_base); }
10580 end() const requires range<const _Vp>
10581 {
return ranges::end(_M_base); }
10584 size()
requires sized_range<_Vp>
10585 {
return ranges::size(_M_base); }
10588 size() const requires sized_range<const _Vp>
10589 {
return ranges::size(_M_base); }
10592 template<
typename _Range>
10593 to_input_view(_Range&&) -> to_input_view<views::all_t<_Range>>;
10595 template<input_range _Vp>
10597 template<
bool _Const>
10598 class to_input_view<_Vp>::_Iterator
10600 using _Base = __maybe_const_t<_Const, _Vp>;
10602 iterator_t<_Base> _M_current = iterator_t<_Base>();
10605 _Iterator(iterator_t<_Base> __current)
10606 : _M_current(std::move(__current))
10609 friend to_input_view;
10610 friend _Iterator<!_Const>;
10613 using difference_type = range_difference_t<_Base>;
10614 using value_type = range_value_t<_Base>;
10615 using iterator_concept = input_iterator_tag;
10617 _Iterator()
requires default_initializable<iterator_t<_Base>> = default;
10619 _Iterator(_Iterator&&) = default;
10620 _Iterator& operator=(_Iterator&&) = default;
10623 _Iterator(_Iterator<!_Const> __i)
10624 requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
10625 : _M_current(std::move(__i._M_current))
10628 constexpr iterator_t<_Base>
10632 constexpr const iterator_t<_Base>&
10633 base() const & noexcept
10634 {
return _M_current; }
10636 constexpr decltype(
auto)
10638 {
return *_M_current; }
10640 constexpr _Iterator&
10651 friend constexpr bool
10652 operator==(
const _Iterator& __x,
const sentinel_t<_Base>& __y)
10653 {
return __x._M_current == __y; }
10655 friend constexpr difference_type
10656 operator-(
const sentinel_t<_Base>& __y,
const _Iterator& __x)
10657 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
10658 {
return __y - __x._M_current; }
10660 friend constexpr difference_type
10661 operator-(
const _Iterator& __x,
const sentinel_t<_Base>& __y)
10662 requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
10663 {
return __x._M_current - __y; }
10665 friend constexpr range_rvalue_reference_t<_Base>
10666 iter_move(
const _Iterator& __i)
10667 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
10668 {
return ranges::iter_move(__i._M_current); }
10670 friend constexpr void
10671 iter_swap(
const _Iterator& __x,
const _Iterator& __y)
10672 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
10673 requires indirectly_swappable<iterator_t<_Base>>
10674 { ranges::iter_swap(__x._M_current, __y._M_current); }
10681 template<
typename _Tp>
10685 struct _ToInput : __adaptor::_RangeAdaptorClosure<_ToInput>
10687 template<viewable_range _Range>
10688 requires __detail::__can_to_input<_Range>
10690 operator() [[nodiscard]] (_Range&& __r)
const
10692 if constexpr (input_range<_Range>
10693 && !common_range<_Range>
10694 && !forward_range<_Range>)
10700 static constexpr bool _S_has_simple_call_op =
true;
10703 inline constexpr _ToInput to_input;
10708_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.
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
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.
typename decay< _Tp >::type decay_t
Alias template for decay.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
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.
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 _Iterator __base(_Iterator __it)
A view that contains no elements.
A view that contains exactly one element.
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.
[concept.constructible], concept constructible_from
[concept.defaultinitializable], concept default_initializable
[concept.moveconstructible], concept move_constructible
[concept.copyconstructible], concept copy_constructible
[range.range] The range concept.
[range.sized] The sized_range concept.
[range.view] The ranges::view concept.
A range for which ranges::begin returns an input iterator.
A range for which ranges::begin returns a forward iterator.
A range for which ranges::begin returns a bidirectional iterator.
A range for which ranges::begin returns a random access iterator.
A range for which ranges::begin returns a contiguous iterator.
A range for which ranges::begin and ranges::end return the same type.