Home | History | Annotate | Line # | Download | only in std
      1      1.1  mrg // <ranges> -*- C++ -*-
      2      1.1  mrg 
      3  1.1.1.3  mrg // Copyright (C) 2019-2022 Free Software Foundation, Inc.
      4      1.1  mrg //
      5      1.1  mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6      1.1  mrg // software; you can redistribute it and/or modify it under the
      7      1.1  mrg // terms of the GNU General Public License as published by the
      8      1.1  mrg // Free Software Foundation; either version 3, or (at your option)
      9      1.1  mrg // any later version.
     10      1.1  mrg 
     11      1.1  mrg // This library is distributed in the hope that it will be useful,
     12      1.1  mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  mrg // GNU General Public License for more details.
     15      1.1  mrg 
     16      1.1  mrg // Under Section 7 of GPL version 3, you are granted additional
     17      1.1  mrg // permissions described in the GCC Runtime Library Exception, version
     18      1.1  mrg // 3.1, as published by the Free Software Foundation.
     19      1.1  mrg 
     20      1.1  mrg // You should have received a copy of the GNU General Public License and
     21      1.1  mrg // a copy of the GCC Runtime Library Exception along with this program;
     22      1.1  mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23      1.1  mrg // <http://www.gnu.org/licenses/>.
     24      1.1  mrg 
     25      1.1  mrg /** @file include/ranges
     26      1.1  mrg  *  This is a Standard C++ Library header.
     27      1.1  mrg  *  @ingroup concepts
     28      1.1  mrg  */
     29      1.1  mrg 
     30      1.1  mrg #ifndef _GLIBCXX_RANGES
     31      1.1  mrg #define _GLIBCXX_RANGES 1
     32      1.1  mrg 
     33      1.1  mrg #if __cplusplus > 201703L
     34      1.1  mrg 
     35      1.1  mrg #pragma GCC system_header
     36      1.1  mrg 
     37      1.1  mrg #include <concepts>
     38      1.1  mrg 
     39      1.1  mrg #if __cpp_lib_concepts
     40      1.1  mrg 
     41      1.1  mrg #include <compare>
     42      1.1  mrg #include <initializer_list>
     43      1.1  mrg #include <iterator>
     44      1.1  mrg #include <optional>
     45  1.1.1.3  mrg #include <span>
     46      1.1  mrg #include <tuple>
     47  1.1.1.3  mrg #include <bits/ranges_util.h>
     48  1.1.1.3  mrg #include <bits/refwrap.h>
     49      1.1  mrg 
     50      1.1  mrg /**
     51      1.1  mrg  * @defgroup ranges Ranges
     52      1.1  mrg  *
     53      1.1  mrg  * Components for dealing with ranges of elements.
     54      1.1  mrg  */
     55      1.1  mrg 
     56      1.1  mrg namespace std _GLIBCXX_VISIBILITY(default)
     57      1.1  mrg {
     58      1.1  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     59      1.1  mrg namespace ranges
     60      1.1  mrg {
     61  1.1.1.3  mrg   // [range.access] customization point objects
     62  1.1.1.3  mrg   // [range.req] range and view concepts
     63  1.1.1.3  mrg   // [range.dangling] dangling iterator handling
     64  1.1.1.3  mrg   // Defined in <bits/ranges_base.h>
     65  1.1.1.3  mrg 
     66  1.1.1.3  mrg   // [view.interface] View interface
     67  1.1.1.3  mrg   // [range.subrange] Sub-ranges
     68  1.1.1.3  mrg   // Defined in <bits/ranges_util.h>
     69      1.1  mrg 
     70  1.1.1.3  mrg   // C++20 24.6 [range.factories] Range factories
     71      1.1  mrg 
     72  1.1.1.3  mrg   /// A view that contains no elements.
     73      1.1  mrg   template<typename _Tp> requires is_object_v<_Tp>
     74      1.1  mrg     class empty_view
     75      1.1  mrg     : public view_interface<empty_view<_Tp>>
     76      1.1  mrg     {
     77      1.1  mrg     public:
     78      1.1  mrg       static constexpr _Tp* begin() noexcept { return nullptr; }
     79      1.1  mrg       static constexpr _Tp* end() noexcept { return nullptr; }
     80      1.1  mrg       static constexpr _Tp* data() noexcept { return nullptr; }
     81      1.1  mrg       static constexpr size_t size() noexcept { return 0; }
     82      1.1  mrg       static constexpr bool empty() noexcept { return true; }
     83      1.1  mrg     };
     84      1.1  mrg 
     85      1.1  mrg   template<typename _Tp>
     86      1.1  mrg     inline constexpr bool enable_borrowed_range<empty_view<_Tp>> = true;
     87      1.1  mrg 
     88      1.1  mrg   namespace __detail
     89      1.1  mrg   {
     90  1.1.1.3  mrg     template<typename _Tp>
     91  1.1.1.3  mrg       concept __boxable = copy_constructible<_Tp> && is_object_v<_Tp>;
     92  1.1.1.3  mrg 
     93  1.1.1.3  mrg     template<__boxable _Tp>
     94      1.1  mrg       struct __box : std::optional<_Tp>
     95      1.1  mrg       {
     96      1.1  mrg 	using std::optional<_Tp>::optional;
     97      1.1  mrg 
     98      1.1  mrg 	constexpr
     99      1.1  mrg 	__box()
    100      1.1  mrg 	noexcept(is_nothrow_default_constructible_v<_Tp>)
    101      1.1  mrg 	requires default_initializable<_Tp>
    102      1.1  mrg 	: std::optional<_Tp>{std::in_place}
    103      1.1  mrg 	{ }
    104      1.1  mrg 
    105      1.1  mrg 	__box(const __box&) = default;
    106      1.1  mrg 	__box(__box&&) = default;
    107      1.1  mrg 
    108      1.1  mrg 	using std::optional<_Tp>::operator=;
    109      1.1  mrg 
    110      1.1  mrg 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
    111      1.1  mrg 	// 3477. Simplify constraints for semiregular-box
    112  1.1.1.3  mrg 	// 3572. copyable-box should be fully constexpr
    113  1.1.1.3  mrg 	constexpr __box&
    114      1.1  mrg 	operator=(const __box& __that)
    115      1.1  mrg 	noexcept(is_nothrow_copy_constructible_v<_Tp>)
    116      1.1  mrg 	requires (!copyable<_Tp>)
    117      1.1  mrg 	{
    118      1.1  mrg 	  if (this != std::__addressof(__that))
    119      1.1  mrg 	    {
    120      1.1  mrg 	      if ((bool)__that)
    121      1.1  mrg 		this->emplace(*__that);
    122      1.1  mrg 	      else
    123      1.1  mrg 		this->reset();
    124      1.1  mrg 	    }
    125      1.1  mrg 	  return *this;
    126      1.1  mrg 	}
    127      1.1  mrg 
    128  1.1.1.3  mrg 	constexpr __box&
    129      1.1  mrg 	operator=(__box&& __that)
    130      1.1  mrg 	noexcept(is_nothrow_move_constructible_v<_Tp>)
    131      1.1  mrg 	requires (!movable<_Tp>)
    132      1.1  mrg 	{
    133      1.1  mrg 	  if (this != std::__addressof(__that))
    134      1.1  mrg 	    {
    135      1.1  mrg 	      if ((bool)__that)
    136      1.1  mrg 		this->emplace(std::move(*__that));
    137      1.1  mrg 	      else
    138      1.1  mrg 		this->reset();
    139      1.1  mrg 	    }
    140      1.1  mrg 	  return *this;
    141      1.1  mrg 	}
    142      1.1  mrg       };
    143      1.1  mrg 
    144  1.1.1.3  mrg     // For types which are already copyable, this specialization of the
    145  1.1.1.3  mrg     // copyable wrapper stores the object directly without going through
    146  1.1.1.3  mrg     // std::optional.  It provides just the subset of the primary template's
    147  1.1.1.3  mrg     // API that we currently use.
    148  1.1.1.3  mrg     template<__boxable _Tp>
    149  1.1.1.3  mrg       requires copyable<_Tp> || (is_nothrow_move_constructible_v<_Tp>
    150  1.1.1.3  mrg 				 && is_nothrow_copy_constructible_v<_Tp>)
    151  1.1.1.3  mrg       struct __box<_Tp>
    152  1.1.1.3  mrg       {
    153  1.1.1.3  mrg       private:
    154  1.1.1.3  mrg 	[[no_unique_address]] _Tp _M_value = _Tp();
    155  1.1.1.3  mrg 
    156  1.1.1.3  mrg       public:
    157  1.1.1.3  mrg 	__box() requires default_initializable<_Tp> = default;
    158  1.1.1.3  mrg 
    159  1.1.1.3  mrg 	constexpr explicit
    160  1.1.1.3  mrg 	__box(const _Tp& __t)
    161  1.1.1.3  mrg 	noexcept(is_nothrow_copy_constructible_v<_Tp>)
    162  1.1.1.3  mrg 	: _M_value(__t)
    163  1.1.1.3  mrg 	{ }
    164  1.1.1.3  mrg 
    165  1.1.1.3  mrg 	constexpr explicit
    166  1.1.1.3  mrg 	__box(_Tp&& __t)
    167  1.1.1.3  mrg 	noexcept(is_nothrow_move_constructible_v<_Tp>)
    168  1.1.1.3  mrg 	: _M_value(std::move(__t))
    169  1.1.1.3  mrg 	{ }
    170  1.1.1.3  mrg 
    171  1.1.1.3  mrg 	template<typename... _Args>
    172  1.1.1.3  mrg 	  requires constructible_from<_Tp, _Args...>
    173  1.1.1.3  mrg 	  constexpr explicit
    174  1.1.1.3  mrg 	  __box(in_place_t, _Args&&... __args)
    175  1.1.1.3  mrg 	  noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
    176  1.1.1.3  mrg 	  : _M_value(std::forward<_Args>(__args)...)
    177  1.1.1.3  mrg 	  { }
    178  1.1.1.3  mrg 
    179  1.1.1.3  mrg 	__box(const __box&) = default;
    180  1.1.1.3  mrg 	__box(__box&&) = default;
    181  1.1.1.3  mrg 	__box& operator=(const __box&) requires copyable<_Tp> = default;
    182  1.1.1.3  mrg 	__box& operator=(__box&&) requires copyable<_Tp> = default;
    183  1.1.1.3  mrg 
    184  1.1.1.3  mrg 	// When _Tp is nothrow_copy_constructible but not copy_assignable,
    185  1.1.1.3  mrg 	// copy assignment is implemented via destroy-then-copy-construct.
    186  1.1.1.3  mrg 	constexpr __box&
    187  1.1.1.3  mrg 	operator=(const __box& __that) noexcept
    188  1.1.1.3  mrg 	{
    189  1.1.1.3  mrg 	  static_assert(is_nothrow_copy_constructible_v<_Tp>);
    190  1.1.1.3  mrg 	  if (this != std::__addressof(__that))
    191  1.1.1.3  mrg 	    {
    192  1.1.1.3  mrg 	      _M_value.~_Tp();
    193  1.1.1.3  mrg 	      std::construct_at(std::__addressof(_M_value), *__that);
    194  1.1.1.3  mrg 	    }
    195  1.1.1.3  mrg 	  return *this;
    196  1.1.1.3  mrg 	}
    197  1.1.1.3  mrg 
    198  1.1.1.3  mrg 	// Likewise for move assignment.
    199  1.1.1.3  mrg 	constexpr __box&
    200  1.1.1.3  mrg 	operator=(__box&& __that) noexcept
    201  1.1.1.3  mrg 	{
    202  1.1.1.3  mrg 	  static_assert(is_nothrow_move_constructible_v<_Tp>);
    203  1.1.1.3  mrg 	  if (this != std::__addressof(__that))
    204  1.1.1.3  mrg 	    {
    205  1.1.1.3  mrg 	      _M_value.~_Tp();
    206  1.1.1.3  mrg 	      std::construct_at(std::__addressof(_M_value), std::move(*__that));
    207  1.1.1.3  mrg 	    }
    208  1.1.1.3  mrg 	  return *this;
    209  1.1.1.3  mrg 	}
    210  1.1.1.3  mrg 
    211  1.1.1.3  mrg 	constexpr bool
    212  1.1.1.3  mrg 	has_value() const noexcept
    213  1.1.1.3  mrg 	{ return true; };
    214  1.1.1.3  mrg 
    215  1.1.1.3  mrg 	constexpr _Tp&
    216  1.1.1.3  mrg 	operator*() noexcept
    217  1.1.1.3  mrg 	{ return _M_value; }
    218  1.1.1.3  mrg 
    219  1.1.1.3  mrg 	constexpr const _Tp&
    220  1.1.1.3  mrg 	operator*() const noexcept
    221  1.1.1.3  mrg 	{ return _M_value; }
    222  1.1.1.3  mrg 
    223  1.1.1.3  mrg 	constexpr _Tp*
    224  1.1.1.3  mrg 	operator->() noexcept
    225  1.1.1.3  mrg 	{ return std::__addressof(_M_value); }
    226  1.1.1.3  mrg 
    227  1.1.1.3  mrg 	constexpr const _Tp*
    228  1.1.1.3  mrg 	operator->() const noexcept
    229  1.1.1.3  mrg 	{ return std::__addressof(_M_value); }
    230  1.1.1.3  mrg       };
    231      1.1  mrg   } // namespace __detail
    232      1.1  mrg 
    233      1.1  mrg   /// A view that contains exactly one element.
    234      1.1  mrg   template<copy_constructible _Tp> requires is_object_v<_Tp>
    235      1.1  mrg     class single_view : public view_interface<single_view<_Tp>>
    236      1.1  mrg     {
    237      1.1  mrg     public:
    238  1.1.1.3  mrg       single_view() requires default_initializable<_Tp> = default;
    239      1.1  mrg 
    240      1.1  mrg       constexpr explicit
    241      1.1  mrg       single_view(const _Tp& __t)
    242  1.1.1.3  mrg       noexcept(is_nothrow_copy_constructible_v<_Tp>)
    243      1.1  mrg       : _M_value(__t)
    244      1.1  mrg       { }
    245      1.1  mrg 
    246      1.1  mrg       constexpr explicit
    247      1.1  mrg       single_view(_Tp&& __t)
    248  1.1.1.3  mrg       noexcept(is_nothrow_move_constructible_v<_Tp>)
    249      1.1  mrg       : _M_value(std::move(__t))
    250      1.1  mrg       { }
    251      1.1  mrg 
    252      1.1  mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    253      1.1  mrg       // 3428. single_view's in place constructor should be explicit
    254      1.1  mrg       template<typename... _Args>
    255      1.1  mrg 	requires constructible_from<_Tp, _Args...>
    256      1.1  mrg 	constexpr explicit
    257      1.1  mrg 	single_view(in_place_t, _Args&&... __args)
    258  1.1.1.3  mrg 	noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
    259      1.1  mrg 	: _M_value{in_place, std::forward<_Args>(__args)...}
    260      1.1  mrg 	{ }
    261      1.1  mrg 
    262      1.1  mrg       constexpr _Tp*
    263      1.1  mrg       begin() noexcept
    264      1.1  mrg       { return data(); }
    265      1.1  mrg 
    266      1.1  mrg       constexpr const _Tp*
    267      1.1  mrg       begin() const noexcept
    268      1.1  mrg       { return data(); }
    269      1.1  mrg 
    270      1.1  mrg       constexpr _Tp*
    271      1.1  mrg       end() noexcept
    272      1.1  mrg       { return data() + 1; }
    273      1.1  mrg 
    274      1.1  mrg       constexpr const _Tp*
    275      1.1  mrg       end() const noexcept
    276      1.1  mrg       { return data() + 1; }
    277      1.1  mrg 
    278      1.1  mrg       static constexpr size_t
    279      1.1  mrg       size() noexcept
    280      1.1  mrg       { return 1; }
    281      1.1  mrg 
    282      1.1  mrg       constexpr _Tp*
    283      1.1  mrg       data() noexcept
    284      1.1  mrg       { return _M_value.operator->(); }
    285      1.1  mrg 
    286      1.1  mrg       constexpr const _Tp*
    287      1.1  mrg       data() const noexcept
    288      1.1  mrg       { return _M_value.operator->(); }
    289      1.1  mrg 
    290      1.1  mrg     private:
    291  1.1.1.3  mrg       [[no_unique_address]] __detail::__box<_Tp> _M_value;
    292      1.1  mrg     };
    293      1.1  mrg 
    294  1.1.1.3  mrg   template<typename _Tp>
    295  1.1.1.3  mrg     single_view(_Tp) -> single_view<_Tp>;
    296  1.1.1.3  mrg 
    297      1.1  mrg   namespace __detail
    298      1.1  mrg   {
    299      1.1  mrg     template<typename _Wp>
    300      1.1  mrg       constexpr auto __to_signed_like(_Wp __w) noexcept
    301      1.1  mrg       {
    302      1.1  mrg 	if constexpr (!integral<_Wp>)
    303      1.1  mrg 	  return iter_difference_t<_Wp>();
    304      1.1  mrg 	else if constexpr (sizeof(iter_difference_t<_Wp>) > sizeof(_Wp))
    305      1.1  mrg 	  return iter_difference_t<_Wp>(__w);
    306      1.1  mrg 	else if constexpr (sizeof(ptrdiff_t) > sizeof(_Wp))
    307      1.1  mrg 	  return ptrdiff_t(__w);
    308      1.1  mrg 	else if constexpr (sizeof(long long) > sizeof(_Wp))
    309      1.1  mrg 	  return (long long)(__w);
    310      1.1  mrg #ifdef __SIZEOF_INT128__
    311      1.1  mrg 	else if constexpr (__SIZEOF_INT128__ > sizeof(_Wp))
    312      1.1  mrg 	  return __int128(__w);
    313      1.1  mrg #endif
    314      1.1  mrg 	else
    315      1.1  mrg 	  return __max_diff_type(__w);
    316      1.1  mrg       }
    317      1.1  mrg 
    318      1.1  mrg     template<typename _Wp>
    319      1.1  mrg       using __iota_diff_t = decltype(__to_signed_like(std::declval<_Wp>()));
    320      1.1  mrg 
    321      1.1  mrg     template<typename _It>
    322      1.1  mrg       concept __decrementable = incrementable<_It>
    323      1.1  mrg 	&& requires(_It __i)
    324      1.1  mrg 	{
    325      1.1  mrg 	    { --__i } -> same_as<_It&>;
    326      1.1  mrg 	    { __i-- } -> same_as<_It>;
    327      1.1  mrg 	};
    328      1.1  mrg 
    329      1.1  mrg     template<typename _It>
    330      1.1  mrg       concept __advanceable = __decrementable<_It> && totally_ordered<_It>
    331      1.1  mrg 	&& requires( _It __i, const _It __j, const __iota_diff_t<_It> __n)
    332      1.1  mrg 	{
    333      1.1  mrg 	  { __i += __n } -> same_as<_It&>;
    334      1.1  mrg 	  { __i -= __n } -> same_as<_It&>;
    335      1.1  mrg 	  _It(__j + __n);
    336      1.1  mrg 	  _It(__n + __j);
    337      1.1  mrg 	  _It(__j - __n);
    338      1.1  mrg 	  { __j - __j } -> convertible_to<__iota_diff_t<_It>>;
    339      1.1  mrg 	};
    340      1.1  mrg 
    341      1.1  mrg     template<typename _Winc>
    342      1.1  mrg       struct __iota_view_iter_cat
    343      1.1  mrg       { };
    344      1.1  mrg 
    345      1.1  mrg     template<incrementable _Winc>
    346      1.1  mrg       struct __iota_view_iter_cat<_Winc>
    347      1.1  mrg       { using iterator_category = input_iterator_tag; };
    348      1.1  mrg   } // namespace __detail
    349      1.1  mrg 
    350      1.1  mrg   template<weakly_incrementable _Winc,
    351      1.1  mrg 	   semiregular _Bound = unreachable_sentinel_t>
    352      1.1  mrg     requires std::__detail::__weakly_eq_cmp_with<_Winc, _Bound>
    353      1.1  mrg       && copyable<_Winc>
    354      1.1  mrg     class iota_view : public view_interface<iota_view<_Winc, _Bound>>
    355      1.1  mrg     {
    356      1.1  mrg     private:
    357      1.1  mrg       struct _Sentinel;
    358      1.1  mrg 
    359      1.1  mrg       struct _Iterator : __detail::__iota_view_iter_cat<_Winc>
    360      1.1  mrg       {
    361      1.1  mrg       private:
    362      1.1  mrg 	static auto
    363      1.1  mrg 	_S_iter_concept()
    364      1.1  mrg 	{
    365      1.1  mrg 	  using namespace __detail;
    366      1.1  mrg 	  if constexpr (__advanceable<_Winc>)
    367      1.1  mrg 	    return random_access_iterator_tag{};
    368      1.1  mrg 	  else if constexpr (__decrementable<_Winc>)
    369      1.1  mrg 	    return bidirectional_iterator_tag{};
    370      1.1  mrg 	  else if constexpr (incrementable<_Winc>)
    371      1.1  mrg 	    return forward_iterator_tag{};
    372      1.1  mrg 	  else
    373      1.1  mrg 	    return input_iterator_tag{};
    374      1.1  mrg 	}
    375      1.1  mrg 
    376      1.1  mrg       public:
    377      1.1  mrg 	using iterator_concept = decltype(_S_iter_concept());
    378      1.1  mrg 	// iterator_category defined in __iota_view_iter_cat
    379      1.1  mrg 	using value_type = _Winc;
    380      1.1  mrg 	using difference_type = __detail::__iota_diff_t<_Winc>;
    381      1.1  mrg 
    382      1.1  mrg 	_Iterator() requires default_initializable<_Winc> = default;
    383      1.1  mrg 
    384      1.1  mrg 	constexpr explicit
    385      1.1  mrg 	_Iterator(_Winc __value)
    386      1.1  mrg 	: _M_value(__value) { }
    387      1.1  mrg 
    388      1.1  mrg 	constexpr _Winc
    389      1.1  mrg 	operator*() const noexcept(is_nothrow_copy_constructible_v<_Winc>)
    390      1.1  mrg 	{ return _M_value; }
    391      1.1  mrg 
    392      1.1  mrg 	constexpr _Iterator&
    393      1.1  mrg 	operator++()
    394      1.1  mrg 	{
    395      1.1  mrg 	  ++_M_value;
    396      1.1  mrg 	  return *this;
    397      1.1  mrg 	}
    398      1.1  mrg 
    399      1.1  mrg 	constexpr void
    400      1.1  mrg 	operator++(int)
    401      1.1  mrg 	{ ++*this; }
    402      1.1  mrg 
    403      1.1  mrg 	constexpr _Iterator
    404      1.1  mrg 	operator++(int) requires incrementable<_Winc>
    405      1.1  mrg 	{
    406      1.1  mrg 	  auto __tmp = *this;
    407      1.1  mrg 	  ++*this;
    408      1.1  mrg 	  return __tmp;
    409      1.1  mrg 	}
    410      1.1  mrg 
    411      1.1  mrg 	constexpr _Iterator&
    412      1.1  mrg 	operator--() requires __detail::__decrementable<_Winc>
    413      1.1  mrg 	{
    414      1.1  mrg 	  --_M_value;
    415      1.1  mrg 	  return *this;
    416      1.1  mrg 	}
    417      1.1  mrg 
    418      1.1  mrg 	constexpr _Iterator
    419      1.1  mrg 	operator--(int) requires __detail::__decrementable<_Winc>
    420      1.1  mrg 	{
    421      1.1  mrg 	  auto __tmp = *this;
    422      1.1  mrg 	  --*this;
    423      1.1  mrg 	  return __tmp;
    424      1.1  mrg 	}
    425      1.1  mrg 
    426      1.1  mrg 	constexpr _Iterator&
    427      1.1  mrg 	operator+=(difference_type __n) requires __detail::__advanceable<_Winc>
    428      1.1  mrg 	{
    429      1.1  mrg 	  using __detail::__is_integer_like;
    430      1.1  mrg 	  using __detail::__is_signed_integer_like;
    431      1.1  mrg 	  if constexpr (__is_integer_like<_Winc>
    432      1.1  mrg 	      && !__is_signed_integer_like<_Winc>)
    433      1.1  mrg 	    {
    434      1.1  mrg 	      if (__n >= difference_type(0))
    435      1.1  mrg 		_M_value += static_cast<_Winc>(__n);
    436      1.1  mrg 	      else
    437      1.1  mrg 		_M_value -= static_cast<_Winc>(-__n);
    438      1.1  mrg 	    }
    439      1.1  mrg 	  else
    440      1.1  mrg 	    _M_value += __n;
    441      1.1  mrg 	  return *this;
    442      1.1  mrg 	}
    443      1.1  mrg 
    444      1.1  mrg 	constexpr _Iterator&
    445      1.1  mrg 	operator-=(difference_type __n) requires __detail::__advanceable<_Winc>
    446      1.1  mrg 	{
    447      1.1  mrg 	  using __detail::__is_integer_like;
    448      1.1  mrg 	  using __detail::__is_signed_integer_like;
    449      1.1  mrg 	  if constexpr (__is_integer_like<_Winc>
    450      1.1  mrg 	      && !__is_signed_integer_like<_Winc>)
    451      1.1  mrg 	    {
    452      1.1  mrg 	      if (__n >= difference_type(0))
    453      1.1  mrg 		_M_value -= static_cast<_Winc>(__n);
    454      1.1  mrg 	      else
    455      1.1  mrg 		_M_value += static_cast<_Winc>(-__n);
    456      1.1  mrg 	    }
    457      1.1  mrg 	  else
    458      1.1  mrg 	    _M_value -= __n;
    459      1.1  mrg 	  return *this;
    460      1.1  mrg 	}
    461      1.1  mrg 
    462      1.1  mrg 	constexpr _Winc
    463      1.1  mrg 	operator[](difference_type __n) const
    464      1.1  mrg 	requires __detail::__advanceable<_Winc>
    465      1.1  mrg 	{ return _Winc(_M_value + __n); }
    466      1.1  mrg 
    467      1.1  mrg 	friend constexpr bool
    468      1.1  mrg 	operator==(const _Iterator& __x, const _Iterator& __y)
    469      1.1  mrg 	requires equality_comparable<_Winc>
    470      1.1  mrg 	{ return __x._M_value == __y._M_value; }
    471      1.1  mrg 
    472      1.1  mrg 	friend constexpr bool
    473      1.1  mrg 	operator<(const _Iterator& __x, const _Iterator& __y)
    474      1.1  mrg 	requires totally_ordered<_Winc>
    475      1.1  mrg 	{ return __x._M_value < __y._M_value; }
    476      1.1  mrg 
    477      1.1  mrg 	friend constexpr bool
    478      1.1  mrg 	operator>(const _Iterator& __x, const _Iterator& __y)
    479      1.1  mrg 	  requires totally_ordered<_Winc>
    480      1.1  mrg 	{ return __y < __x; }
    481      1.1  mrg 
    482      1.1  mrg 	friend constexpr bool
    483      1.1  mrg 	operator<=(const _Iterator& __x, const _Iterator& __y)
    484      1.1  mrg 	  requires totally_ordered<_Winc>
    485      1.1  mrg 	{ return !(__y < __x); }
    486      1.1  mrg 
    487      1.1  mrg 	friend constexpr bool
    488      1.1  mrg 	operator>=(const _Iterator& __x, const _Iterator& __y)
    489      1.1  mrg 	  requires totally_ordered<_Winc>
    490      1.1  mrg 	{ return !(__x < __y); }
    491      1.1  mrg 
    492      1.1  mrg #ifdef __cpp_lib_three_way_comparison
    493      1.1  mrg 	friend constexpr auto
    494      1.1  mrg 	operator<=>(const _Iterator& __x, const _Iterator& __y)
    495      1.1  mrg 	  requires totally_ordered<_Winc> && three_way_comparable<_Winc>
    496      1.1  mrg 	{ return __x._M_value <=> __y._M_value; }
    497      1.1  mrg #endif
    498      1.1  mrg 
    499      1.1  mrg 	friend constexpr _Iterator
    500      1.1  mrg 	operator+(_Iterator __i, difference_type __n)
    501      1.1  mrg 	  requires __detail::__advanceable<_Winc>
    502  1.1.1.3  mrg 	{
    503  1.1.1.3  mrg 	  __i += __n;
    504  1.1.1.3  mrg 	  return __i;
    505  1.1.1.3  mrg 	}
    506      1.1  mrg 
    507      1.1  mrg 	friend constexpr _Iterator
    508      1.1  mrg 	operator+(difference_type __n, _Iterator __i)
    509      1.1  mrg 	  requires __detail::__advanceable<_Winc>
    510      1.1  mrg 	{ return __i += __n; }
    511      1.1  mrg 
    512      1.1  mrg 	friend constexpr _Iterator
    513      1.1  mrg 	operator-(_Iterator __i, difference_type __n)
    514      1.1  mrg 	  requires __detail::__advanceable<_Winc>
    515  1.1.1.3  mrg 	{
    516  1.1.1.3  mrg 	  __i -= __n;
    517  1.1.1.3  mrg 	  return __i;
    518  1.1.1.3  mrg 	}
    519      1.1  mrg 
    520      1.1  mrg 	friend constexpr difference_type
    521      1.1  mrg 	operator-(const _Iterator& __x, const _Iterator& __y)
    522      1.1  mrg 	  requires __detail::__advanceable<_Winc>
    523      1.1  mrg 	{
    524      1.1  mrg 	  using __detail::__is_integer_like;
    525      1.1  mrg 	  using __detail::__is_signed_integer_like;
    526      1.1  mrg 	  using _Dt = difference_type;
    527      1.1  mrg 	  if constexpr (__is_integer_like<_Winc>)
    528      1.1  mrg 	    {
    529      1.1  mrg 	      if constexpr (__is_signed_integer_like<_Winc>)
    530      1.1  mrg 		return _Dt(_Dt(__x._M_value) - _Dt(__y._M_value));
    531      1.1  mrg 	      else
    532      1.1  mrg 		return (__y._M_value > __x._M_value)
    533      1.1  mrg 		  ? _Dt(-_Dt(__y._M_value - __x._M_value))
    534      1.1  mrg 		  : _Dt(__x._M_value - __y._M_value);
    535      1.1  mrg 	    }
    536      1.1  mrg 	  else
    537      1.1  mrg 	    return __x._M_value - __y._M_value;
    538      1.1  mrg 	}
    539      1.1  mrg 
    540      1.1  mrg       private:
    541      1.1  mrg 	_Winc _M_value = _Winc();
    542      1.1  mrg 
    543  1.1.1.3  mrg 	friend iota_view;
    544      1.1  mrg         friend _Sentinel;
    545      1.1  mrg       };
    546      1.1  mrg 
    547      1.1  mrg       struct _Sentinel
    548      1.1  mrg       {
    549      1.1  mrg       private:
    550      1.1  mrg 	constexpr bool
    551      1.1  mrg 	_M_equal(const _Iterator& __x) const
    552      1.1  mrg 	{ return __x._M_value == _M_bound; }
    553      1.1  mrg 
    554      1.1  mrg 	constexpr auto
    555      1.1  mrg 	_M_distance_from(const _Iterator& __x) const
    556      1.1  mrg 	{ return _M_bound - __x._M_value; }
    557      1.1  mrg 
    558      1.1  mrg 	_Bound _M_bound = _Bound();
    559      1.1  mrg 
    560      1.1  mrg       public:
    561      1.1  mrg 	_Sentinel() = default;
    562      1.1  mrg 
    563      1.1  mrg 	constexpr explicit
    564      1.1  mrg 	_Sentinel(_Bound __bound)
    565      1.1  mrg 	: _M_bound(__bound) { }
    566      1.1  mrg 
    567      1.1  mrg 	friend constexpr bool
    568      1.1  mrg 	operator==(const _Iterator& __x, const _Sentinel& __y)
    569      1.1  mrg 	{ return __y._M_equal(__x); }
    570      1.1  mrg 
    571      1.1  mrg 	friend constexpr iter_difference_t<_Winc>
    572      1.1  mrg 	operator-(const _Iterator& __x, const _Sentinel& __y)
    573      1.1  mrg 	  requires sized_sentinel_for<_Bound, _Winc>
    574      1.1  mrg 	{ return -__y._M_distance_from(__x); }
    575      1.1  mrg 
    576      1.1  mrg 	friend constexpr iter_difference_t<_Winc>
    577      1.1  mrg 	operator-(const _Sentinel& __x, const _Iterator& __y)
    578      1.1  mrg 	  requires sized_sentinel_for<_Bound, _Winc>
    579      1.1  mrg 	{ return __x._M_distance_from(__y); }
    580  1.1.1.3  mrg 
    581  1.1.1.3  mrg 	friend iota_view;
    582      1.1  mrg       };
    583      1.1  mrg 
    584      1.1  mrg       _Winc _M_value = _Winc();
    585  1.1.1.3  mrg       [[no_unique_address]] _Bound _M_bound = _Bound();
    586      1.1  mrg 
    587      1.1  mrg     public:
    588      1.1  mrg       iota_view() requires default_initializable<_Winc> = default;
    589      1.1  mrg 
    590      1.1  mrg       constexpr explicit
    591      1.1  mrg       iota_view(_Winc __value)
    592      1.1  mrg       : _M_value(__value)
    593      1.1  mrg       { }
    594      1.1  mrg 
    595      1.1  mrg       constexpr
    596      1.1  mrg       iota_view(type_identity_t<_Winc> __value,
    597      1.1  mrg 		type_identity_t<_Bound> __bound)
    598      1.1  mrg       : _M_value(__value), _M_bound(__bound)
    599      1.1  mrg       {
    600      1.1  mrg 	if constexpr (totally_ordered_with<_Winc, _Bound>)
    601  1.1.1.3  mrg 	  __glibcxx_assert( bool(__value <= __bound) );
    602      1.1  mrg       }
    603      1.1  mrg 
    604  1.1.1.3  mrg       constexpr
    605  1.1.1.3  mrg       iota_view(_Iterator __first, _Iterator __last)
    606  1.1.1.3  mrg 	requires same_as<_Winc, _Bound>
    607  1.1.1.3  mrg 	: iota_view(__first._M_value, __last._M_value)
    608  1.1.1.3  mrg       { }
    609  1.1.1.3  mrg 
    610  1.1.1.3  mrg       constexpr
    611  1.1.1.3  mrg       iota_view(_Iterator __first, unreachable_sentinel_t __last)
    612  1.1.1.3  mrg 	requires same_as<_Bound, unreachable_sentinel_t>
    613  1.1.1.3  mrg 	: iota_view(__first._M_value, __last)
    614  1.1.1.3  mrg       { }
    615  1.1.1.3  mrg 
    616  1.1.1.3  mrg       constexpr
    617  1.1.1.3  mrg       iota_view(_Iterator __first, _Sentinel __last)
    618  1.1.1.3  mrg 	requires (!same_as<_Winc, _Bound>) && (!same_as<_Bound, unreachable_sentinel_t>)
    619  1.1.1.3  mrg 	: iota_view(__first._M_value, __last._M_bound)
    620  1.1.1.3  mrg       { }
    621  1.1.1.3  mrg 
    622      1.1  mrg       constexpr _Iterator
    623      1.1  mrg       begin() const { return _Iterator{_M_value}; }
    624      1.1  mrg 
    625      1.1  mrg       constexpr auto
    626      1.1  mrg       end() const
    627      1.1  mrg       {
    628      1.1  mrg 	if constexpr (same_as<_Bound, unreachable_sentinel_t>)
    629      1.1  mrg 	  return unreachable_sentinel;
    630      1.1  mrg 	else
    631      1.1  mrg 	  return _Sentinel{_M_bound};
    632      1.1  mrg       }
    633      1.1  mrg 
    634      1.1  mrg       constexpr _Iterator
    635      1.1  mrg       end() const requires same_as<_Winc, _Bound>
    636      1.1  mrg       { return _Iterator{_M_bound}; }
    637      1.1  mrg 
    638      1.1  mrg       constexpr auto
    639      1.1  mrg       size() const
    640      1.1  mrg       requires (same_as<_Winc, _Bound> && __detail::__advanceable<_Winc>)
    641      1.1  mrg       || (integral<_Winc> && integral<_Bound>)
    642      1.1  mrg       || sized_sentinel_for<_Bound, _Winc>
    643      1.1  mrg       {
    644      1.1  mrg 	using __detail::__is_integer_like;
    645      1.1  mrg 	using __detail::__to_unsigned_like;
    646      1.1  mrg 	if constexpr (integral<_Winc> && integral<_Bound>)
    647      1.1  mrg 	  {
    648      1.1  mrg 	    using _Up = make_unsigned_t<decltype(_M_bound - _M_value)>;
    649      1.1  mrg 	    return _Up(_M_bound) - _Up(_M_value);
    650      1.1  mrg 	  }
    651      1.1  mrg 	else if constexpr (__is_integer_like<_Winc>)
    652      1.1  mrg 	  return __to_unsigned_like(_M_bound) - __to_unsigned_like(_M_value);
    653      1.1  mrg 	else
    654      1.1  mrg 	  return __to_unsigned_like(_M_bound - _M_value);
    655      1.1  mrg       }
    656      1.1  mrg     };
    657      1.1  mrg 
    658      1.1  mrg   template<typename _Winc, typename _Bound>
    659      1.1  mrg     requires (!__detail::__is_integer_like<_Winc>
    660      1.1  mrg 	|| !__detail::__is_integer_like<_Bound>
    661      1.1  mrg 	|| (__detail::__is_signed_integer_like<_Winc>
    662      1.1  mrg 	    == __detail::__is_signed_integer_like<_Bound>))
    663      1.1  mrg     iota_view(_Winc, _Bound) -> iota_view<_Winc, _Bound>;
    664      1.1  mrg 
    665  1.1.1.3  mrg   template<typename _Winc, typename _Bound>
    666      1.1  mrg     inline constexpr bool
    667      1.1  mrg       enable_borrowed_range<iota_view<_Winc, _Bound>> = true;
    668      1.1  mrg 
    669      1.1  mrg namespace views
    670      1.1  mrg {
    671      1.1  mrg   template<typename _Tp>
    672      1.1  mrg     inline constexpr empty_view<_Tp> empty{};
    673      1.1  mrg 
    674  1.1.1.3  mrg   namespace __detail
    675      1.1  mrg   {
    676      1.1  mrg     template<typename _Tp>
    677  1.1.1.3  mrg       concept __can_single_view
    678  1.1.1.3  mrg 	= requires { single_view<decay_t<_Tp>>(std::declval<_Tp>()); };
    679  1.1.1.3  mrg   } // namespace __detail
    680  1.1.1.3  mrg 
    681  1.1.1.3  mrg   struct _Single
    682  1.1.1.3  mrg   {
    683  1.1.1.3  mrg     template<__detail::__can_single_view _Tp>
    684      1.1  mrg       constexpr auto
    685  1.1.1.3  mrg       operator() [[nodiscard]] (_Tp&& __e) const
    686  1.1.1.3  mrg       noexcept(noexcept(single_view<decay_t<_Tp>>(std::forward<_Tp>(__e))))
    687  1.1.1.3  mrg       { return single_view<decay_t<_Tp>>(std::forward<_Tp>(__e)); }
    688      1.1  mrg   };
    689      1.1  mrg 
    690      1.1  mrg   inline constexpr _Single single{};
    691      1.1  mrg 
    692  1.1.1.3  mrg   namespace __detail
    693  1.1.1.3  mrg   {
    694  1.1.1.3  mrg     template<typename... _Args>
    695  1.1.1.3  mrg       concept __can_iota_view = requires { iota_view(std::declval<_Args>()...); };
    696  1.1.1.3  mrg   } // namespace __detail
    697  1.1.1.3  mrg 
    698      1.1  mrg   struct _Iota
    699      1.1  mrg   {
    700  1.1.1.3  mrg     template<__detail::__can_iota_view _Tp>
    701      1.1  mrg       constexpr auto
    702  1.1.1.3  mrg       operator() [[nodiscard]] (_Tp&& __e) const
    703  1.1.1.3  mrg       { return iota_view(std::forward<_Tp>(__e)); }
    704      1.1  mrg 
    705      1.1  mrg     template<typename _Tp, typename _Up>
    706  1.1.1.3  mrg       requires __detail::__can_iota_view<_Tp, _Up>
    707      1.1  mrg       constexpr auto
    708  1.1.1.3  mrg       operator() [[nodiscard]] (_Tp&& __e, _Up&& __f) const
    709  1.1.1.3  mrg       { return iota_view(std::forward<_Tp>(__e), std::forward<_Up>(__f)); }
    710      1.1  mrg   };
    711      1.1  mrg 
    712      1.1  mrg   inline constexpr _Iota iota{};
    713      1.1  mrg } // namespace views
    714      1.1  mrg 
    715      1.1  mrg   namespace __detail
    716      1.1  mrg   {
    717      1.1  mrg     template<typename _Val, typename _CharT, typename _Traits>
    718      1.1  mrg       concept __stream_extractable
    719      1.1  mrg 	= requires(basic_istream<_CharT, _Traits>& is, _Val& t) { is >> t; };
    720      1.1  mrg   } // namespace __detail
    721      1.1  mrg 
    722      1.1  mrg   template<movable _Val, typename _CharT,
    723      1.1  mrg 	   typename _Traits = char_traits<_CharT>>
    724      1.1  mrg     requires default_initializable<_Val>
    725      1.1  mrg       && __detail::__stream_extractable<_Val, _CharT, _Traits>
    726      1.1  mrg     class basic_istream_view
    727      1.1  mrg     : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
    728      1.1  mrg     {
    729      1.1  mrg     public:
    730      1.1  mrg       constexpr explicit
    731      1.1  mrg       basic_istream_view(basic_istream<_CharT, _Traits>& __stream)
    732      1.1  mrg 	: _M_stream(std::__addressof(__stream))
    733      1.1  mrg       { }
    734      1.1  mrg 
    735      1.1  mrg       constexpr auto
    736      1.1  mrg       begin()
    737      1.1  mrg       {
    738  1.1.1.3  mrg 	*_M_stream >> _M_object;
    739      1.1  mrg 	return _Iterator{this};
    740      1.1  mrg       }
    741      1.1  mrg 
    742      1.1  mrg       constexpr default_sentinel_t
    743      1.1  mrg       end() const noexcept
    744      1.1  mrg       { return default_sentinel; }
    745      1.1  mrg 
    746      1.1  mrg     private:
    747  1.1.1.3  mrg       basic_istream<_CharT, _Traits>* _M_stream;
    748      1.1  mrg       _Val _M_object = _Val();
    749      1.1  mrg 
    750      1.1  mrg       struct _Iterator
    751      1.1  mrg       {
    752      1.1  mrg       public:
    753      1.1  mrg 	using iterator_concept = input_iterator_tag;
    754      1.1  mrg 	using difference_type = ptrdiff_t;
    755      1.1  mrg 	using value_type = _Val;
    756      1.1  mrg 
    757      1.1  mrg 	constexpr explicit
    758      1.1  mrg 	_Iterator(basic_istream_view* __parent) noexcept
    759      1.1  mrg 	  : _M_parent(__parent)
    760      1.1  mrg 	{ }
    761      1.1  mrg 
    762      1.1  mrg 	_Iterator(const _Iterator&) = delete;
    763      1.1  mrg 	_Iterator(_Iterator&&) = default;
    764      1.1  mrg 	_Iterator& operator=(const _Iterator&) = delete;
    765      1.1  mrg 	_Iterator& operator=(_Iterator&&) = default;
    766      1.1  mrg 
    767      1.1  mrg 	_Iterator&
    768      1.1  mrg 	operator++()
    769      1.1  mrg 	{
    770      1.1  mrg 	  *_M_parent->_M_stream >> _M_parent->_M_object;
    771      1.1  mrg 	  return *this;
    772      1.1  mrg 	}
    773      1.1  mrg 
    774      1.1  mrg 	void
    775      1.1  mrg 	operator++(int)
    776      1.1  mrg 	{ ++*this; }
    777      1.1  mrg 
    778      1.1  mrg 	_Val&
    779      1.1  mrg 	operator*() const
    780  1.1.1.3  mrg 	{ return _M_parent->_M_object; }
    781      1.1  mrg 
    782      1.1  mrg 	friend bool
    783      1.1  mrg 	operator==(const _Iterator& __x, default_sentinel_t)
    784      1.1  mrg 	{ return __x._M_at_end(); }
    785      1.1  mrg 
    786      1.1  mrg       private:
    787  1.1.1.3  mrg 	basic_istream_view* _M_parent;
    788      1.1  mrg 
    789      1.1  mrg 	bool
    790      1.1  mrg 	_M_at_end() const
    791  1.1.1.3  mrg 	{ return !*_M_parent->_M_stream; }
    792      1.1  mrg       };
    793      1.1  mrg 
    794      1.1  mrg       friend _Iterator;
    795      1.1  mrg     };
    796      1.1  mrg 
    797  1.1.1.3  mrg   template<typename _Val>
    798  1.1.1.3  mrg     using istream_view = basic_istream_view<_Val, char>;
    799  1.1.1.3  mrg 
    800  1.1.1.3  mrg   template<typename _Val>
    801  1.1.1.3  mrg     using wistream_view = basic_istream_view<_Val, wchar_t>;
    802  1.1.1.3  mrg 
    803  1.1.1.3  mrg namespace views
    804  1.1.1.3  mrg {
    805  1.1.1.3  mrg   namespace __detail
    806  1.1.1.3  mrg   {
    807  1.1.1.3  mrg     template<typename _Tp, typename _Up>
    808  1.1.1.3  mrg     concept __can_istream_view = requires (_Up __e) {
    809  1.1.1.3  mrg       basic_istream_view<_Tp, typename _Up::char_type, typename _Up::traits_type>(__e);
    810  1.1.1.3  mrg     };
    811  1.1.1.3  mrg   } // namespace __detail
    812  1.1.1.3  mrg 
    813  1.1.1.3  mrg   template<typename _Tp>
    814  1.1.1.3  mrg     struct _Istream
    815  1.1.1.3  mrg     {
    816  1.1.1.3  mrg       template<typename _CharT, typename _Traits>
    817  1.1.1.3  mrg 	constexpr auto
    818  1.1.1.3  mrg 	operator() [[nodiscard]] (basic_istream<_CharT, _Traits>& __e) const
    819  1.1.1.3  mrg 	requires __detail::__can_istream_view<_Tp, remove_reference_t<decltype(__e)>>
    820  1.1.1.3  mrg 	{ return basic_istream_view<_Tp, _CharT, _Traits>(__e); }
    821  1.1.1.3  mrg     };
    822  1.1.1.3  mrg 
    823  1.1.1.3  mrg   template<typename _Tp>
    824  1.1.1.3  mrg     inline constexpr _Istream<_Tp> istream;
    825  1.1.1.3  mrg }
    826  1.1.1.3  mrg 
    827  1.1.1.3  mrg   // C++20 24.7 [range.adaptors] Range adaptors
    828      1.1  mrg 
    829      1.1  mrg namespace __detail
    830      1.1  mrg {
    831      1.1  mrg   struct _Empty { };
    832      1.1  mrg 
    833      1.1  mrg   // Alias for a type that is conditionally present
    834      1.1  mrg   // (and is an empty type otherwise).
    835      1.1  mrg   // Data members using this alias should use [[no_unique_address]] so that
    836      1.1  mrg   // they take no space when not needed.
    837      1.1  mrg   template<bool _Present, typename _Tp>
    838  1.1.1.3  mrg     using __maybe_present_t = __conditional_t<_Present, _Tp, _Empty>;
    839      1.1  mrg 
    840      1.1  mrg   // Alias for a type that is conditionally const.
    841      1.1  mrg   template<bool _Const, typename _Tp>
    842  1.1.1.3  mrg     using __maybe_const_t = __conditional_t<_Const, const _Tp, _Tp>;
    843      1.1  mrg 
    844      1.1  mrg } // namespace __detail
    845      1.1  mrg 
    846  1.1.1.3  mrg namespace views::__adaptor
    847      1.1  mrg {
    848  1.1.1.3  mrg   // True if the range adaptor _Adaptor can be applied with _Args.
    849  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
    850  1.1.1.3  mrg     concept __adaptor_invocable
    851  1.1.1.3  mrg       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
    852  1.1.1.3  mrg 
    853  1.1.1.3  mrg   // True if the range adaptor non-closure _Adaptor can be partially applied
    854  1.1.1.3  mrg   // with _Args.
    855  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
    856  1.1.1.3  mrg     concept __adaptor_partial_app_viable = (_Adaptor::_S_arity > 1)
    857  1.1.1.3  mrg       && (sizeof...(_Args) == _Adaptor::_S_arity - 1)
    858  1.1.1.3  mrg       && (constructible_from<decay_t<_Args>, _Args> && ...);
    859  1.1.1.3  mrg 
    860  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
    861  1.1.1.3  mrg     struct _Partial;
    862  1.1.1.3  mrg 
    863  1.1.1.3  mrg   template<typename _Lhs, typename _Rhs>
    864  1.1.1.3  mrg     struct _Pipe;
    865  1.1.1.3  mrg 
    866  1.1.1.3  mrg   // The base class of every range adaptor closure.
    867  1.1.1.3  mrg   //
    868  1.1.1.3  mrg   // The derived class should define the optional static data member
    869  1.1.1.3  mrg   // _S_has_simple_call_op to true if the behavior of this adaptor is
    870  1.1.1.3  mrg   // independent of the constness/value category of the adaptor object.
    871  1.1.1.3  mrg   struct _RangeAdaptorClosure
    872      1.1  mrg   {
    873  1.1.1.3  mrg     // range | adaptor is equivalent to adaptor(range).
    874  1.1.1.3  mrg     template<typename _Self, typename _Range>
    875  1.1.1.3  mrg       requires derived_from<remove_cvref_t<_Self>, _RangeAdaptorClosure>
    876  1.1.1.3  mrg 	&& __adaptor_invocable<_Self, _Range>
    877  1.1.1.3  mrg       friend constexpr auto
    878  1.1.1.3  mrg       operator|(_Range&& __r, _Self&& __self)
    879  1.1.1.3  mrg       { return std::forward<_Self>(__self)(std::forward<_Range>(__r)); }
    880  1.1.1.3  mrg 
    881  1.1.1.3  mrg     // Compose the adaptors __lhs and __rhs into a pipeline, returning
    882  1.1.1.3  mrg     // another range adaptor closure object.
    883  1.1.1.3  mrg     template<typename _Lhs, typename _Rhs>
    884  1.1.1.3  mrg       requires derived_from<_Lhs, _RangeAdaptorClosure>
    885  1.1.1.3  mrg 	&& derived_from<_Rhs, _RangeAdaptorClosure>
    886  1.1.1.3  mrg       friend constexpr auto
    887  1.1.1.3  mrg       operator|(_Lhs __lhs, _Rhs __rhs)
    888  1.1.1.3  mrg       { return _Pipe<_Lhs, _Rhs>{std::move(__lhs), std::move(__rhs)}; }
    889  1.1.1.3  mrg   };
    890      1.1  mrg 
    891  1.1.1.3  mrg   // The base class of every range adaptor non-closure.
    892  1.1.1.3  mrg   //
    893  1.1.1.3  mrg   // The static data member _Derived::_S_arity must contain the total number of
    894  1.1.1.3  mrg   // arguments that the adaptor takes, and the class _Derived must introduce
    895  1.1.1.3  mrg   // _RangeAdaptor::operator() into the class scope via a using-declaration.
    896  1.1.1.3  mrg   //
    897  1.1.1.3  mrg   // The optional static data member _Derived::_S_has_simple_extra_args should
    898  1.1.1.3  mrg   // be defined to true if the behavior of this adaptor is independent of the
    899  1.1.1.3  mrg   // constness/value category of the extra arguments.  This data member could
    900  1.1.1.3  mrg   // also be defined as a variable template parameterized by the types of the
    901  1.1.1.3  mrg   // extra arguments.
    902  1.1.1.3  mrg   template<typename _Derived>
    903  1.1.1.3  mrg     struct _RangeAdaptor
    904  1.1.1.3  mrg     {
    905  1.1.1.3  mrg       // Partially apply the arguments __args to the range adaptor _Derived,
    906  1.1.1.3  mrg       // returning a range adaptor closure object.
    907  1.1.1.3  mrg       template<typename... _Args>
    908  1.1.1.3  mrg 	requires __adaptor_partial_app_viable<_Derived, _Args...>
    909  1.1.1.3  mrg 	constexpr auto
    910  1.1.1.3  mrg 	operator()(_Args&&... __args) const
    911  1.1.1.3  mrg 	{
    912  1.1.1.3  mrg 	  return _Partial<_Derived, decay_t<_Args>...>{std::forward<_Args>(__args)...};
    913  1.1.1.3  mrg 	}
    914  1.1.1.3  mrg     };
    915      1.1  mrg 
    916  1.1.1.3  mrg   // True if the range adaptor closure _Adaptor has a simple operator(), i.e.
    917  1.1.1.3  mrg   // one that's not overloaded according to constness or value category of the
    918  1.1.1.3  mrg   // _Adaptor object.
    919  1.1.1.3  mrg   template<typename _Adaptor>
    920  1.1.1.3  mrg     concept __closure_has_simple_call_op = _Adaptor::_S_has_simple_call_op;
    921  1.1.1.3  mrg 
    922  1.1.1.3  mrg   // True if the behavior of the range adaptor non-closure _Adaptor is
    923  1.1.1.3  mrg   // independent of the value category of its extra arguments _Args.
    924  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
    925  1.1.1.3  mrg     concept __adaptor_has_simple_extra_args = _Adaptor::_S_has_simple_extra_args
    926  1.1.1.3  mrg       || _Adaptor::template _S_has_simple_extra_args<_Args...>;
    927  1.1.1.3  mrg 
    928  1.1.1.3  mrg   // A range adaptor closure that represents partial application of
    929  1.1.1.3  mrg   // the range adaptor _Adaptor with arguments _Args.
    930  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
    931  1.1.1.3  mrg     struct _Partial : _RangeAdaptorClosure
    932  1.1.1.3  mrg     {
    933  1.1.1.3  mrg       tuple<_Args...> _M_args;
    934      1.1  mrg 
    935  1.1.1.3  mrg       constexpr
    936  1.1.1.3  mrg       _Partial(_Args... __args)
    937  1.1.1.3  mrg 	: _M_args(std::move(__args)...)
    938  1.1.1.3  mrg       { }
    939      1.1  mrg 
    940  1.1.1.3  mrg       // Invoke _Adaptor with arguments __r, _M_args... according to the
    941  1.1.1.3  mrg       // value category of this _Partial object.
    942  1.1.1.3  mrg       template<typename _Range>
    943  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, const _Args&...>
    944  1.1.1.3  mrg 	constexpr auto
    945  1.1.1.3  mrg 	operator()(_Range&& __r) const &
    946  1.1.1.3  mrg 	{
    947  1.1.1.3  mrg 	  auto __forwarder = [&__r] (const auto&... __args) {
    948  1.1.1.3  mrg 	    return _Adaptor{}(std::forward<_Range>(__r), __args...);
    949  1.1.1.3  mrg 	  };
    950  1.1.1.3  mrg 	  return std::apply(__forwarder, _M_args);
    951  1.1.1.3  mrg 	}
    952      1.1  mrg 
    953  1.1.1.3  mrg       template<typename _Range>
    954  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, _Args...>
    955  1.1.1.3  mrg 	constexpr auto
    956  1.1.1.3  mrg 	operator()(_Range&& __r) &&
    957  1.1.1.3  mrg 	{
    958  1.1.1.3  mrg 	  auto __forwarder = [&__r] (auto&... __args) {
    959  1.1.1.3  mrg 	    return _Adaptor{}(std::forward<_Range>(__r), std::move(__args)...);
    960  1.1.1.3  mrg 	  };
    961  1.1.1.3  mrg 	  return std::apply(__forwarder, _M_args);
    962  1.1.1.3  mrg 	}
    963      1.1  mrg 
    964  1.1.1.3  mrg       template<typename _Range>
    965  1.1.1.3  mrg 	constexpr auto
    966  1.1.1.3  mrg 	operator()(_Range&& __r) const && = delete;
    967  1.1.1.3  mrg     };
    968      1.1  mrg 
    969  1.1.1.3  mrg   // A lightweight specialization of the above primary template for
    970  1.1.1.3  mrg   // the common case where _Adaptor accepts a single extra argument.
    971  1.1.1.3  mrg   template<typename _Adaptor, typename _Arg>
    972  1.1.1.3  mrg     struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure
    973  1.1.1.3  mrg     {
    974  1.1.1.3  mrg       _Arg _M_arg;
    975      1.1  mrg 
    976  1.1.1.3  mrg       constexpr
    977  1.1.1.3  mrg       _Partial(_Arg __arg)
    978  1.1.1.3  mrg 	: _M_arg(std::move(__arg))
    979  1.1.1.3  mrg       { }
    980      1.1  mrg 
    981  1.1.1.3  mrg       template<typename _Range>
    982  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, const _Arg&>
    983  1.1.1.3  mrg 	constexpr auto
    984  1.1.1.3  mrg 	operator()(_Range&& __r) const &
    985  1.1.1.3  mrg 	{ return _Adaptor{}(std::forward<_Range>(__r), _M_arg); }
    986      1.1  mrg 
    987  1.1.1.3  mrg       template<typename _Range>
    988  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, _Arg>
    989  1.1.1.3  mrg 	constexpr auto
    990  1.1.1.3  mrg 	operator()(_Range&& __r) &&
    991  1.1.1.3  mrg 	{ return _Adaptor{}(std::forward<_Range>(__r), std::move(_M_arg)); }
    992      1.1  mrg 
    993  1.1.1.3  mrg       template<typename _Range>
    994  1.1.1.3  mrg 	constexpr auto
    995  1.1.1.3  mrg 	operator()(_Range&& __r) const && = delete;
    996  1.1.1.3  mrg     };
    997  1.1.1.3  mrg 
    998  1.1.1.3  mrg   // Partial specialization of the primary template for the case where the extra
    999  1.1.1.3  mrg   // arguments of the adaptor can always be safely and efficiently forwarded by
   1000  1.1.1.3  mrg   // const reference.  This lets us get away with a single operator() overload,
   1001  1.1.1.3  mrg   // which makes overload resolution failure diagnostics more concise.
   1002  1.1.1.3  mrg   template<typename _Adaptor, typename... _Args>
   1003  1.1.1.3  mrg     requires __adaptor_has_simple_extra_args<_Adaptor, _Args...>
   1004  1.1.1.3  mrg       && (is_trivially_copyable_v<_Args> && ...)
   1005  1.1.1.3  mrg     struct _Partial<_Adaptor, _Args...> : _RangeAdaptorClosure
   1006  1.1.1.3  mrg     {
   1007  1.1.1.3  mrg       tuple<_Args...> _M_args;
   1008  1.1.1.3  mrg 
   1009  1.1.1.3  mrg       constexpr
   1010  1.1.1.3  mrg       _Partial(_Args... __args)
   1011  1.1.1.3  mrg 	: _M_args(std::move(__args)...)
   1012  1.1.1.3  mrg       { }
   1013  1.1.1.3  mrg 
   1014  1.1.1.3  mrg       // Invoke _Adaptor with arguments __r, const _M_args&... regardless
   1015  1.1.1.3  mrg       // of the value category of this _Partial object.
   1016  1.1.1.3  mrg       template<typename _Range>
   1017  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, const _Args&...>
   1018  1.1.1.3  mrg 	constexpr auto
   1019  1.1.1.3  mrg 	operator()(_Range&& __r) const
   1020  1.1.1.3  mrg 	{
   1021  1.1.1.3  mrg 	  auto __forwarder = [&__r] (const auto&... __args) {
   1022  1.1.1.3  mrg 	    return _Adaptor{}(std::forward<_Range>(__r), __args...);
   1023  1.1.1.3  mrg 	  };
   1024  1.1.1.3  mrg 	  return std::apply(__forwarder, _M_args);
   1025  1.1.1.3  mrg 	}
   1026  1.1.1.3  mrg 
   1027  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   1028  1.1.1.3  mrg     };
   1029  1.1.1.3  mrg 
   1030  1.1.1.3  mrg   // A lightweight specialization of the above template for the common case
   1031  1.1.1.3  mrg   // where _Adaptor accepts a single extra argument.
   1032  1.1.1.3  mrg   template<typename _Adaptor, typename _Arg>
   1033  1.1.1.3  mrg     requires __adaptor_has_simple_extra_args<_Adaptor, _Arg>
   1034  1.1.1.3  mrg       && is_trivially_copyable_v<_Arg>
   1035  1.1.1.3  mrg     struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure
   1036  1.1.1.3  mrg     {
   1037  1.1.1.3  mrg       _Arg _M_arg;
   1038  1.1.1.3  mrg 
   1039  1.1.1.3  mrg       constexpr
   1040  1.1.1.3  mrg       _Partial(_Arg __arg)
   1041  1.1.1.3  mrg 	: _M_arg(std::move(__arg))
   1042  1.1.1.3  mrg       { }
   1043  1.1.1.3  mrg 
   1044  1.1.1.3  mrg       template<typename _Range>
   1045  1.1.1.3  mrg 	requires __adaptor_invocable<_Adaptor, _Range, const _Arg&>
   1046  1.1.1.3  mrg 	constexpr auto
   1047  1.1.1.3  mrg 	operator()(_Range&& __r) const
   1048  1.1.1.3  mrg 	{ return _Adaptor{}(std::forward<_Range>(__r), _M_arg); }
   1049  1.1.1.3  mrg 
   1050  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   1051  1.1.1.3  mrg     };
   1052  1.1.1.3  mrg 
   1053  1.1.1.3  mrg   template<typename _Lhs, typename _Rhs, typename _Range>
   1054  1.1.1.3  mrg     concept __pipe_invocable
   1055  1.1.1.3  mrg       = requires { std::declval<_Rhs>()(std::declval<_Lhs>()(std::declval<_Range>())); };
   1056  1.1.1.3  mrg 
   1057  1.1.1.3  mrg   // A range adaptor closure that represents composition of the range
   1058  1.1.1.3  mrg   // adaptor closures _Lhs and _Rhs.
   1059  1.1.1.3  mrg   template<typename _Lhs, typename _Rhs>
   1060  1.1.1.3  mrg     struct _Pipe : _RangeAdaptorClosure
   1061  1.1.1.3  mrg     {
   1062  1.1.1.3  mrg       [[no_unique_address]] _Lhs _M_lhs;
   1063  1.1.1.3  mrg       [[no_unique_address]] _Rhs _M_rhs;
   1064  1.1.1.3  mrg 
   1065  1.1.1.3  mrg       constexpr
   1066  1.1.1.3  mrg       _Pipe(_Lhs __lhs, _Rhs __rhs)
   1067  1.1.1.3  mrg 	: _M_lhs(std::move(__lhs)), _M_rhs(std::move(__rhs))
   1068  1.1.1.3  mrg       { }
   1069  1.1.1.3  mrg 
   1070  1.1.1.3  mrg       // Invoke _M_rhs(_M_lhs(__r)) according to the value category of this
   1071  1.1.1.3  mrg       // range adaptor closure object.
   1072  1.1.1.3  mrg       template<typename _Range>
   1073  1.1.1.3  mrg 	requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
   1074  1.1.1.3  mrg 	constexpr auto
   1075  1.1.1.3  mrg 	operator()(_Range&& __r) const &
   1076  1.1.1.3  mrg 	{ return _M_rhs(_M_lhs(std::forward<_Range>(__r))); }
   1077  1.1.1.3  mrg 
   1078  1.1.1.3  mrg       template<typename _Range>
   1079  1.1.1.3  mrg 	requires __pipe_invocable<_Lhs, _Rhs, _Range>
   1080  1.1.1.3  mrg 	constexpr auto
   1081  1.1.1.3  mrg 	operator()(_Range&& __r) &&
   1082  1.1.1.3  mrg 	{ return std::move(_M_rhs)(std::move(_M_lhs)(std::forward<_Range>(__r))); }
   1083  1.1.1.3  mrg 
   1084  1.1.1.3  mrg       template<typename _Range>
   1085  1.1.1.3  mrg 	constexpr auto
   1086  1.1.1.3  mrg 	operator()(_Range&& __r) const && = delete;
   1087  1.1.1.3  mrg     };
   1088  1.1.1.3  mrg 
   1089  1.1.1.3  mrg   // A partial specialization of the above primary template for the case where
   1090  1.1.1.3  mrg   // both adaptor operands have a simple operator().  This in turn lets us
   1091  1.1.1.3  mrg   // implement composition using a single simple operator(), which makes
   1092  1.1.1.3  mrg   // overload resolution failure diagnostics more concise.
   1093  1.1.1.3  mrg   template<typename _Lhs, typename _Rhs>
   1094  1.1.1.3  mrg     requires __closure_has_simple_call_op<_Lhs>
   1095  1.1.1.3  mrg       && __closure_has_simple_call_op<_Rhs>
   1096  1.1.1.3  mrg     struct _Pipe<_Lhs, _Rhs> : _RangeAdaptorClosure
   1097  1.1.1.3  mrg     {
   1098  1.1.1.3  mrg       [[no_unique_address]] _Lhs _M_lhs;
   1099  1.1.1.3  mrg       [[no_unique_address]] _Rhs _M_rhs;
   1100  1.1.1.3  mrg 
   1101  1.1.1.3  mrg       constexpr
   1102  1.1.1.3  mrg       _Pipe(_Lhs __lhs, _Rhs __rhs)
   1103  1.1.1.3  mrg 	: _M_lhs(std::move(__lhs)), _M_rhs(std::move(__rhs))
   1104  1.1.1.3  mrg       { }
   1105  1.1.1.3  mrg 
   1106  1.1.1.3  mrg       template<typename _Range>
   1107  1.1.1.3  mrg 	requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
   1108  1.1.1.3  mrg 	constexpr auto
   1109  1.1.1.3  mrg 	operator()(_Range&& __r) const
   1110  1.1.1.3  mrg 	{ return _M_rhs(_M_lhs(std::forward<_Range>(__r))); }
   1111  1.1.1.3  mrg 
   1112  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   1113  1.1.1.3  mrg     };
   1114  1.1.1.3  mrg } // namespace views::__adaptor
   1115      1.1  mrg 
   1116      1.1  mrg   template<range _Range> requires is_object_v<_Range>
   1117      1.1  mrg     class ref_view : public view_interface<ref_view<_Range>>
   1118      1.1  mrg     {
   1119      1.1  mrg     private:
   1120  1.1.1.3  mrg       _Range* _M_r;
   1121      1.1  mrg 
   1122      1.1  mrg       static void _S_fun(_Range&); // not defined
   1123      1.1  mrg       static void _S_fun(_Range&&) = delete;
   1124      1.1  mrg 
   1125      1.1  mrg     public:
   1126  1.1.1.3  mrg       template<__detail::__different_from<ref_view> _Tp>
   1127      1.1  mrg 	requires convertible_to<_Tp, _Range&>
   1128      1.1  mrg 	  && requires { _S_fun(declval<_Tp>()); }
   1129      1.1  mrg 	constexpr
   1130      1.1  mrg 	ref_view(_Tp&& __t)
   1131  1.1.1.3  mrg 	noexcept(noexcept(static_cast<_Range&>(std::declval<_Tp>())))
   1132      1.1  mrg 	  : _M_r(std::__addressof(static_cast<_Range&>(std::forward<_Tp>(__t))))
   1133      1.1  mrg 	{ }
   1134      1.1  mrg 
   1135      1.1  mrg       constexpr _Range&
   1136      1.1  mrg       base() const
   1137      1.1  mrg       { return *_M_r; }
   1138      1.1  mrg 
   1139      1.1  mrg       constexpr iterator_t<_Range>
   1140      1.1  mrg       begin() const
   1141      1.1  mrg       { return ranges::begin(*_M_r); }
   1142      1.1  mrg 
   1143      1.1  mrg       constexpr sentinel_t<_Range>
   1144      1.1  mrg       end() const
   1145      1.1  mrg       { return ranges::end(*_M_r); }
   1146      1.1  mrg 
   1147      1.1  mrg       constexpr bool
   1148      1.1  mrg       empty() const requires requires { ranges::empty(*_M_r); }
   1149      1.1  mrg       { return ranges::empty(*_M_r); }
   1150      1.1  mrg 
   1151      1.1  mrg       constexpr auto
   1152      1.1  mrg       size() const requires sized_range<_Range>
   1153      1.1  mrg       { return ranges::size(*_M_r); }
   1154      1.1  mrg 
   1155      1.1  mrg       constexpr auto
   1156      1.1  mrg       data() const requires contiguous_range<_Range>
   1157      1.1  mrg       { return ranges::data(*_M_r); }
   1158      1.1  mrg     };
   1159      1.1  mrg 
   1160      1.1  mrg   template<typename _Range>
   1161      1.1  mrg     ref_view(_Range&) -> ref_view<_Range>;
   1162      1.1  mrg 
   1163      1.1  mrg   template<typename _Tp>
   1164      1.1  mrg     inline constexpr bool enable_borrowed_range<ref_view<_Tp>> = true;
   1165      1.1  mrg 
   1166  1.1.1.3  mrg   template<range _Range>
   1167  1.1.1.3  mrg     requires movable<_Range>
   1168  1.1.1.3  mrg       && (!__detail::__is_initializer_list<remove_cv_t<_Range>>)
   1169  1.1.1.3  mrg     class owning_view : public view_interface<owning_view<_Range>>
   1170  1.1.1.3  mrg     {
   1171  1.1.1.3  mrg     private:
   1172  1.1.1.3  mrg       _Range _M_r = _Range();
   1173  1.1.1.3  mrg 
   1174  1.1.1.3  mrg     public:
   1175  1.1.1.3  mrg       owning_view() requires default_initializable<_Range> = default;
   1176  1.1.1.3  mrg 
   1177  1.1.1.3  mrg       constexpr
   1178  1.1.1.3  mrg       owning_view(_Range&& __t)
   1179  1.1.1.3  mrg       noexcept(is_nothrow_move_constructible_v<_Range>)
   1180  1.1.1.3  mrg 	: _M_r(std::move(__t))
   1181  1.1.1.3  mrg       { }
   1182  1.1.1.3  mrg 
   1183  1.1.1.3  mrg       owning_view(owning_view&&) = default;
   1184  1.1.1.3  mrg       owning_view& operator=(owning_view&&) = default;
   1185  1.1.1.3  mrg 
   1186  1.1.1.3  mrg       constexpr _Range&
   1187  1.1.1.3  mrg       base() & noexcept
   1188  1.1.1.3  mrg       { return _M_r; }
   1189  1.1.1.3  mrg 
   1190  1.1.1.3  mrg       constexpr const _Range&
   1191  1.1.1.3  mrg       base() const& noexcept
   1192  1.1.1.3  mrg       { return _M_r; }
   1193  1.1.1.3  mrg 
   1194  1.1.1.3  mrg       constexpr _Range&&
   1195  1.1.1.3  mrg       base() && noexcept
   1196  1.1.1.3  mrg       { return std::move(_M_r); }
   1197  1.1.1.3  mrg 
   1198  1.1.1.3  mrg       constexpr const _Range&&
   1199  1.1.1.3  mrg       base() const&& noexcept
   1200  1.1.1.3  mrg       { return std::move(_M_r); }
   1201  1.1.1.3  mrg 
   1202  1.1.1.3  mrg       constexpr iterator_t<_Range>
   1203  1.1.1.3  mrg       begin()
   1204  1.1.1.3  mrg       { return ranges::begin(_M_r); }
   1205  1.1.1.3  mrg 
   1206  1.1.1.3  mrg       constexpr sentinel_t<_Range>
   1207  1.1.1.3  mrg       end()
   1208  1.1.1.3  mrg       { return ranges::end(_M_r); }
   1209  1.1.1.3  mrg 
   1210  1.1.1.3  mrg       constexpr auto
   1211  1.1.1.3  mrg       begin() const requires range<const _Range>
   1212  1.1.1.3  mrg       { return ranges::begin(_M_r); }
   1213  1.1.1.3  mrg 
   1214  1.1.1.3  mrg       constexpr auto
   1215  1.1.1.3  mrg       end() const requires range<const _Range>
   1216  1.1.1.3  mrg       { return ranges::end(_M_r); }
   1217  1.1.1.3  mrg 
   1218  1.1.1.3  mrg       constexpr bool
   1219  1.1.1.3  mrg       empty() requires requires { ranges::empty(_M_r); }
   1220  1.1.1.3  mrg       { return ranges::empty(_M_r); }
   1221  1.1.1.3  mrg 
   1222  1.1.1.3  mrg       constexpr bool
   1223  1.1.1.3  mrg       empty() const requires requires { ranges::empty(_M_r); }
   1224  1.1.1.3  mrg       { return ranges::empty(_M_r); }
   1225  1.1.1.3  mrg 
   1226  1.1.1.3  mrg       constexpr auto
   1227  1.1.1.3  mrg       size() requires sized_range<_Range>
   1228  1.1.1.3  mrg       { return ranges::size(_M_r); }
   1229  1.1.1.3  mrg 
   1230  1.1.1.3  mrg       constexpr auto
   1231  1.1.1.3  mrg       size() const requires sized_range<const _Range>
   1232  1.1.1.3  mrg       { return ranges::size(_M_r); }
   1233  1.1.1.3  mrg 
   1234  1.1.1.3  mrg       constexpr auto
   1235  1.1.1.3  mrg       data() requires contiguous_range<_Range>
   1236  1.1.1.3  mrg       { return ranges::data(_M_r); }
   1237  1.1.1.3  mrg 
   1238  1.1.1.3  mrg       constexpr auto
   1239  1.1.1.3  mrg       data() const requires contiguous_range<const _Range>
   1240  1.1.1.3  mrg       { return ranges::data(_M_r); }
   1241  1.1.1.3  mrg     };
   1242  1.1.1.3  mrg 
   1243  1.1.1.3  mrg   template<typename _Tp>
   1244  1.1.1.3  mrg     inline constexpr bool enable_borrowed_range<owning_view<_Tp>>
   1245  1.1.1.3  mrg       = enable_borrowed_range<_Tp>;
   1246  1.1.1.3  mrg 
   1247      1.1  mrg   namespace views
   1248      1.1  mrg   {
   1249  1.1.1.3  mrg     namespace __detail
   1250  1.1.1.3  mrg     {
   1251  1.1.1.3  mrg       template<typename _Range>
   1252  1.1.1.3  mrg 	concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; };
   1253  1.1.1.3  mrg 
   1254  1.1.1.3  mrg       template<typename _Range>
   1255  1.1.1.3  mrg 	concept __can_owning_view = requires { owning_view{std::declval<_Range>()}; };
   1256  1.1.1.3  mrg     } // namespace __detail
   1257  1.1.1.3  mrg 
   1258  1.1.1.3  mrg     struct _All : __adaptor::_RangeAdaptorClosure
   1259  1.1.1.3  mrg     {
   1260  1.1.1.3  mrg       template<typename _Range>
   1261  1.1.1.3  mrg 	static constexpr bool
   1262  1.1.1.3  mrg 	_S_noexcept()
   1263  1.1.1.3  mrg 	{
   1264  1.1.1.3  mrg 	  if constexpr (view<decay_t<_Range>>)
   1265  1.1.1.3  mrg 	    return is_nothrow_constructible_v<decay_t<_Range>, _Range>;
   1266  1.1.1.3  mrg 	  else if constexpr (__detail::__can_ref_view<_Range>)
   1267  1.1.1.3  mrg 	    return true;
   1268  1.1.1.3  mrg 	  else
   1269  1.1.1.3  mrg 	    return noexcept(owning_view{std::declval<_Range>()});
   1270  1.1.1.3  mrg 	}
   1271  1.1.1.3  mrg 
   1272  1.1.1.3  mrg       template<viewable_range _Range>
   1273  1.1.1.3  mrg 	requires view<decay_t<_Range>>
   1274  1.1.1.3  mrg 	  || __detail::__can_ref_view<_Range>
   1275  1.1.1.3  mrg 	  || __detail::__can_owning_view<_Range>
   1276  1.1.1.3  mrg 	constexpr auto
   1277  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r) const
   1278  1.1.1.3  mrg 	noexcept(_S_noexcept<_Range>())
   1279  1.1.1.3  mrg 	{
   1280  1.1.1.3  mrg 	  if constexpr (view<decay_t<_Range>>)
   1281  1.1.1.3  mrg 	    return std::forward<_Range>(__r);
   1282  1.1.1.3  mrg 	  else if constexpr (__detail::__can_ref_view<_Range>)
   1283  1.1.1.3  mrg 	    return ref_view{std::forward<_Range>(__r)};
   1284  1.1.1.3  mrg 	  else
   1285  1.1.1.3  mrg 	    return owning_view{std::forward<_Range>(__r)};
   1286  1.1.1.3  mrg 	}
   1287  1.1.1.3  mrg 
   1288  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   1289  1.1.1.3  mrg     };
   1290  1.1.1.3  mrg 
   1291  1.1.1.3  mrg     inline constexpr _All all;
   1292      1.1  mrg 
   1293      1.1  mrg     template<viewable_range _Range>
   1294      1.1  mrg       using all_t = decltype(all(std::declval<_Range>()));
   1295      1.1  mrg   } // namespace views
   1296      1.1  mrg 
   1297      1.1  mrg   namespace __detail
   1298      1.1  mrg   {
   1299  1.1.1.3  mrg     template<typename _Tp>
   1300  1.1.1.3  mrg       struct __non_propagating_cache
   1301      1.1  mrg       {
   1302  1.1.1.3  mrg 	// When _Tp is not an object type (e.g. is a reference type), we make
   1303  1.1.1.3  mrg 	// __non_propagating_cache<_Tp> empty rather than ill-formed so that
   1304  1.1.1.3  mrg 	// users can easily conditionally declare data members with this type
   1305  1.1.1.3  mrg 	// (such as join_view::_M_inner).
   1306  1.1.1.3  mrg       };
   1307      1.1  mrg 
   1308  1.1.1.3  mrg     template<typename _Tp>
   1309  1.1.1.3  mrg       requires is_object_v<_Tp>
   1310  1.1.1.3  mrg       struct __non_propagating_cache<_Tp>
   1311  1.1.1.3  mrg       : protected _Optional_base<_Tp>
   1312      1.1  mrg       {
   1313  1.1.1.3  mrg 	__non_propagating_cache() = default;
   1314      1.1  mrg 
   1315  1.1.1.3  mrg 	constexpr
   1316  1.1.1.3  mrg 	__non_propagating_cache(const __non_propagating_cache&) noexcept
   1317  1.1.1.3  mrg 	{ }
   1318      1.1  mrg 
   1319  1.1.1.3  mrg 	constexpr
   1320  1.1.1.3  mrg 	__non_propagating_cache(__non_propagating_cache&& __other) noexcept
   1321  1.1.1.3  mrg 	{ __other._M_reset(); }
   1322  1.1.1.3  mrg 
   1323  1.1.1.3  mrg 	constexpr __non_propagating_cache&
   1324  1.1.1.3  mrg 	operator=(const __non_propagating_cache& __other) noexcept
   1325  1.1.1.3  mrg 	{
   1326  1.1.1.3  mrg 	  if (std::__addressof(__other) != this)
   1327  1.1.1.3  mrg 	    this->_M_reset();
   1328  1.1.1.3  mrg 	  return *this;
   1329  1.1.1.3  mrg 	}
   1330  1.1.1.3  mrg 
   1331  1.1.1.3  mrg 	constexpr __non_propagating_cache&
   1332  1.1.1.3  mrg 	operator=(__non_propagating_cache&& __other) noexcept
   1333  1.1.1.3  mrg 	{
   1334  1.1.1.3  mrg 	  this->_M_reset();
   1335  1.1.1.3  mrg 	  __other._M_reset();
   1336  1.1.1.3  mrg 	  return *this;
   1337  1.1.1.3  mrg 	}
   1338  1.1.1.3  mrg 
   1339  1.1.1.3  mrg 	constexpr __non_propagating_cache&
   1340  1.1.1.3  mrg 	operator=(_Tp __val)
   1341  1.1.1.3  mrg 	{
   1342  1.1.1.3  mrg 	  this->_M_reset();
   1343  1.1.1.3  mrg 	  this->_M_payload._M_construct(std::move(__val));
   1344  1.1.1.3  mrg 	  return *this;
   1345  1.1.1.3  mrg 	}
   1346  1.1.1.3  mrg 
   1347  1.1.1.3  mrg 	constexpr explicit
   1348  1.1.1.3  mrg 	operator bool() const noexcept
   1349  1.1.1.3  mrg 	{ return this->_M_is_engaged(); }
   1350  1.1.1.3  mrg 
   1351  1.1.1.3  mrg 	constexpr _Tp&
   1352  1.1.1.3  mrg 	operator*() noexcept
   1353  1.1.1.3  mrg 	{ return this->_M_get(); }
   1354  1.1.1.3  mrg 
   1355  1.1.1.3  mrg 	constexpr const _Tp&
   1356  1.1.1.3  mrg 	operator*() const noexcept
   1357  1.1.1.3  mrg 	{ return this->_M_get(); }
   1358  1.1.1.3  mrg 
   1359  1.1.1.3  mrg 	template<typename _Iter>
   1360  1.1.1.3  mrg 	  constexpr _Tp&
   1361  1.1.1.3  mrg 	  _M_emplace_deref(const _Iter& __i)
   1362  1.1.1.3  mrg 	  {
   1363  1.1.1.3  mrg 	    this->_M_reset();
   1364  1.1.1.3  mrg 	    auto __f = [] (auto& __x) { return *__x; };
   1365  1.1.1.3  mrg 	    this->_M_payload._M_apply(_Optional_func{__f}, __i);
   1366  1.1.1.3  mrg 	    return this->_M_get();
   1367      1.1  mrg 	  }
   1368  1.1.1.3  mrg       };
   1369      1.1  mrg 
   1370      1.1  mrg     template<range _Range>
   1371      1.1  mrg       struct _CachedPosition
   1372      1.1  mrg       {
   1373      1.1  mrg 	constexpr bool
   1374      1.1  mrg 	_M_has_value() const
   1375      1.1  mrg 	{ return false; }
   1376      1.1  mrg 
   1377      1.1  mrg 	constexpr iterator_t<_Range>
   1378      1.1  mrg 	_M_get(const _Range&) const
   1379      1.1  mrg 	{
   1380      1.1  mrg 	  __glibcxx_assert(false);
   1381      1.1  mrg 	  __builtin_unreachable();
   1382      1.1  mrg 	}
   1383      1.1  mrg 
   1384      1.1  mrg 	constexpr void
   1385      1.1  mrg 	_M_set(const _Range&, const iterator_t<_Range>&) const
   1386      1.1  mrg 	{ }
   1387      1.1  mrg       };
   1388      1.1  mrg 
   1389      1.1  mrg     template<forward_range _Range>
   1390      1.1  mrg       struct _CachedPosition<_Range>
   1391  1.1.1.3  mrg 	: protected __non_propagating_cache<iterator_t<_Range>>
   1392      1.1  mrg       {
   1393      1.1  mrg 	constexpr bool
   1394      1.1  mrg 	_M_has_value() const
   1395  1.1.1.3  mrg 	{ return this->_M_is_engaged(); }
   1396      1.1  mrg 
   1397      1.1  mrg 	constexpr iterator_t<_Range>
   1398      1.1  mrg 	_M_get(const _Range&) const
   1399      1.1  mrg 	{
   1400      1.1  mrg 	  __glibcxx_assert(_M_has_value());
   1401  1.1.1.3  mrg 	  return **this;
   1402      1.1  mrg 	}
   1403      1.1  mrg 
   1404      1.1  mrg 	constexpr void
   1405      1.1  mrg 	_M_set(const _Range&, const iterator_t<_Range>& __it)
   1406      1.1  mrg 	{
   1407      1.1  mrg 	  __glibcxx_assert(!_M_has_value());
   1408  1.1.1.3  mrg 	  std::construct_at(std::__addressof(this->_M_payload._M_payload),
   1409  1.1.1.3  mrg 			    in_place, __it);
   1410  1.1.1.3  mrg 	  this->_M_payload._M_engaged = true;
   1411      1.1  mrg 	}
   1412      1.1  mrg       };
   1413      1.1  mrg 
   1414      1.1  mrg     template<random_access_range _Range>
   1415      1.1  mrg       requires (sizeof(range_difference_t<_Range>)
   1416      1.1  mrg 		<= sizeof(iterator_t<_Range>))
   1417      1.1  mrg       struct _CachedPosition<_Range>
   1418      1.1  mrg       {
   1419      1.1  mrg       private:
   1420      1.1  mrg 	range_difference_t<_Range> _M_offset = -1;
   1421      1.1  mrg 
   1422      1.1  mrg       public:
   1423  1.1.1.3  mrg 	_CachedPosition() = default;
   1424  1.1.1.3  mrg 
   1425  1.1.1.3  mrg 	constexpr
   1426  1.1.1.3  mrg 	_CachedPosition(const _CachedPosition&) = default;
   1427  1.1.1.3  mrg 
   1428  1.1.1.3  mrg 	constexpr
   1429  1.1.1.3  mrg 	_CachedPosition(_CachedPosition&& __other) noexcept
   1430  1.1.1.3  mrg 	{ *this = std::move(__other); }
   1431  1.1.1.3  mrg 
   1432  1.1.1.3  mrg 	constexpr _CachedPosition&
   1433  1.1.1.3  mrg 	operator=(const _CachedPosition&) = default;
   1434  1.1.1.3  mrg 
   1435  1.1.1.3  mrg 	constexpr _CachedPosition&
   1436  1.1.1.3  mrg 	operator=(_CachedPosition&& __other) noexcept
   1437  1.1.1.3  mrg 	{
   1438  1.1.1.3  mrg 	  // Propagate the cached offset, but invalidate the source.
   1439  1.1.1.3  mrg 	  _M_offset = __other._M_offset;
   1440  1.1.1.3  mrg 	  __other._M_offset = -1;
   1441  1.1.1.3  mrg 	  return *this;
   1442  1.1.1.3  mrg 	}
   1443  1.1.1.3  mrg 
   1444      1.1  mrg 	constexpr bool
   1445      1.1  mrg 	_M_has_value() const
   1446      1.1  mrg 	{ return _M_offset >= 0; }
   1447      1.1  mrg 
   1448      1.1  mrg 	constexpr iterator_t<_Range>
   1449      1.1  mrg 	_M_get(_Range& __r) const
   1450      1.1  mrg 	{
   1451      1.1  mrg 	  __glibcxx_assert(_M_has_value());
   1452      1.1  mrg 	  return ranges::begin(__r) + _M_offset;
   1453      1.1  mrg 	}
   1454      1.1  mrg 
   1455      1.1  mrg 	constexpr void
   1456      1.1  mrg 	_M_set(_Range& __r, const iterator_t<_Range>& __it)
   1457      1.1  mrg 	{
   1458      1.1  mrg 	  __glibcxx_assert(!_M_has_value());
   1459      1.1  mrg 	  _M_offset = __it - ranges::begin(__r);
   1460      1.1  mrg 	}
   1461      1.1  mrg       };
   1462      1.1  mrg   } // namespace __detail
   1463      1.1  mrg 
   1464      1.1  mrg   namespace __detail
   1465      1.1  mrg   {
   1466      1.1  mrg     template<typename _Base>
   1467      1.1  mrg       struct __filter_view_iter_cat
   1468      1.1  mrg       { };
   1469      1.1  mrg 
   1470      1.1  mrg     template<forward_range _Base>
   1471      1.1  mrg       struct __filter_view_iter_cat<_Base>
   1472      1.1  mrg       {
   1473      1.1  mrg       private:
   1474      1.1  mrg 	static auto
   1475      1.1  mrg 	_S_iter_cat()
   1476      1.1  mrg 	{
   1477      1.1  mrg 	  using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category;
   1478      1.1  mrg 	  if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
   1479      1.1  mrg 	    return bidirectional_iterator_tag{};
   1480      1.1  mrg 	  else if constexpr (derived_from<_Cat, forward_iterator_tag>)
   1481      1.1  mrg 	    return forward_iterator_tag{};
   1482      1.1  mrg 	  else
   1483      1.1  mrg 	    return _Cat{};
   1484      1.1  mrg 	}
   1485      1.1  mrg       public:
   1486      1.1  mrg 	using iterator_category = decltype(_S_iter_cat());
   1487      1.1  mrg       };
   1488      1.1  mrg   } // namespace __detail
   1489      1.1  mrg 
   1490      1.1  mrg   template<input_range _Vp,
   1491      1.1  mrg 	   indirect_unary_predicate<iterator_t<_Vp>> _Pred>
   1492      1.1  mrg     requires view<_Vp> && is_object_v<_Pred>
   1493      1.1  mrg     class filter_view : public view_interface<filter_view<_Vp, _Pred>>
   1494      1.1  mrg     {
   1495      1.1  mrg     private:
   1496      1.1  mrg       struct _Sentinel;
   1497      1.1  mrg 
   1498      1.1  mrg       struct _Iterator : __detail::__filter_view_iter_cat<_Vp>
   1499      1.1  mrg       {
   1500      1.1  mrg       private:
   1501      1.1  mrg 	static constexpr auto
   1502      1.1  mrg 	_S_iter_concept()
   1503      1.1  mrg 	{
   1504      1.1  mrg 	  if constexpr (bidirectional_range<_Vp>)
   1505      1.1  mrg 	    return bidirectional_iterator_tag{};
   1506      1.1  mrg 	  else if constexpr (forward_range<_Vp>)
   1507      1.1  mrg 	    return forward_iterator_tag{};
   1508      1.1  mrg 	  else
   1509      1.1  mrg 	    return input_iterator_tag{};
   1510      1.1  mrg 	}
   1511      1.1  mrg 
   1512      1.1  mrg 	friend filter_view;
   1513      1.1  mrg 
   1514      1.1  mrg 	using _Vp_iter = iterator_t<_Vp>;
   1515      1.1  mrg 
   1516      1.1  mrg 	_Vp_iter _M_current = _Vp_iter();
   1517      1.1  mrg 	filter_view* _M_parent = nullptr;
   1518      1.1  mrg 
   1519      1.1  mrg       public:
   1520      1.1  mrg 	using iterator_concept = decltype(_S_iter_concept());
   1521      1.1  mrg 	// iterator_category defined in __filter_view_iter_cat
   1522      1.1  mrg 	using value_type = range_value_t<_Vp>;
   1523      1.1  mrg 	using difference_type = range_difference_t<_Vp>;
   1524      1.1  mrg 
   1525      1.1  mrg 	_Iterator() requires default_initializable<_Vp_iter> = default;
   1526      1.1  mrg 
   1527      1.1  mrg 	constexpr
   1528      1.1  mrg 	_Iterator(filter_view* __parent, _Vp_iter __current)
   1529      1.1  mrg 	  : _M_current(std::move(__current)),
   1530      1.1  mrg 	    _M_parent(__parent)
   1531      1.1  mrg 	{ }
   1532      1.1  mrg 
   1533      1.1  mrg 	constexpr const _Vp_iter&
   1534      1.1  mrg 	base() const & noexcept
   1535      1.1  mrg 	{ return _M_current; }
   1536      1.1  mrg 
   1537      1.1  mrg 	constexpr _Vp_iter
   1538      1.1  mrg 	base() &&
   1539      1.1  mrg 	{ return std::move(_M_current); }
   1540      1.1  mrg 
   1541      1.1  mrg 	constexpr range_reference_t<_Vp>
   1542      1.1  mrg 	operator*() const
   1543      1.1  mrg 	{ return *_M_current; }
   1544      1.1  mrg 
   1545      1.1  mrg 	constexpr _Vp_iter
   1546      1.1  mrg 	operator->() const
   1547      1.1  mrg 	  requires __detail::__has_arrow<_Vp_iter>
   1548      1.1  mrg 	    && copyable<_Vp_iter>
   1549      1.1  mrg 	{ return _M_current; }
   1550      1.1  mrg 
   1551      1.1  mrg 	constexpr _Iterator&
   1552      1.1  mrg 	operator++()
   1553      1.1  mrg 	{
   1554  1.1.1.3  mrg 	  _M_current = ranges::find_if(std::move(++_M_current),
   1555  1.1.1.3  mrg 				       ranges::end(_M_parent->_M_base),
   1556  1.1.1.3  mrg 				       std::ref(*_M_parent->_M_pred));
   1557      1.1  mrg 	  return *this;
   1558      1.1  mrg 	}
   1559      1.1  mrg 
   1560      1.1  mrg 	constexpr void
   1561      1.1  mrg 	operator++(int)
   1562      1.1  mrg 	{ ++*this; }
   1563      1.1  mrg 
   1564      1.1  mrg 	constexpr _Iterator
   1565      1.1  mrg 	operator++(int) requires forward_range<_Vp>
   1566      1.1  mrg 	{
   1567      1.1  mrg 	  auto __tmp = *this;
   1568      1.1  mrg 	  ++*this;
   1569      1.1  mrg 	  return __tmp;
   1570      1.1  mrg 	}
   1571      1.1  mrg 
   1572      1.1  mrg 	constexpr _Iterator&
   1573      1.1  mrg 	operator--() requires bidirectional_range<_Vp>
   1574      1.1  mrg 	{
   1575      1.1  mrg 	  do
   1576      1.1  mrg 	    --_M_current;
   1577      1.1  mrg 	  while (!std::__invoke(*_M_parent->_M_pred, *_M_current));
   1578      1.1  mrg 	  return *this;
   1579      1.1  mrg 	}
   1580      1.1  mrg 
   1581      1.1  mrg 	constexpr _Iterator
   1582      1.1  mrg 	operator--(int) requires bidirectional_range<_Vp>
   1583      1.1  mrg 	{
   1584      1.1  mrg 	  auto __tmp = *this;
   1585      1.1  mrg 	  --*this;
   1586      1.1  mrg 	  return __tmp;
   1587      1.1  mrg 	}
   1588      1.1  mrg 
   1589      1.1  mrg 	friend constexpr bool
   1590      1.1  mrg 	operator==(const _Iterator& __x, const _Iterator& __y)
   1591      1.1  mrg 	  requires equality_comparable<_Vp_iter>
   1592      1.1  mrg 	{ return __x._M_current == __y._M_current; }
   1593      1.1  mrg 
   1594      1.1  mrg 	friend constexpr range_rvalue_reference_t<_Vp>
   1595      1.1  mrg 	iter_move(const _Iterator& __i)
   1596      1.1  mrg 	  noexcept(noexcept(ranges::iter_move(__i._M_current)))
   1597      1.1  mrg 	{ return ranges::iter_move(__i._M_current); }
   1598      1.1  mrg 
   1599      1.1  mrg 	friend constexpr void
   1600      1.1  mrg 	iter_swap(const _Iterator& __x, const _Iterator& __y)
   1601      1.1  mrg 	  noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
   1602      1.1  mrg 	  requires indirectly_swappable<_Vp_iter>
   1603      1.1  mrg 	{ ranges::iter_swap(__x._M_current, __y._M_current); }
   1604      1.1  mrg       };
   1605      1.1  mrg 
   1606      1.1  mrg       struct _Sentinel
   1607      1.1  mrg       {
   1608      1.1  mrg       private:
   1609      1.1  mrg 	sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
   1610      1.1  mrg 
   1611      1.1  mrg 	constexpr bool
   1612      1.1  mrg 	__equal(const _Iterator& __i) const
   1613      1.1  mrg 	{ return __i._M_current == _M_end; }
   1614      1.1  mrg 
   1615      1.1  mrg       public:
   1616      1.1  mrg 	_Sentinel() = default;
   1617      1.1  mrg 
   1618      1.1  mrg 	constexpr explicit
   1619      1.1  mrg 	_Sentinel(filter_view* __parent)
   1620      1.1  mrg 	  : _M_end(ranges::end(__parent->_M_base))
   1621      1.1  mrg 	{ }
   1622      1.1  mrg 
   1623      1.1  mrg 	constexpr sentinel_t<_Vp>
   1624      1.1  mrg 	base() const
   1625      1.1  mrg 	{ return _M_end; }
   1626      1.1  mrg 
   1627      1.1  mrg 	friend constexpr bool
   1628      1.1  mrg 	operator==(const _Iterator& __x, const _Sentinel& __y)
   1629      1.1  mrg 	{ return __y.__equal(__x); }
   1630      1.1  mrg       };
   1631      1.1  mrg 
   1632      1.1  mrg       _Vp _M_base = _Vp();
   1633  1.1.1.3  mrg       [[no_unique_address]] __detail::__box<_Pred> _M_pred;
   1634      1.1  mrg       [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
   1635      1.1  mrg 
   1636      1.1  mrg     public:
   1637  1.1.1.3  mrg       filter_view() requires (default_initializable<_Vp>
   1638  1.1.1.3  mrg 			      && default_initializable<_Pred>)
   1639  1.1.1.3  mrg 	= default;
   1640      1.1  mrg 
   1641      1.1  mrg       constexpr
   1642      1.1  mrg       filter_view(_Vp __base, _Pred __pred)
   1643      1.1  mrg 	: _M_base(std::move(__base)), _M_pred(std::move(__pred))
   1644      1.1  mrg       { }
   1645      1.1  mrg 
   1646      1.1  mrg       constexpr _Vp
   1647      1.1  mrg       base() const& requires copy_constructible<_Vp>
   1648      1.1  mrg       { return _M_base; }
   1649      1.1  mrg 
   1650      1.1  mrg       constexpr _Vp
   1651      1.1  mrg       base() &&
   1652      1.1  mrg       { return std::move(_M_base); }
   1653      1.1  mrg 
   1654      1.1  mrg       constexpr const _Pred&
   1655      1.1  mrg       pred() const
   1656      1.1  mrg       { return *_M_pred; }
   1657      1.1  mrg 
   1658      1.1  mrg       constexpr _Iterator
   1659      1.1  mrg       begin()
   1660      1.1  mrg       {
   1661      1.1  mrg 	if (_M_cached_begin._M_has_value())
   1662      1.1  mrg 	  return {this, _M_cached_begin._M_get(_M_base)};
   1663      1.1  mrg 
   1664      1.1  mrg 	__glibcxx_assert(_M_pred.has_value());
   1665  1.1.1.3  mrg 	auto __it = ranges::find_if(ranges::begin(_M_base),
   1666  1.1.1.3  mrg 				    ranges::end(_M_base),
   1667  1.1.1.3  mrg 				    std::ref(*_M_pred));
   1668      1.1  mrg 	_M_cached_begin._M_set(_M_base, __it);
   1669      1.1  mrg 	return {this, std::move(__it)};
   1670      1.1  mrg       }
   1671      1.1  mrg 
   1672      1.1  mrg       constexpr auto
   1673      1.1  mrg       end()
   1674      1.1  mrg       {
   1675      1.1  mrg 	if constexpr (common_range<_Vp>)
   1676      1.1  mrg 	  return _Iterator{this, ranges::end(_M_base)};
   1677      1.1  mrg 	else
   1678      1.1  mrg 	  return _Sentinel{this};
   1679      1.1  mrg       }
   1680      1.1  mrg     };
   1681      1.1  mrg 
   1682      1.1  mrg   template<typename _Range, typename _Pred>
   1683      1.1  mrg     filter_view(_Range&&, _Pred) -> filter_view<views::all_t<_Range>, _Pred>;
   1684      1.1  mrg 
   1685      1.1  mrg   namespace views
   1686      1.1  mrg   {
   1687  1.1.1.3  mrg     namespace __detail
   1688  1.1.1.3  mrg     {
   1689  1.1.1.3  mrg       template<typename _Range, typename _Pred>
   1690  1.1.1.3  mrg 	concept __can_filter_view
   1691  1.1.1.3  mrg 	  = requires { filter_view(std::declval<_Range>(), std::declval<_Pred>()); };
   1692  1.1.1.3  mrg     } // namespace __detail
   1693  1.1.1.3  mrg 
   1694  1.1.1.3  mrg     struct _Filter : __adaptor::_RangeAdaptor<_Filter>
   1695  1.1.1.3  mrg     {
   1696  1.1.1.3  mrg       template<viewable_range _Range, typename _Pred>
   1697  1.1.1.3  mrg 	requires __detail::__can_filter_view<_Range, _Pred>
   1698  1.1.1.3  mrg 	constexpr auto
   1699  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const
   1700  1.1.1.3  mrg 	{
   1701  1.1.1.3  mrg 	  return filter_view(std::forward<_Range>(__r), std::forward<_Pred>(__p));
   1702  1.1.1.3  mrg 	}
   1703  1.1.1.3  mrg 
   1704  1.1.1.3  mrg       using _RangeAdaptor<_Filter>::operator();
   1705  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   1706  1.1.1.3  mrg       static constexpr bool _S_has_simple_extra_args = true;
   1707  1.1.1.3  mrg     };
   1708  1.1.1.3  mrg 
   1709  1.1.1.3  mrg     inline constexpr _Filter filter;
   1710      1.1  mrg   } // namespace views
   1711      1.1  mrg 
   1712      1.1  mrg   template<input_range _Vp, copy_constructible _Fp>
   1713      1.1  mrg     requires view<_Vp> && is_object_v<_Fp>
   1714      1.1  mrg       && regular_invocable<_Fp&, range_reference_t<_Vp>>
   1715      1.1  mrg       && std::__detail::__can_reference<invoke_result_t<_Fp&,
   1716      1.1  mrg 							range_reference_t<_Vp>>>
   1717      1.1  mrg     class transform_view : public view_interface<transform_view<_Vp, _Fp>>
   1718      1.1  mrg     {
   1719      1.1  mrg     private:
   1720      1.1  mrg       template<bool _Const>
   1721      1.1  mrg 	using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   1722      1.1  mrg 
   1723      1.1  mrg       template<bool _Const>
   1724      1.1  mrg 	struct __iter_cat
   1725      1.1  mrg 	{ };
   1726      1.1  mrg 
   1727      1.1  mrg       template<bool _Const>
   1728      1.1  mrg 	requires forward_range<_Base<_Const>>
   1729      1.1  mrg 	struct __iter_cat<_Const>
   1730      1.1  mrg 	{
   1731      1.1  mrg 	private:
   1732      1.1  mrg 	  static auto
   1733      1.1  mrg 	  _S_iter_cat()
   1734      1.1  mrg 	  {
   1735      1.1  mrg 	    using _Base = transform_view::_Base<_Const>;
   1736      1.1  mrg 	    using _Res = invoke_result_t<_Fp&, range_reference_t<_Base>>;
   1737      1.1  mrg 	    if constexpr (is_lvalue_reference_v<_Res>)
   1738      1.1  mrg 	      {
   1739      1.1  mrg 		using _Cat
   1740      1.1  mrg 		  = typename iterator_traits<iterator_t<_Base>>::iterator_category;
   1741      1.1  mrg 		if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
   1742      1.1  mrg 		  return random_access_iterator_tag{};
   1743      1.1  mrg 		else
   1744      1.1  mrg 		  return _Cat{};
   1745      1.1  mrg 	      }
   1746      1.1  mrg 	    else
   1747      1.1  mrg 	      return input_iterator_tag{};
   1748      1.1  mrg 	  }
   1749      1.1  mrg 	public:
   1750      1.1  mrg 	  using iterator_category = decltype(_S_iter_cat());
   1751      1.1  mrg 	};
   1752      1.1  mrg 
   1753      1.1  mrg       template<bool _Const>
   1754      1.1  mrg 	struct _Sentinel;
   1755      1.1  mrg 
   1756      1.1  mrg       template<bool _Const>
   1757      1.1  mrg 	struct _Iterator : __iter_cat<_Const>
   1758      1.1  mrg 	{
   1759      1.1  mrg 	private:
   1760      1.1  mrg 	  using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
   1761      1.1  mrg 	  using _Base = transform_view::_Base<_Const>;
   1762      1.1  mrg 
   1763      1.1  mrg 	  static auto
   1764      1.1  mrg 	  _S_iter_concept()
   1765      1.1  mrg 	  {
   1766      1.1  mrg 	    if constexpr (random_access_range<_Base>)
   1767      1.1  mrg 	      return random_access_iterator_tag{};
   1768      1.1  mrg 	    else if constexpr (bidirectional_range<_Base>)
   1769      1.1  mrg 	      return bidirectional_iterator_tag{};
   1770      1.1  mrg 	    else if constexpr (forward_range<_Base>)
   1771      1.1  mrg 	      return forward_iterator_tag{};
   1772      1.1  mrg 	    else
   1773      1.1  mrg 	      return input_iterator_tag{};
   1774      1.1  mrg 	  }
   1775      1.1  mrg 
   1776      1.1  mrg 	  using _Base_iter = iterator_t<_Base>;
   1777      1.1  mrg 
   1778      1.1  mrg 	  _Base_iter _M_current = _Base_iter();
   1779      1.1  mrg 	  _Parent* _M_parent = nullptr;
   1780      1.1  mrg 
   1781      1.1  mrg 	public:
   1782      1.1  mrg 	  using iterator_concept = decltype(_S_iter_concept());
   1783      1.1  mrg 	  // iterator_category defined in __transform_view_iter_cat
   1784      1.1  mrg 	  using value_type
   1785      1.1  mrg 	    = remove_cvref_t<invoke_result_t<_Fp&, range_reference_t<_Base>>>;
   1786      1.1  mrg 	  using difference_type = range_difference_t<_Base>;
   1787      1.1  mrg 
   1788      1.1  mrg 	  _Iterator() requires default_initializable<_Base_iter> = default;
   1789      1.1  mrg 
   1790      1.1  mrg 	  constexpr
   1791      1.1  mrg 	  _Iterator(_Parent* __parent, _Base_iter __current)
   1792      1.1  mrg 	    : _M_current(std::move(__current)),
   1793      1.1  mrg 	      _M_parent(__parent)
   1794      1.1  mrg 	  { }
   1795      1.1  mrg 
   1796      1.1  mrg 	  constexpr
   1797      1.1  mrg 	  _Iterator(_Iterator<!_Const> __i)
   1798      1.1  mrg 	    requires _Const
   1799      1.1  mrg 	      && convertible_to<iterator_t<_Vp>, _Base_iter>
   1800      1.1  mrg 	    : _M_current(std::move(__i._M_current)), _M_parent(__i._M_parent)
   1801      1.1  mrg 	  { }
   1802      1.1  mrg 
   1803      1.1  mrg 	  constexpr const _Base_iter&
   1804      1.1  mrg 	  base() const & noexcept
   1805      1.1  mrg 	  { return _M_current; }
   1806      1.1  mrg 
   1807      1.1  mrg 	  constexpr _Base_iter
   1808      1.1  mrg 	  base() &&
   1809      1.1  mrg 	  { return std::move(_M_current); }
   1810      1.1  mrg 
   1811      1.1  mrg 	  constexpr decltype(auto)
   1812      1.1  mrg 	  operator*() const
   1813      1.1  mrg 	    noexcept(noexcept(std::__invoke(*_M_parent->_M_fun, *_M_current)))
   1814      1.1  mrg 	  { return std::__invoke(*_M_parent->_M_fun, *_M_current); }
   1815      1.1  mrg 
   1816      1.1  mrg 	  constexpr _Iterator&
   1817      1.1  mrg 	  operator++()
   1818      1.1  mrg 	  {
   1819      1.1  mrg 	    ++_M_current;
   1820      1.1  mrg 	    return *this;
   1821      1.1  mrg 	  }
   1822      1.1  mrg 
   1823      1.1  mrg 	  constexpr void
   1824      1.1  mrg 	  operator++(int)
   1825      1.1  mrg 	  { ++_M_current; }
   1826      1.1  mrg 
   1827      1.1  mrg 	  constexpr _Iterator
   1828      1.1  mrg 	  operator++(int) requires forward_range<_Base>
   1829      1.1  mrg 	  {
   1830      1.1  mrg 	    auto __tmp = *this;
   1831      1.1  mrg 	    ++*this;
   1832      1.1  mrg 	    return __tmp;
   1833      1.1  mrg 	  }
   1834      1.1  mrg 
   1835      1.1  mrg 	  constexpr _Iterator&
   1836      1.1  mrg 	  operator--() requires bidirectional_range<_Base>
   1837      1.1  mrg 	  {
   1838      1.1  mrg 	    --_M_current;
   1839      1.1  mrg 	    return *this;
   1840      1.1  mrg 	  }
   1841      1.1  mrg 
   1842      1.1  mrg 	  constexpr _Iterator
   1843      1.1  mrg 	  operator--(int) requires bidirectional_range<_Base>
   1844      1.1  mrg 	  {
   1845      1.1  mrg 	    auto __tmp = *this;
   1846      1.1  mrg 	    --*this;
   1847      1.1  mrg 	    return __tmp;
   1848      1.1  mrg 	  }
   1849      1.1  mrg 
   1850      1.1  mrg 	  constexpr _Iterator&
   1851      1.1  mrg 	  operator+=(difference_type __n) requires random_access_range<_Base>
   1852      1.1  mrg 	  {
   1853      1.1  mrg 	    _M_current += __n;
   1854      1.1  mrg 	    return *this;
   1855      1.1  mrg 	  }
   1856      1.1  mrg 
   1857      1.1  mrg 	  constexpr _Iterator&
   1858      1.1  mrg 	  operator-=(difference_type __n) requires random_access_range<_Base>
   1859      1.1  mrg 	  {
   1860      1.1  mrg 	    _M_current -= __n;
   1861      1.1  mrg 	    return *this;
   1862      1.1  mrg 	  }
   1863      1.1  mrg 
   1864      1.1  mrg 	  constexpr decltype(auto)
   1865      1.1  mrg 	  operator[](difference_type __n) const
   1866      1.1  mrg 	    requires random_access_range<_Base>
   1867      1.1  mrg 	  { return std::__invoke(*_M_parent->_M_fun, _M_current[__n]); }
   1868      1.1  mrg 
   1869      1.1  mrg 	  friend constexpr bool
   1870      1.1  mrg 	  operator==(const _Iterator& __x, const _Iterator& __y)
   1871      1.1  mrg 	    requires equality_comparable<_Base_iter>
   1872      1.1  mrg 	  { return __x._M_current == __y._M_current; }
   1873      1.1  mrg 
   1874      1.1  mrg 	  friend constexpr bool
   1875      1.1  mrg 	  operator<(const _Iterator& __x, const _Iterator& __y)
   1876      1.1  mrg 	    requires random_access_range<_Base>
   1877      1.1  mrg 	  { return __x._M_current < __y._M_current; }
   1878      1.1  mrg 
   1879      1.1  mrg 	  friend constexpr bool
   1880      1.1  mrg 	  operator>(const _Iterator& __x, const _Iterator& __y)
   1881      1.1  mrg 	    requires random_access_range<_Base>
   1882      1.1  mrg 	  { return __y < __x; }
   1883      1.1  mrg 
   1884      1.1  mrg 	  friend constexpr bool
   1885      1.1  mrg 	  operator<=(const _Iterator& __x, const _Iterator& __y)
   1886      1.1  mrg 	    requires random_access_range<_Base>
   1887      1.1  mrg 	  { return !(__y < __x); }
   1888      1.1  mrg 
   1889      1.1  mrg 	  friend constexpr bool
   1890      1.1  mrg 	  operator>=(const _Iterator& __x, const _Iterator& __y)
   1891      1.1  mrg 	    requires random_access_range<_Base>
   1892      1.1  mrg 	  { return !(__x < __y); }
   1893      1.1  mrg 
   1894      1.1  mrg #ifdef __cpp_lib_three_way_comparison
   1895      1.1  mrg 	  friend constexpr auto
   1896      1.1  mrg 	  operator<=>(const _Iterator& __x, const _Iterator& __y)
   1897      1.1  mrg 	    requires random_access_range<_Base>
   1898      1.1  mrg 	      && three_way_comparable<_Base_iter>
   1899      1.1  mrg 	  { return __x._M_current <=> __y._M_current; }
   1900      1.1  mrg #endif
   1901      1.1  mrg 
   1902      1.1  mrg 	  friend constexpr _Iterator
   1903      1.1  mrg 	  operator+(_Iterator __i, difference_type __n)
   1904      1.1  mrg 	    requires random_access_range<_Base>
   1905      1.1  mrg 	  { return {__i._M_parent, __i._M_current + __n}; }
   1906      1.1  mrg 
   1907      1.1  mrg 	  friend constexpr _Iterator
   1908      1.1  mrg 	  operator+(difference_type __n, _Iterator __i)
   1909      1.1  mrg 	    requires random_access_range<_Base>
   1910      1.1  mrg 	  { return {__i._M_parent, __i._M_current + __n}; }
   1911      1.1  mrg 
   1912      1.1  mrg 	  friend constexpr _Iterator
   1913      1.1  mrg 	  operator-(_Iterator __i, difference_type __n)
   1914      1.1  mrg 	    requires random_access_range<_Base>
   1915      1.1  mrg 	  { return {__i._M_parent, __i._M_current - __n}; }
   1916      1.1  mrg 
   1917      1.1  mrg 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1918      1.1  mrg 	  // 3483. transform_view::iterator's difference is overconstrained
   1919      1.1  mrg 	  friend constexpr difference_type
   1920      1.1  mrg 	  operator-(const _Iterator& __x, const _Iterator& __y)
   1921      1.1  mrg 	    requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
   1922      1.1  mrg 	  { return __x._M_current - __y._M_current; }
   1923      1.1  mrg 
   1924      1.1  mrg 	  friend constexpr decltype(auto)
   1925      1.1  mrg 	  iter_move(const _Iterator& __i) noexcept(noexcept(*__i))
   1926      1.1  mrg 	  {
   1927      1.1  mrg 	    if constexpr (is_lvalue_reference_v<decltype(*__i)>)
   1928      1.1  mrg 	      return std::move(*__i);
   1929      1.1  mrg 	    else
   1930      1.1  mrg 	      return *__i;
   1931      1.1  mrg 	  }
   1932      1.1  mrg 
   1933      1.1  mrg 	  friend _Iterator<!_Const>;
   1934      1.1  mrg 	  template<bool> friend struct _Sentinel;
   1935      1.1  mrg 	};
   1936      1.1  mrg 
   1937      1.1  mrg       template<bool _Const>
   1938      1.1  mrg 	struct _Sentinel
   1939      1.1  mrg 	{
   1940      1.1  mrg 	private:
   1941      1.1  mrg 	  using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
   1942      1.1  mrg 	  using _Base = transform_view::_Base<_Const>;
   1943      1.1  mrg 
   1944      1.1  mrg 	  template<bool _Const2>
   1945      1.1  mrg 	    constexpr auto
   1946      1.1  mrg 	    __distance_from(const _Iterator<_Const2>& __i) const
   1947      1.1  mrg 	    { return _M_end - __i._M_current; }
   1948      1.1  mrg 
   1949      1.1  mrg 	  template<bool _Const2>
   1950      1.1  mrg 	    constexpr bool
   1951      1.1  mrg 	    __equal(const _Iterator<_Const2>& __i) const
   1952      1.1  mrg 	    { return __i._M_current == _M_end; }
   1953      1.1  mrg 
   1954      1.1  mrg 	  sentinel_t<_Base> _M_end = sentinel_t<_Base>();
   1955      1.1  mrg 
   1956      1.1  mrg 	public:
   1957      1.1  mrg 	  _Sentinel() = default;
   1958      1.1  mrg 
   1959      1.1  mrg 	  constexpr explicit
   1960      1.1  mrg 	  _Sentinel(sentinel_t<_Base> __end)
   1961      1.1  mrg 	    : _M_end(__end)
   1962      1.1  mrg 	  { }
   1963      1.1  mrg 
   1964      1.1  mrg 	  constexpr
   1965      1.1  mrg 	  _Sentinel(_Sentinel<!_Const> __i)
   1966      1.1  mrg 	    requires _Const
   1967      1.1  mrg 	      && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
   1968      1.1  mrg 	    : _M_end(std::move(__i._M_end))
   1969      1.1  mrg 	  { }
   1970      1.1  mrg 
   1971      1.1  mrg 	  constexpr sentinel_t<_Base>
   1972      1.1  mrg 	  base() const
   1973      1.1  mrg 	  { return _M_end; }
   1974      1.1  mrg 
   1975      1.1  mrg 	  template<bool _Const2>
   1976      1.1  mrg 	    requires sentinel_for<sentinel_t<_Base>,
   1977      1.1  mrg 		       iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
   1978      1.1  mrg 	    friend constexpr bool
   1979      1.1  mrg 	    operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
   1980      1.1  mrg 	    { return __y.__equal(__x); }
   1981      1.1  mrg 
   1982      1.1  mrg 	  template<bool _Const2,
   1983      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
   1984      1.1  mrg 	    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   1985      1.1  mrg 	    friend constexpr range_difference_t<_Base2>
   1986      1.1  mrg 	    operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y)
   1987      1.1  mrg 	    { return -__y.__distance_from(__x); }
   1988      1.1  mrg 
   1989      1.1  mrg 	  template<bool _Const2,
   1990      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
   1991      1.1  mrg 	    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   1992      1.1  mrg 	    friend constexpr range_difference_t<_Base2>
   1993      1.1  mrg 	    operator-(const _Sentinel& __y, const _Iterator<_Const2>& __x)
   1994      1.1  mrg 	    { return __y.__distance_from(__x); }
   1995      1.1  mrg 
   1996      1.1  mrg 	  friend _Sentinel<!_Const>;
   1997      1.1  mrg 	};
   1998      1.1  mrg 
   1999      1.1  mrg       _Vp _M_base = _Vp();
   2000  1.1.1.3  mrg       [[no_unique_address]] __detail::__box<_Fp> _M_fun;
   2001      1.1  mrg 
   2002      1.1  mrg     public:
   2003  1.1.1.3  mrg       transform_view() requires (default_initializable<_Vp>
   2004  1.1.1.3  mrg 				 && default_initializable<_Fp>)
   2005  1.1.1.3  mrg 	= default;
   2006      1.1  mrg 
   2007      1.1  mrg       constexpr
   2008      1.1  mrg       transform_view(_Vp __base, _Fp __fun)
   2009      1.1  mrg 	: _M_base(std::move(__base)), _M_fun(std::move(__fun))
   2010      1.1  mrg       { }
   2011      1.1  mrg 
   2012      1.1  mrg       constexpr _Vp
   2013      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2014      1.1  mrg       { return _M_base ; }
   2015      1.1  mrg 
   2016      1.1  mrg       constexpr _Vp
   2017      1.1  mrg       base() &&
   2018      1.1  mrg       { return std::move(_M_base); }
   2019      1.1  mrg 
   2020      1.1  mrg       constexpr _Iterator<false>
   2021      1.1  mrg       begin()
   2022      1.1  mrg       { return _Iterator<false>{this, ranges::begin(_M_base)}; }
   2023      1.1  mrg 
   2024      1.1  mrg       constexpr _Iterator<true>
   2025      1.1  mrg       begin() const
   2026      1.1  mrg 	requires range<const _Vp>
   2027      1.1  mrg 	  && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
   2028      1.1  mrg       { return _Iterator<true>{this, ranges::begin(_M_base)}; }
   2029      1.1  mrg 
   2030      1.1  mrg       constexpr _Sentinel<false>
   2031      1.1  mrg       end()
   2032      1.1  mrg       { return _Sentinel<false>{ranges::end(_M_base)}; }
   2033      1.1  mrg 
   2034      1.1  mrg       constexpr _Iterator<false>
   2035      1.1  mrg       end() requires common_range<_Vp>
   2036      1.1  mrg       { return _Iterator<false>{this, ranges::end(_M_base)}; }
   2037      1.1  mrg 
   2038      1.1  mrg       constexpr _Sentinel<true>
   2039      1.1  mrg       end() const
   2040      1.1  mrg 	requires range<const _Vp>
   2041      1.1  mrg 	  && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
   2042      1.1  mrg       { return _Sentinel<true>{ranges::end(_M_base)}; }
   2043      1.1  mrg 
   2044      1.1  mrg       constexpr _Iterator<true>
   2045      1.1  mrg       end() const
   2046      1.1  mrg 	requires common_range<const _Vp>
   2047      1.1  mrg 	  && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
   2048      1.1  mrg       { return _Iterator<true>{this, ranges::end(_M_base)}; }
   2049      1.1  mrg 
   2050      1.1  mrg       constexpr auto
   2051      1.1  mrg       size() requires sized_range<_Vp>
   2052      1.1  mrg       { return ranges::size(_M_base); }
   2053      1.1  mrg 
   2054  1.1.1.3  mrg       constexpr auto
   2055  1.1.1.3  mrg       size() const requires sized_range<const _Vp>
   2056  1.1.1.3  mrg       { return ranges::size(_M_base); }
   2057  1.1.1.3  mrg     };
   2058  1.1.1.3  mrg 
   2059  1.1.1.3  mrg   template<typename _Range, typename _Fp>
   2060  1.1.1.3  mrg     transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>;
   2061  1.1.1.3  mrg 
   2062  1.1.1.3  mrg   namespace views
   2063  1.1.1.3  mrg   {
   2064  1.1.1.3  mrg     namespace __detail
   2065  1.1.1.3  mrg     {
   2066  1.1.1.3  mrg       template<typename _Range, typename _Fp>
   2067  1.1.1.3  mrg 	concept __can_transform_view
   2068  1.1.1.3  mrg 	  = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); };
   2069  1.1.1.3  mrg     } // namespace __detail
   2070  1.1.1.3  mrg 
   2071  1.1.1.3  mrg     struct _Transform : __adaptor::_RangeAdaptor<_Transform>
   2072  1.1.1.3  mrg     {
   2073  1.1.1.3  mrg       template<viewable_range _Range, typename _Fp>
   2074  1.1.1.3  mrg 	requires __detail::__can_transform_view<_Range, _Fp>
   2075  1.1.1.3  mrg 	constexpr auto
   2076  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Fp&& __f) const
   2077  1.1.1.3  mrg 	{
   2078  1.1.1.3  mrg 	  return transform_view(std::forward<_Range>(__r), std::forward<_Fp>(__f));
   2079  1.1.1.3  mrg 	}
   2080  1.1.1.3  mrg 
   2081  1.1.1.3  mrg       using _RangeAdaptor<_Transform>::operator();
   2082  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   2083  1.1.1.3  mrg       static constexpr bool _S_has_simple_extra_args = true;
   2084      1.1  mrg     };
   2085      1.1  mrg 
   2086  1.1.1.3  mrg     inline constexpr _Transform transform;
   2087      1.1  mrg   } // namespace views
   2088      1.1  mrg 
   2089      1.1  mrg   template<view _Vp>
   2090      1.1  mrg     class take_view : public view_interface<take_view<_Vp>>
   2091      1.1  mrg     {
   2092      1.1  mrg     private:
   2093      1.1  mrg       template<bool _Const>
   2094      1.1  mrg 	using _CI = counted_iterator<
   2095      1.1  mrg 	  iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>;
   2096      1.1  mrg 
   2097      1.1  mrg       template<bool _Const>
   2098      1.1  mrg 	struct _Sentinel
   2099      1.1  mrg 	{
   2100      1.1  mrg 	private:
   2101      1.1  mrg 	  using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   2102      1.1  mrg 	  sentinel_t<_Base> _M_end = sentinel_t<_Base>();
   2103      1.1  mrg 
   2104      1.1  mrg 	public:
   2105      1.1  mrg 	  _Sentinel() = default;
   2106      1.1  mrg 
   2107      1.1  mrg 	  constexpr explicit
   2108      1.1  mrg 	  _Sentinel(sentinel_t<_Base> __end)
   2109      1.1  mrg 	    : _M_end(__end)
   2110      1.1  mrg 	  { }
   2111      1.1  mrg 
   2112      1.1  mrg 	  constexpr
   2113      1.1  mrg 	  _Sentinel(_Sentinel<!_Const> __s)
   2114      1.1  mrg 	    requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
   2115      1.1  mrg 	    : _M_end(std::move(__s._M_end))
   2116      1.1  mrg 	  { }
   2117      1.1  mrg 
   2118      1.1  mrg 	  constexpr sentinel_t<_Base>
   2119      1.1  mrg 	  base() const
   2120      1.1  mrg 	  { return _M_end; }
   2121      1.1  mrg 
   2122      1.1  mrg 	  friend constexpr bool
   2123      1.1  mrg 	  operator==(const _CI<_Const>& __y, const _Sentinel& __x)
   2124      1.1  mrg 	  { return __y.count() == 0 || __y.base() == __x._M_end; }
   2125      1.1  mrg 
   2126      1.1  mrg 	  template<bool _OtherConst = !_Const,
   2127      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
   2128      1.1  mrg 	    requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   2129      1.1  mrg 	  friend constexpr bool
   2130      1.1  mrg 	  operator==(const _CI<_OtherConst>& __y, const _Sentinel& __x)
   2131      1.1  mrg 	  { return __y.count() == 0 || __y.base() == __x._M_end; }
   2132      1.1  mrg 
   2133      1.1  mrg 	  friend _Sentinel<!_Const>;
   2134      1.1  mrg 	};
   2135      1.1  mrg 
   2136      1.1  mrg       _Vp _M_base = _Vp();
   2137      1.1  mrg       range_difference_t<_Vp> _M_count = 0;
   2138      1.1  mrg 
   2139      1.1  mrg     public:
   2140      1.1  mrg       take_view() requires default_initializable<_Vp> = default;
   2141      1.1  mrg 
   2142      1.1  mrg       constexpr
   2143      1.1  mrg       take_view(_Vp base, range_difference_t<_Vp> __count)
   2144      1.1  mrg 	: _M_base(std::move(base)), _M_count(std::move(__count))
   2145      1.1  mrg       { }
   2146      1.1  mrg 
   2147      1.1  mrg       constexpr _Vp
   2148      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2149      1.1  mrg       { return _M_base; }
   2150      1.1  mrg 
   2151      1.1  mrg       constexpr _Vp
   2152      1.1  mrg       base() &&
   2153      1.1  mrg       { return std::move(_M_base); }
   2154      1.1  mrg 
   2155      1.1  mrg       constexpr auto
   2156      1.1  mrg       begin() requires (!__detail::__simple_view<_Vp>)
   2157      1.1  mrg       {
   2158      1.1  mrg 	if constexpr (sized_range<_Vp>)
   2159      1.1  mrg 	  {
   2160      1.1  mrg 	    if constexpr (random_access_range<_Vp>)
   2161      1.1  mrg 	      return ranges::begin(_M_base);
   2162      1.1  mrg 	    else
   2163      1.1  mrg 	      {
   2164      1.1  mrg 		auto __sz = size();
   2165  1.1.1.3  mrg 		return counted_iterator(ranges::begin(_M_base), __sz);
   2166      1.1  mrg 	      }
   2167      1.1  mrg 	  }
   2168      1.1  mrg 	else
   2169  1.1.1.3  mrg 	  return counted_iterator(ranges::begin(_M_base), _M_count);
   2170      1.1  mrg       }
   2171      1.1  mrg 
   2172      1.1  mrg       constexpr auto
   2173      1.1  mrg       begin() const requires range<const _Vp>
   2174      1.1  mrg       {
   2175      1.1  mrg 	if constexpr (sized_range<const _Vp>)
   2176      1.1  mrg 	  {
   2177      1.1  mrg 	    if constexpr (random_access_range<const _Vp>)
   2178      1.1  mrg 	      return ranges::begin(_M_base);
   2179      1.1  mrg 	    else
   2180      1.1  mrg 	      {
   2181      1.1  mrg 		auto __sz = size();
   2182  1.1.1.3  mrg 		return counted_iterator(ranges::begin(_M_base), __sz);
   2183      1.1  mrg 	      }
   2184      1.1  mrg 	  }
   2185      1.1  mrg 	else
   2186  1.1.1.3  mrg 	  return counted_iterator(ranges::begin(_M_base), _M_count);
   2187      1.1  mrg       }
   2188      1.1  mrg 
   2189      1.1  mrg       constexpr auto
   2190      1.1  mrg       end() requires (!__detail::__simple_view<_Vp>)
   2191      1.1  mrg       {
   2192      1.1  mrg 	if constexpr (sized_range<_Vp>)
   2193      1.1  mrg 	  {
   2194      1.1  mrg 	    if constexpr (random_access_range<_Vp>)
   2195      1.1  mrg 	      return ranges::begin(_M_base) + size();
   2196      1.1  mrg 	    else
   2197      1.1  mrg 	      return default_sentinel;
   2198      1.1  mrg 	  }
   2199      1.1  mrg 	else
   2200      1.1  mrg 	  return _Sentinel<false>{ranges::end(_M_base)};
   2201      1.1  mrg       }
   2202      1.1  mrg 
   2203      1.1  mrg       constexpr auto
   2204      1.1  mrg       end() const requires range<const _Vp>
   2205      1.1  mrg       {
   2206      1.1  mrg 	if constexpr (sized_range<const _Vp>)
   2207      1.1  mrg 	  {
   2208      1.1  mrg 	    if constexpr (random_access_range<const _Vp>)
   2209      1.1  mrg 	      return ranges::begin(_M_base) + size();
   2210      1.1  mrg 	    else
   2211      1.1  mrg 	      return default_sentinel;
   2212      1.1  mrg 	  }
   2213      1.1  mrg 	else
   2214      1.1  mrg 	  return _Sentinel<true>{ranges::end(_M_base)};
   2215      1.1  mrg       }
   2216      1.1  mrg 
   2217      1.1  mrg       constexpr auto
   2218      1.1  mrg       size() requires sized_range<_Vp>
   2219      1.1  mrg       {
   2220      1.1  mrg 	auto __n = ranges::size(_M_base);
   2221      1.1  mrg 	return std::min(__n, static_cast<decltype(__n)>(_M_count));
   2222      1.1  mrg       }
   2223      1.1  mrg 
   2224      1.1  mrg       constexpr auto
   2225      1.1  mrg       size() const requires sized_range<const _Vp>
   2226      1.1  mrg       {
   2227      1.1  mrg 	auto __n = ranges::size(_M_base);
   2228      1.1  mrg 	return std::min(__n, static_cast<decltype(__n)>(_M_count));
   2229      1.1  mrg       }
   2230      1.1  mrg     };
   2231      1.1  mrg 
   2232      1.1  mrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   2233      1.1  mrg   // 3447. Deduction guides for take_view and drop_view have different
   2234      1.1  mrg   // constraints
   2235      1.1  mrg   template<typename _Range>
   2236      1.1  mrg     take_view(_Range&&, range_difference_t<_Range>)
   2237      1.1  mrg       -> take_view<views::all_t<_Range>>;
   2238      1.1  mrg 
   2239      1.1  mrg   template<typename _Tp>
   2240      1.1  mrg     inline constexpr bool enable_borrowed_range<take_view<_Tp>>
   2241      1.1  mrg       = enable_borrowed_range<_Tp>;
   2242      1.1  mrg 
   2243      1.1  mrg   namespace views
   2244      1.1  mrg   {
   2245  1.1.1.3  mrg     namespace __detail
   2246  1.1.1.3  mrg     {
   2247  1.1.1.3  mrg       template<typename _Range>
   2248  1.1.1.3  mrg 	inline constexpr bool __is_empty_view = false;
   2249  1.1.1.3  mrg 
   2250  1.1.1.3  mrg       template<typename _Tp>
   2251  1.1.1.3  mrg 	inline constexpr bool __is_empty_view<empty_view<_Tp>> = true;
   2252  1.1.1.3  mrg 
   2253  1.1.1.3  mrg       template<typename _Range>
   2254  1.1.1.3  mrg 	inline constexpr bool __is_basic_string_view = false;
   2255  1.1.1.3  mrg 
   2256  1.1.1.3  mrg       template<typename _CharT, typename _Traits>
   2257  1.1.1.3  mrg 	inline constexpr bool __is_basic_string_view<basic_string_view<_CharT, _Traits>>
   2258  1.1.1.3  mrg 	  = true;
   2259  1.1.1.3  mrg 
   2260  1.1.1.3  mrg       template<typename _Range>
   2261  1.1.1.3  mrg 	inline constexpr bool __is_subrange = false;
   2262  1.1.1.3  mrg 
   2263  1.1.1.3  mrg       template<typename _Iter, typename _Sent, subrange_kind _Kind>
   2264  1.1.1.3  mrg 	inline constexpr bool __is_subrange<subrange<_Iter, _Sent, _Kind>> = true;
   2265  1.1.1.3  mrg 
   2266  1.1.1.3  mrg       template<typename _Range>
   2267  1.1.1.3  mrg 	inline constexpr bool __is_iota_view = false;
   2268  1.1.1.3  mrg 
   2269  1.1.1.3  mrg       template<typename _Winc, typename _Bound>
   2270  1.1.1.3  mrg 	inline constexpr bool __is_iota_view<iota_view<_Winc, _Bound>> = true;
   2271  1.1.1.3  mrg 
   2272  1.1.1.3  mrg       template<typename _Range, typename _Dp>
   2273  1.1.1.3  mrg 	concept __can_take_view
   2274  1.1.1.3  mrg 	  = requires { take_view(std::declval<_Range>(), std::declval<_Dp>()); };
   2275  1.1.1.3  mrg     } // namespace __detail
   2276  1.1.1.3  mrg 
   2277  1.1.1.3  mrg     struct _Take : __adaptor::_RangeAdaptor<_Take>
   2278  1.1.1.3  mrg     {
   2279  1.1.1.3  mrg       template<viewable_range _Range, typename _Dp = range_difference_t<_Range>>
   2280  1.1.1.3  mrg 	requires __detail::__can_take_view<_Range, _Dp>
   2281  1.1.1.3  mrg 	constexpr auto
   2282  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n) const
   2283  1.1.1.3  mrg 	{
   2284  1.1.1.3  mrg 	  using _Tp = remove_cvref_t<_Range>;
   2285  1.1.1.3  mrg 	  if constexpr (__detail::__is_empty_view<_Tp>)
   2286  1.1.1.3  mrg 	    return _Tp();
   2287  1.1.1.3  mrg 	  else if constexpr (random_access_range<_Tp>
   2288  1.1.1.3  mrg 			     && sized_range<_Tp>
   2289  1.1.1.3  mrg 			     && (std::__detail::__is_span<_Tp>
   2290  1.1.1.3  mrg 				 || __detail::__is_basic_string_view<_Tp>
   2291  1.1.1.3  mrg 				 || __detail::__is_subrange<_Tp>
   2292  1.1.1.3  mrg 				 || __detail::__is_iota_view<_Tp>))
   2293  1.1.1.3  mrg 	    {
   2294  1.1.1.3  mrg 	      __n = std::min<_Dp>(ranges::distance(__r), __n);
   2295  1.1.1.3  mrg 	      auto __begin = ranges::begin(__r);
   2296  1.1.1.3  mrg 	      auto __end = __begin + __n;
   2297  1.1.1.3  mrg 	      if constexpr (std::__detail::__is_span<_Tp>)
   2298  1.1.1.3  mrg 		return span<typename _Tp::element_type>(__begin, __end);
   2299  1.1.1.3  mrg 	      else if constexpr (__detail::__is_basic_string_view<_Tp>)
   2300  1.1.1.3  mrg 		return _Tp(__begin, __end);
   2301  1.1.1.3  mrg 	      else if constexpr (__detail::__is_subrange<_Tp>)
   2302  1.1.1.3  mrg 		return subrange<iterator_t<_Tp>>(__begin, __end);
   2303  1.1.1.3  mrg 	      else
   2304  1.1.1.3  mrg 		return iota_view(*__begin, *__end);
   2305  1.1.1.3  mrg 	    }
   2306  1.1.1.3  mrg 	  else
   2307  1.1.1.3  mrg 	    return take_view(std::forward<_Range>(__r), __n);
   2308  1.1.1.3  mrg 	}
   2309  1.1.1.3  mrg 
   2310  1.1.1.3  mrg       using _RangeAdaptor<_Take>::operator();
   2311  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   2312  1.1.1.3  mrg       // The count argument of views::take is not always simple -- it can be
   2313  1.1.1.3  mrg       // e.g. a move-only class that's implicitly convertible to the difference
   2314  1.1.1.3  mrg       // type.  But an integer-like count argument is surely simple.
   2315  1.1.1.3  mrg       template<typename _Tp>
   2316  1.1.1.3  mrg 	static constexpr bool _S_has_simple_extra_args
   2317  1.1.1.3  mrg 	  = ranges::__detail::__is_integer_like<_Tp>;
   2318  1.1.1.3  mrg     };
   2319  1.1.1.3  mrg 
   2320  1.1.1.3  mrg     inline constexpr _Take take;
   2321      1.1  mrg   } // namespace views
   2322      1.1  mrg 
   2323      1.1  mrg   template<view _Vp, typename _Pred>
   2324      1.1  mrg     requires input_range<_Vp> && is_object_v<_Pred>
   2325      1.1  mrg       && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
   2326      1.1  mrg     class take_while_view : public view_interface<take_while_view<_Vp, _Pred>>
   2327      1.1  mrg     {
   2328      1.1  mrg       template<bool _Const>
   2329      1.1  mrg 	struct _Sentinel
   2330      1.1  mrg 	{
   2331      1.1  mrg 	private:
   2332      1.1  mrg 	  using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   2333      1.1  mrg 
   2334      1.1  mrg 	  sentinel_t<_Base> _M_end = sentinel_t<_Base>();
   2335      1.1  mrg 	  const _Pred* _M_pred = nullptr;
   2336      1.1  mrg 
   2337      1.1  mrg 	public:
   2338      1.1  mrg 	  _Sentinel() = default;
   2339      1.1  mrg 
   2340      1.1  mrg 	  constexpr explicit
   2341      1.1  mrg 	  _Sentinel(sentinel_t<_Base> __end, const _Pred* __pred)
   2342      1.1  mrg 	    : _M_end(__end), _M_pred(__pred)
   2343      1.1  mrg 	  { }
   2344      1.1  mrg 
   2345      1.1  mrg 	  constexpr
   2346      1.1  mrg 	  _Sentinel(_Sentinel<!_Const> __s)
   2347      1.1  mrg 	    requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
   2348      1.1  mrg 	    : _M_end(__s._M_end), _M_pred(__s._M_pred)
   2349      1.1  mrg 	  { }
   2350      1.1  mrg 
   2351      1.1  mrg 	  constexpr sentinel_t<_Base>
   2352      1.1  mrg 	  base() const { return _M_end; }
   2353      1.1  mrg 
   2354      1.1  mrg 	  friend constexpr bool
   2355      1.1  mrg 	  operator==(const iterator_t<_Base>& __x, const _Sentinel& __y)
   2356      1.1  mrg 	  { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
   2357      1.1  mrg 
   2358      1.1  mrg 	  template<bool _OtherConst = !_Const,
   2359      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
   2360      1.1  mrg 	    requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   2361      1.1  mrg 	  friend constexpr bool
   2362      1.1  mrg 	  operator==(const iterator_t<_Base2>& __x, const _Sentinel& __y)
   2363      1.1  mrg 	  { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
   2364      1.1  mrg 
   2365      1.1  mrg 	  friend _Sentinel<!_Const>;
   2366      1.1  mrg 	};
   2367      1.1  mrg 
   2368      1.1  mrg       _Vp _M_base = _Vp();
   2369  1.1.1.3  mrg       [[no_unique_address]] __detail::__box<_Pred> _M_pred;
   2370      1.1  mrg 
   2371      1.1  mrg     public:
   2372  1.1.1.3  mrg       take_while_view() requires (default_initializable<_Vp>
   2373  1.1.1.3  mrg 				  && default_initializable<_Pred>)
   2374  1.1.1.3  mrg 	= default;
   2375      1.1  mrg 
   2376      1.1  mrg       constexpr
   2377      1.1  mrg       take_while_view(_Vp base, _Pred __pred)
   2378      1.1  mrg 	: _M_base(std::move(base)), _M_pred(std::move(__pred))
   2379  1.1.1.3  mrg       { }
   2380      1.1  mrg 
   2381      1.1  mrg       constexpr _Vp
   2382      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2383      1.1  mrg       { return _M_base; }
   2384      1.1  mrg 
   2385      1.1  mrg       constexpr _Vp
   2386      1.1  mrg       base() &&
   2387      1.1  mrg       { return std::move(_M_base); }
   2388      1.1  mrg 
   2389      1.1  mrg       constexpr const _Pred&
   2390      1.1  mrg       pred() const
   2391      1.1  mrg       { return *_M_pred; }
   2392      1.1  mrg 
   2393      1.1  mrg       constexpr auto
   2394      1.1  mrg       begin() requires (!__detail::__simple_view<_Vp>)
   2395      1.1  mrg       { return ranges::begin(_M_base); }
   2396      1.1  mrg 
   2397      1.1  mrg       constexpr auto
   2398      1.1  mrg       begin() const requires range<const _Vp>
   2399      1.1  mrg 	&& indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
   2400      1.1  mrg       { return ranges::begin(_M_base); }
   2401      1.1  mrg 
   2402      1.1  mrg       constexpr auto
   2403      1.1  mrg       end() requires (!__detail::__simple_view<_Vp>)
   2404      1.1  mrg       { return _Sentinel<false>(ranges::end(_M_base),
   2405      1.1  mrg 				std::__addressof(*_M_pred)); }
   2406      1.1  mrg 
   2407      1.1  mrg       constexpr auto
   2408      1.1  mrg       end() const requires range<const _Vp>
   2409      1.1  mrg 	&& indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
   2410      1.1  mrg       { return _Sentinel<true>(ranges::end(_M_base),
   2411      1.1  mrg 			       std::__addressof(*_M_pred)); }
   2412      1.1  mrg     };
   2413      1.1  mrg 
   2414      1.1  mrg   template<typename _Range, typename _Pred>
   2415      1.1  mrg     take_while_view(_Range&&, _Pred)
   2416      1.1  mrg       -> take_while_view<views::all_t<_Range>, _Pred>;
   2417      1.1  mrg 
   2418      1.1  mrg   namespace views
   2419      1.1  mrg   {
   2420  1.1.1.3  mrg     namespace __detail
   2421  1.1.1.3  mrg     {
   2422  1.1.1.3  mrg       template<typename _Range, typename _Pred>
   2423  1.1.1.3  mrg 	concept __can_take_while_view
   2424  1.1.1.3  mrg 	  = requires { take_while_view(std::declval<_Range>(), std::declval<_Pred>()); };
   2425  1.1.1.3  mrg     } // namespace __detail
   2426  1.1.1.3  mrg 
   2427  1.1.1.3  mrg     struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile>
   2428  1.1.1.3  mrg     {
   2429  1.1.1.3  mrg       template<viewable_range _Range, typename _Pred>
   2430  1.1.1.3  mrg 	requires __detail::__can_take_while_view<_Range, _Pred>
   2431  1.1.1.3  mrg 	constexpr auto
   2432  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const
   2433  1.1.1.3  mrg 	{
   2434  1.1.1.3  mrg 	  return take_while_view(std::forward<_Range>(__r), std::forward<_Pred>(__p));
   2435  1.1.1.3  mrg 	}
   2436  1.1.1.3  mrg 
   2437  1.1.1.3  mrg       using _RangeAdaptor<_TakeWhile>::operator();
   2438  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   2439  1.1.1.3  mrg       static constexpr bool _S_has_simple_extra_args = true;
   2440  1.1.1.3  mrg     };
   2441  1.1.1.3  mrg 
   2442  1.1.1.3  mrg     inline constexpr _TakeWhile take_while;
   2443      1.1  mrg   } // namespace views
   2444      1.1  mrg 
   2445      1.1  mrg   template<view _Vp>
   2446      1.1  mrg     class drop_view : public view_interface<drop_view<_Vp>>
   2447      1.1  mrg     {
   2448      1.1  mrg     private:
   2449      1.1  mrg       _Vp _M_base = _Vp();
   2450      1.1  mrg       range_difference_t<_Vp> _M_count = 0;
   2451      1.1  mrg 
   2452      1.1  mrg       // ranges::next(begin(base), count, end(base)) is O(1) if _Vp satisfies
   2453      1.1  mrg       // both random_access_range and sized_range. Otherwise, cache its result.
   2454      1.1  mrg       static constexpr bool _S_needs_cached_begin
   2455      1.1  mrg 	= !(random_access_range<const _Vp> && sized_range<const _Vp>);
   2456      1.1  mrg       [[no_unique_address]]
   2457      1.1  mrg 	__detail::__maybe_present_t<_S_needs_cached_begin,
   2458      1.1  mrg 				    __detail::_CachedPosition<_Vp>>
   2459      1.1  mrg 				      _M_cached_begin;
   2460      1.1  mrg 
   2461      1.1  mrg     public:
   2462      1.1  mrg       drop_view() requires default_initializable<_Vp> = default;
   2463      1.1  mrg 
   2464      1.1  mrg       constexpr
   2465      1.1  mrg       drop_view(_Vp __base, range_difference_t<_Vp> __count)
   2466      1.1  mrg 	: _M_base(std::move(__base)), _M_count(__count)
   2467      1.1  mrg       { __glibcxx_assert(__count >= 0); }
   2468      1.1  mrg 
   2469      1.1  mrg       constexpr _Vp
   2470      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2471      1.1  mrg       { return _M_base; }
   2472      1.1  mrg 
   2473      1.1  mrg       constexpr _Vp
   2474      1.1  mrg       base() &&
   2475      1.1  mrg       { return std::move(_M_base); }
   2476      1.1  mrg 
   2477      1.1  mrg       // This overload is disabled for simple views with constant-time begin().
   2478      1.1  mrg       constexpr auto
   2479      1.1  mrg       begin()
   2480      1.1  mrg 	requires (!(__detail::__simple_view<_Vp>
   2481      1.1  mrg 		    && random_access_range<const _Vp>
   2482      1.1  mrg 		    && sized_range<const _Vp>))
   2483      1.1  mrg       {
   2484      1.1  mrg 	if constexpr (_S_needs_cached_begin)
   2485      1.1  mrg 	  if (_M_cached_begin._M_has_value())
   2486      1.1  mrg 	    return _M_cached_begin._M_get(_M_base);
   2487      1.1  mrg 
   2488      1.1  mrg 	auto __it = ranges::next(ranges::begin(_M_base),
   2489      1.1  mrg 				 _M_count, ranges::end(_M_base));
   2490      1.1  mrg 	if constexpr (_S_needs_cached_begin)
   2491      1.1  mrg 	  _M_cached_begin._M_set(_M_base, __it);
   2492      1.1  mrg 	return __it;
   2493      1.1  mrg       }
   2494      1.1  mrg 
   2495      1.1  mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   2496      1.1  mrg       // 3482. drop_view's const begin should additionally require sized_range
   2497      1.1  mrg       constexpr auto
   2498      1.1  mrg       begin() const
   2499      1.1  mrg 	requires random_access_range<const _Vp> && sized_range<const _Vp>
   2500      1.1  mrg       {
   2501      1.1  mrg 	return ranges::next(ranges::begin(_M_base), _M_count,
   2502      1.1  mrg 			    ranges::end(_M_base));
   2503      1.1  mrg       }
   2504      1.1  mrg 
   2505      1.1  mrg       constexpr auto
   2506      1.1  mrg       end() requires (!__detail::__simple_view<_Vp>)
   2507      1.1  mrg       { return ranges::end(_M_base); }
   2508      1.1  mrg 
   2509      1.1  mrg       constexpr auto
   2510      1.1  mrg       end() const requires range<const _Vp>
   2511      1.1  mrg       { return ranges::end(_M_base); }
   2512      1.1  mrg 
   2513      1.1  mrg       constexpr auto
   2514      1.1  mrg       size() requires sized_range<_Vp>
   2515      1.1  mrg       {
   2516      1.1  mrg 	const auto __s = ranges::size(_M_base);
   2517      1.1  mrg 	const auto __c = static_cast<decltype(__s)>(_M_count);
   2518      1.1  mrg 	return __s < __c ? 0 : __s - __c;
   2519      1.1  mrg       }
   2520      1.1  mrg 
   2521      1.1  mrg       constexpr auto
   2522      1.1  mrg       size() const requires sized_range<const _Vp>
   2523      1.1  mrg       {
   2524      1.1  mrg 	const auto __s = ranges::size(_M_base);
   2525      1.1  mrg 	const auto __c = static_cast<decltype(__s)>(_M_count);
   2526      1.1  mrg 	return __s < __c ? 0 : __s - __c;
   2527      1.1  mrg       }
   2528      1.1  mrg     };
   2529      1.1  mrg 
   2530      1.1  mrg   template<typename _Range>
   2531      1.1  mrg     drop_view(_Range&&, range_difference_t<_Range>)
   2532      1.1  mrg       -> drop_view<views::all_t<_Range>>;
   2533      1.1  mrg 
   2534      1.1  mrg   template<typename _Tp>
   2535      1.1  mrg     inline constexpr bool enable_borrowed_range<drop_view<_Tp>>
   2536      1.1  mrg       = enable_borrowed_range<_Tp>;
   2537      1.1  mrg 
   2538      1.1  mrg   namespace views
   2539      1.1  mrg   {
   2540  1.1.1.3  mrg     namespace __detail
   2541  1.1.1.3  mrg     {
   2542  1.1.1.3  mrg       template<typename _Range, typename _Dp>
   2543  1.1.1.3  mrg 	concept __can_drop_view
   2544  1.1.1.3  mrg 	  = requires { drop_view(std::declval<_Range>(), std::declval<_Dp>()); };
   2545  1.1.1.3  mrg     } // namespace __detail
   2546  1.1.1.3  mrg 
   2547  1.1.1.3  mrg     struct _Drop : __adaptor::_RangeAdaptor<_Drop>
   2548  1.1.1.3  mrg     {
   2549  1.1.1.3  mrg       template<viewable_range _Range, typename _Dp = range_difference_t<_Range>>
   2550  1.1.1.3  mrg 	requires __detail::__can_drop_view<_Range, _Dp>
   2551  1.1.1.3  mrg 	constexpr auto
   2552  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n) const
   2553  1.1.1.3  mrg 	{
   2554  1.1.1.3  mrg 	  using _Tp = remove_cvref_t<_Range>;
   2555  1.1.1.3  mrg 	  if constexpr (__detail::__is_empty_view<_Tp>)
   2556  1.1.1.3  mrg 	    return _Tp();
   2557  1.1.1.3  mrg 	  else if constexpr (random_access_range<_Tp>
   2558  1.1.1.3  mrg 			     && sized_range<_Tp>
   2559  1.1.1.3  mrg 			     && (std::__detail::__is_span<_Tp>
   2560  1.1.1.3  mrg 				 || __detail::__is_basic_string_view<_Tp>
   2561  1.1.1.3  mrg 				 || __detail::__is_iota_view<_Tp>
   2562  1.1.1.3  mrg 				 || __detail::__is_subrange<_Tp>))
   2563  1.1.1.3  mrg 	    {
   2564  1.1.1.3  mrg 	      __n = std::min<_Dp>(ranges::distance(__r), __n);
   2565  1.1.1.3  mrg 	      auto __begin = ranges::begin(__r) + __n;
   2566  1.1.1.3  mrg 	      auto __end = ranges::end(__r);
   2567  1.1.1.3  mrg 	      if constexpr (std::__detail::__is_span<_Tp>)
   2568  1.1.1.3  mrg 		return span<typename _Tp::element_type>(__begin, __end);
   2569  1.1.1.3  mrg 	      else if constexpr (__detail::__is_subrange<_Tp>)
   2570  1.1.1.3  mrg 		{
   2571  1.1.1.3  mrg 		  if constexpr (_Tp::_S_store_size)
   2572  1.1.1.3  mrg 		    {
   2573  1.1.1.3  mrg 		      using ranges::__detail::__to_unsigned_like;
   2574  1.1.1.3  mrg 		      auto __m = ranges::distance(__r) - __n;
   2575  1.1.1.3  mrg 		      return _Tp(__begin, __end, __to_unsigned_like(__m));
   2576  1.1.1.3  mrg 		    }
   2577  1.1.1.3  mrg 		  else
   2578  1.1.1.3  mrg 		    return _Tp(__begin, __end);
   2579  1.1.1.3  mrg 		}
   2580  1.1.1.3  mrg 	      else
   2581  1.1.1.3  mrg 		return _Tp(__begin, __end);
   2582  1.1.1.3  mrg 	    }
   2583  1.1.1.3  mrg 	  else
   2584  1.1.1.3  mrg 	    return drop_view(std::forward<_Range>(__r), __n);
   2585  1.1.1.3  mrg 	}
   2586  1.1.1.3  mrg 
   2587  1.1.1.3  mrg       using _RangeAdaptor<_Drop>::operator();
   2588  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   2589  1.1.1.3  mrg       template<typename _Tp>
   2590  1.1.1.3  mrg 	static constexpr bool _S_has_simple_extra_args
   2591  1.1.1.3  mrg 	  = _Take::_S_has_simple_extra_args<_Tp>;
   2592  1.1.1.3  mrg     };
   2593  1.1.1.3  mrg 
   2594  1.1.1.3  mrg     inline constexpr _Drop drop;
   2595      1.1  mrg   } // namespace views
   2596      1.1  mrg 
   2597      1.1  mrg   template<view _Vp, typename _Pred>
   2598      1.1  mrg     requires input_range<_Vp> && is_object_v<_Pred>
   2599      1.1  mrg       && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
   2600      1.1  mrg     class drop_while_view : public view_interface<drop_while_view<_Vp, _Pred>>
   2601      1.1  mrg     {
   2602      1.1  mrg     private:
   2603      1.1  mrg       _Vp _M_base = _Vp();
   2604  1.1.1.3  mrg       [[no_unique_address]] __detail::__box<_Pred> _M_pred;
   2605      1.1  mrg       [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
   2606      1.1  mrg 
   2607      1.1  mrg     public:
   2608  1.1.1.3  mrg       drop_while_view() requires (default_initializable<_Vp>
   2609  1.1.1.3  mrg 				  && default_initializable<_Pred>)
   2610  1.1.1.3  mrg 	= default;
   2611      1.1  mrg 
   2612      1.1  mrg       constexpr
   2613      1.1  mrg       drop_while_view(_Vp __base, _Pred __pred)
   2614      1.1  mrg 	: _M_base(std::move(__base)), _M_pred(std::move(__pred))
   2615      1.1  mrg       { }
   2616      1.1  mrg 
   2617      1.1  mrg       constexpr _Vp
   2618      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2619      1.1  mrg       { return _M_base; }
   2620      1.1  mrg 
   2621      1.1  mrg       constexpr _Vp
   2622      1.1  mrg       base() &&
   2623      1.1  mrg       { return std::move(_M_base); }
   2624      1.1  mrg 
   2625      1.1  mrg       constexpr const _Pred&
   2626      1.1  mrg       pred() const
   2627      1.1  mrg       { return *_M_pred; }
   2628      1.1  mrg 
   2629      1.1  mrg       constexpr auto
   2630      1.1  mrg       begin()
   2631      1.1  mrg       {
   2632      1.1  mrg 	if (_M_cached_begin._M_has_value())
   2633      1.1  mrg 	  return _M_cached_begin._M_get(_M_base);
   2634      1.1  mrg 
   2635      1.1  mrg 	__glibcxx_assert(_M_pred.has_value());
   2636  1.1.1.3  mrg 	auto __it = ranges::find_if_not(ranges::begin(_M_base),
   2637  1.1.1.3  mrg 					ranges::end(_M_base),
   2638  1.1.1.3  mrg 					std::cref(*_M_pred));
   2639      1.1  mrg 	_M_cached_begin._M_set(_M_base, __it);
   2640      1.1  mrg 	return __it;
   2641      1.1  mrg       }
   2642      1.1  mrg 
   2643      1.1  mrg       constexpr auto
   2644      1.1  mrg       end()
   2645      1.1  mrg       { return ranges::end(_M_base); }
   2646      1.1  mrg     };
   2647      1.1  mrg 
   2648      1.1  mrg   template<typename _Range, typename _Pred>
   2649      1.1  mrg     drop_while_view(_Range&&, _Pred)
   2650      1.1  mrg       -> drop_while_view<views::all_t<_Range>, _Pred>;
   2651      1.1  mrg 
   2652      1.1  mrg   template<typename _Tp, typename _Pred>
   2653      1.1  mrg     inline constexpr bool enable_borrowed_range<drop_while_view<_Tp, _Pred>>
   2654      1.1  mrg       = enable_borrowed_range<_Tp>;
   2655      1.1  mrg 
   2656      1.1  mrg   namespace views
   2657      1.1  mrg   {
   2658  1.1.1.3  mrg     namespace __detail
   2659  1.1.1.3  mrg     {
   2660  1.1.1.3  mrg       template<typename _Range, typename _Pred>
   2661  1.1.1.3  mrg 	concept __can_drop_while_view
   2662  1.1.1.3  mrg 	  = requires { drop_while_view(std::declval<_Range>(), std::declval<_Pred>()); };
   2663  1.1.1.3  mrg     } // namespace __detail
   2664  1.1.1.3  mrg 
   2665  1.1.1.3  mrg     struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile>
   2666  1.1.1.3  mrg     {
   2667  1.1.1.3  mrg       template<viewable_range _Range, typename _Pred>
   2668  1.1.1.3  mrg 	requires __detail::__can_drop_while_view<_Range, _Pred>
   2669  1.1.1.3  mrg 	constexpr auto
   2670  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const
   2671  1.1.1.3  mrg 	{
   2672  1.1.1.3  mrg 	  return drop_while_view(std::forward<_Range>(__r),
   2673  1.1.1.3  mrg 				 std::forward<_Pred>(__p));
   2674  1.1.1.3  mrg 	}
   2675  1.1.1.3  mrg 
   2676  1.1.1.3  mrg       using _RangeAdaptor<_DropWhile>::operator();
   2677  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   2678  1.1.1.3  mrg       static constexpr bool _S_has_simple_extra_args = true;
   2679  1.1.1.3  mrg     };
   2680  1.1.1.3  mrg 
   2681  1.1.1.3  mrg     inline constexpr _DropWhile drop_while;
   2682      1.1  mrg   } // namespace views
   2683      1.1  mrg 
   2684      1.1  mrg   template<input_range _Vp>
   2685      1.1  mrg     requires view<_Vp> && input_range<range_reference_t<_Vp>>
   2686      1.1  mrg     class join_view : public view_interface<join_view<_Vp>>
   2687      1.1  mrg     {
   2688      1.1  mrg     private:
   2689      1.1  mrg       using _InnerRange = range_reference_t<_Vp>;
   2690      1.1  mrg 
   2691      1.1  mrg       template<bool _Const>
   2692      1.1  mrg 	using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   2693      1.1  mrg 
   2694      1.1  mrg       template<bool _Const>
   2695      1.1  mrg 	using _Outer_iter = iterator_t<_Base<_Const>>;
   2696      1.1  mrg 
   2697      1.1  mrg       template<bool _Const>
   2698      1.1  mrg 	using _Inner_iter = iterator_t<range_reference_t<_Base<_Const>>>;
   2699      1.1  mrg 
   2700      1.1  mrg       template<bool _Const>
   2701      1.1  mrg 	static constexpr bool _S_ref_is_glvalue
   2702      1.1  mrg 	  = is_reference_v<range_reference_t<_Base<_Const>>>;
   2703      1.1  mrg 
   2704      1.1  mrg       template<bool _Const>
   2705      1.1  mrg 	struct __iter_cat
   2706      1.1  mrg 	{ };
   2707      1.1  mrg 
   2708      1.1  mrg       template<bool _Const>
   2709      1.1  mrg 	requires _S_ref_is_glvalue<_Const>
   2710      1.1  mrg 	  && forward_range<_Base<_Const>>
   2711      1.1  mrg 	  && forward_range<range_reference_t<_Base<_Const>>>
   2712      1.1  mrg 	struct __iter_cat<_Const>
   2713      1.1  mrg 	{
   2714      1.1  mrg 	private:
   2715      1.1  mrg 	  static constexpr auto
   2716      1.1  mrg 	  _S_iter_cat()
   2717      1.1  mrg 	  {
   2718      1.1  mrg 	    using _Outer_iter = join_view::_Outer_iter<_Const>;
   2719      1.1  mrg 	    using _Inner_iter = join_view::_Inner_iter<_Const>;
   2720      1.1  mrg 	    using _OuterCat = typename iterator_traits<_Outer_iter>::iterator_category;
   2721      1.1  mrg 	    using _InnerCat = typename iterator_traits<_Inner_iter>::iterator_category;
   2722      1.1  mrg 	    if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
   2723  1.1.1.3  mrg 			  && derived_from<_InnerCat, bidirectional_iterator_tag>
   2724  1.1.1.3  mrg 			  && common_range<range_reference_t<_Base<_Const>>>)
   2725      1.1  mrg 	      return bidirectional_iterator_tag{};
   2726      1.1  mrg 	    else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
   2727      1.1  mrg 			       && derived_from<_InnerCat, forward_iterator_tag>)
   2728      1.1  mrg 	      return forward_iterator_tag{};
   2729      1.1  mrg 	    else
   2730      1.1  mrg 	      return input_iterator_tag{};
   2731      1.1  mrg 	  }
   2732      1.1  mrg 	public:
   2733      1.1  mrg 	  using iterator_category = decltype(_S_iter_cat());
   2734      1.1  mrg 	};
   2735      1.1  mrg 
   2736      1.1  mrg       template<bool _Const>
   2737      1.1  mrg 	struct _Sentinel;
   2738      1.1  mrg 
   2739      1.1  mrg       template<bool _Const>
   2740      1.1  mrg 	struct _Iterator : __iter_cat<_Const>
   2741      1.1  mrg 	{
   2742      1.1  mrg 	private:
   2743      1.1  mrg 	  using _Parent = __detail::__maybe_const_t<_Const, join_view>;
   2744      1.1  mrg 	  using _Base = join_view::_Base<_Const>;
   2745      1.1  mrg 
   2746      1.1  mrg 	  static constexpr bool _S_ref_is_glvalue
   2747      1.1  mrg 	    = join_view::_S_ref_is_glvalue<_Const>;
   2748      1.1  mrg 
   2749      1.1  mrg 	  constexpr void
   2750      1.1  mrg 	  _M_satisfy()
   2751      1.1  mrg 	  {
   2752  1.1.1.3  mrg 	    auto __update_inner = [this] (const iterator_t<_Base>& __x) -> auto&& {
   2753      1.1  mrg 	      if constexpr (_S_ref_is_glvalue)
   2754  1.1.1.3  mrg 		return *__x;
   2755      1.1  mrg 	      else
   2756  1.1.1.3  mrg 		return _M_parent->_M_inner._M_emplace_deref(__x);
   2757      1.1  mrg 	    };
   2758      1.1  mrg 
   2759      1.1  mrg 	    for (; _M_outer != ranges::end(_M_parent->_M_base); ++_M_outer)
   2760      1.1  mrg 	      {
   2761  1.1.1.3  mrg 		auto&& __inner = __update_inner(_M_outer);
   2762      1.1  mrg 		_M_inner = ranges::begin(__inner);
   2763      1.1  mrg 		if (_M_inner != ranges::end(__inner))
   2764      1.1  mrg 		  return;
   2765      1.1  mrg 	      }
   2766      1.1  mrg 
   2767      1.1  mrg 	    if constexpr (_S_ref_is_glvalue)
   2768      1.1  mrg 	      _M_inner = _Inner_iter();
   2769      1.1  mrg 	  }
   2770      1.1  mrg 
   2771      1.1  mrg 	  static constexpr auto
   2772      1.1  mrg 	  _S_iter_concept()
   2773      1.1  mrg 	  {
   2774      1.1  mrg 	    if constexpr (_S_ref_is_glvalue
   2775      1.1  mrg 			  && bidirectional_range<_Base>
   2776  1.1.1.3  mrg 			  && bidirectional_range<range_reference_t<_Base>>
   2777  1.1.1.3  mrg 			  && common_range<range_reference_t<_Base>>)
   2778      1.1  mrg 	      return bidirectional_iterator_tag{};
   2779      1.1  mrg 	    else if constexpr (_S_ref_is_glvalue
   2780      1.1  mrg 			       && forward_range<_Base>
   2781      1.1  mrg 			       && forward_range<range_reference_t<_Base>>)
   2782      1.1  mrg 	      return forward_iterator_tag{};
   2783      1.1  mrg 	    else
   2784      1.1  mrg 	      return input_iterator_tag{};
   2785      1.1  mrg 	  }
   2786      1.1  mrg 
   2787      1.1  mrg 	  using _Outer_iter = join_view::_Outer_iter<_Const>;
   2788      1.1  mrg 	  using _Inner_iter = join_view::_Inner_iter<_Const>;
   2789      1.1  mrg 
   2790      1.1  mrg 	  _Outer_iter _M_outer = _Outer_iter();
   2791      1.1  mrg 	  _Inner_iter _M_inner = _Inner_iter();
   2792      1.1  mrg 	  _Parent* _M_parent = nullptr;
   2793      1.1  mrg 
   2794      1.1  mrg 	public:
   2795      1.1  mrg 	  using iterator_concept = decltype(_S_iter_concept());
   2796      1.1  mrg 	  // iterator_category defined in __join_view_iter_cat
   2797      1.1  mrg 	  using value_type = range_value_t<range_reference_t<_Base>>;
   2798      1.1  mrg 	  using difference_type
   2799      1.1  mrg 	    = common_type_t<range_difference_t<_Base>,
   2800      1.1  mrg 			    range_difference_t<range_reference_t<_Base>>>;
   2801      1.1  mrg 
   2802      1.1  mrg 	  _Iterator() requires (default_initializable<_Outer_iter>
   2803      1.1  mrg 				&& default_initializable<_Inner_iter>)
   2804      1.1  mrg 	    = default;
   2805      1.1  mrg 
   2806      1.1  mrg 	  constexpr
   2807      1.1  mrg 	  _Iterator(_Parent* __parent, _Outer_iter __outer)
   2808      1.1  mrg 	    : _M_outer(std::move(__outer)),
   2809      1.1  mrg 	      _M_parent(__parent)
   2810      1.1  mrg 	  { _M_satisfy(); }
   2811      1.1  mrg 
   2812      1.1  mrg 	  constexpr
   2813      1.1  mrg 	  _Iterator(_Iterator<!_Const> __i)
   2814      1.1  mrg 	    requires _Const
   2815      1.1  mrg 	      && convertible_to<iterator_t<_Vp>, _Outer_iter>
   2816      1.1  mrg 	      && convertible_to<iterator_t<_InnerRange>, _Inner_iter>
   2817      1.1  mrg 	    : _M_outer(std::move(__i._M_outer)), _M_inner(std::move(__i._M_inner)),
   2818      1.1  mrg 	      _M_parent(__i._M_parent)
   2819      1.1  mrg 	  { }
   2820      1.1  mrg 
   2821      1.1  mrg 	  constexpr decltype(auto)
   2822      1.1  mrg 	  operator*() const
   2823      1.1  mrg 	  { return *_M_inner; }
   2824      1.1  mrg 
   2825      1.1  mrg 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
   2826      1.1  mrg 	  // 3500. join_view::iterator::operator->() is bogus
   2827      1.1  mrg 	  constexpr _Inner_iter
   2828      1.1  mrg 	  operator->() const
   2829      1.1  mrg 	    requires __detail::__has_arrow<_Inner_iter>
   2830      1.1  mrg 	      && copyable<_Inner_iter>
   2831      1.1  mrg 	  { return _M_inner; }
   2832      1.1  mrg 
   2833      1.1  mrg 	  constexpr _Iterator&
   2834      1.1  mrg 	  operator++()
   2835      1.1  mrg 	  {
   2836      1.1  mrg 	    auto&& __inner_range = [this] () -> auto&& {
   2837      1.1  mrg 	      if constexpr (_S_ref_is_glvalue)
   2838      1.1  mrg 		return *_M_outer;
   2839      1.1  mrg 	      else
   2840  1.1.1.3  mrg 		return *_M_parent->_M_inner;
   2841      1.1  mrg 	    }();
   2842      1.1  mrg 	    if (++_M_inner == ranges::end(__inner_range))
   2843      1.1  mrg 	      {
   2844      1.1  mrg 		++_M_outer;
   2845      1.1  mrg 		_M_satisfy();
   2846      1.1  mrg 	      }
   2847      1.1  mrg 	    return *this;
   2848      1.1  mrg 	  }
   2849      1.1  mrg 
   2850      1.1  mrg 	  constexpr void
   2851      1.1  mrg 	  operator++(int)
   2852      1.1  mrg 	  { ++*this; }
   2853      1.1  mrg 
   2854      1.1  mrg 	  constexpr _Iterator
   2855      1.1  mrg 	  operator++(int)
   2856      1.1  mrg 	    requires _S_ref_is_glvalue && forward_range<_Base>
   2857      1.1  mrg 	      && forward_range<range_reference_t<_Base>>
   2858      1.1  mrg 	  {
   2859      1.1  mrg 	    auto __tmp = *this;
   2860      1.1  mrg 	    ++*this;
   2861      1.1  mrg 	    return __tmp;
   2862      1.1  mrg 	  }
   2863      1.1  mrg 
   2864      1.1  mrg 	  constexpr _Iterator&
   2865      1.1  mrg 	  operator--()
   2866      1.1  mrg 	    requires _S_ref_is_glvalue && bidirectional_range<_Base>
   2867      1.1  mrg 	      && bidirectional_range<range_reference_t<_Base>>
   2868      1.1  mrg 	      && common_range<range_reference_t<_Base>>
   2869      1.1  mrg 	  {
   2870      1.1  mrg 	    if (_M_outer == ranges::end(_M_parent->_M_base))
   2871      1.1  mrg 	      _M_inner = ranges::end(*--_M_outer);
   2872      1.1  mrg 	    while (_M_inner == ranges::begin(*_M_outer))
   2873      1.1  mrg 	      _M_inner = ranges::end(*--_M_outer);
   2874      1.1  mrg 	    --_M_inner;
   2875      1.1  mrg 	    return *this;
   2876      1.1  mrg 	  }
   2877      1.1  mrg 
   2878      1.1  mrg 	  constexpr _Iterator
   2879      1.1  mrg 	  operator--(int)
   2880      1.1  mrg 	    requires _S_ref_is_glvalue && bidirectional_range<_Base>
   2881      1.1  mrg 	      && bidirectional_range<range_reference_t<_Base>>
   2882      1.1  mrg 	      && common_range<range_reference_t<_Base>>
   2883      1.1  mrg 	  {
   2884      1.1  mrg 	    auto __tmp = *this;
   2885      1.1  mrg 	    --*this;
   2886      1.1  mrg 	    return __tmp;
   2887      1.1  mrg 	  }
   2888      1.1  mrg 
   2889      1.1  mrg 	  friend constexpr bool
   2890      1.1  mrg 	  operator==(const _Iterator& __x, const _Iterator& __y)
   2891      1.1  mrg 	    requires _S_ref_is_glvalue
   2892      1.1  mrg 	      && equality_comparable<_Outer_iter>
   2893      1.1  mrg 	      && equality_comparable<_Inner_iter>
   2894      1.1  mrg 	  {
   2895      1.1  mrg 	    return (__x._M_outer == __y._M_outer
   2896      1.1  mrg 		    && __x._M_inner == __y._M_inner);
   2897      1.1  mrg 	  }
   2898      1.1  mrg 
   2899      1.1  mrg 	  friend constexpr decltype(auto)
   2900      1.1  mrg 	  iter_move(const _Iterator& __i)
   2901      1.1  mrg 	  noexcept(noexcept(ranges::iter_move(__i._M_inner)))
   2902      1.1  mrg 	  { return ranges::iter_move(__i._M_inner); }
   2903      1.1  mrg 
   2904      1.1  mrg 	  friend constexpr void
   2905      1.1  mrg 	  iter_swap(const _Iterator& __x, const _Iterator& __y)
   2906      1.1  mrg 	    noexcept(noexcept(ranges::iter_swap(__x._M_inner, __y._M_inner)))
   2907      1.1  mrg 	    requires indirectly_swappable<_Inner_iter>
   2908      1.1  mrg 	  { return ranges::iter_swap(__x._M_inner, __y._M_inner); }
   2909      1.1  mrg 
   2910      1.1  mrg 	  friend _Iterator<!_Const>;
   2911      1.1  mrg 	  template<bool> friend struct _Sentinel;
   2912      1.1  mrg 	};
   2913      1.1  mrg 
   2914      1.1  mrg       template<bool _Const>
   2915      1.1  mrg 	struct _Sentinel
   2916      1.1  mrg 	{
   2917      1.1  mrg 	private:
   2918      1.1  mrg 	  using _Parent = __detail::__maybe_const_t<_Const, join_view>;
   2919      1.1  mrg 	  using _Base = join_view::_Base<_Const>;
   2920      1.1  mrg 
   2921      1.1  mrg 	  template<bool _Const2>
   2922      1.1  mrg 	    constexpr bool
   2923      1.1  mrg 	    __equal(const _Iterator<_Const2>& __i) const
   2924      1.1  mrg 	    { return __i._M_outer == _M_end; }
   2925      1.1  mrg 
   2926      1.1  mrg 	  sentinel_t<_Base> _M_end = sentinel_t<_Base>();
   2927      1.1  mrg 
   2928      1.1  mrg 	public:
   2929      1.1  mrg 	  _Sentinel() = default;
   2930      1.1  mrg 
   2931      1.1  mrg 	  constexpr explicit
   2932      1.1  mrg 	  _Sentinel(_Parent* __parent)
   2933      1.1  mrg 	    : _M_end(ranges::end(__parent->_M_base))
   2934      1.1  mrg 	  { }
   2935      1.1  mrg 
   2936      1.1  mrg 	  constexpr
   2937      1.1  mrg 	  _Sentinel(_Sentinel<!_Const> __s)
   2938      1.1  mrg 	    requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
   2939      1.1  mrg 	    : _M_end(std::move(__s._M_end))
   2940      1.1  mrg 	  { }
   2941      1.1  mrg 
   2942      1.1  mrg 	  template<bool _Const2>
   2943      1.1  mrg 	    requires sentinel_for<sentinel_t<_Base>,
   2944      1.1  mrg 		       iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
   2945      1.1  mrg 	    friend constexpr bool
   2946      1.1  mrg 	    operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
   2947      1.1  mrg 	    { return __y.__equal(__x); }
   2948      1.1  mrg 
   2949      1.1  mrg 	  friend _Sentinel<!_Const>;
   2950      1.1  mrg 	};
   2951      1.1  mrg 
   2952      1.1  mrg       _Vp _M_base = _Vp();
   2953      1.1  mrg       [[no_unique_address]]
   2954  1.1.1.3  mrg 	__detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner;
   2955      1.1  mrg 
   2956      1.1  mrg     public:
   2957      1.1  mrg       join_view() requires default_initializable<_Vp> = default;
   2958      1.1  mrg 
   2959      1.1  mrg       constexpr explicit
   2960      1.1  mrg       join_view(_Vp __base)
   2961      1.1  mrg 	: _M_base(std::move(__base))
   2962      1.1  mrg       { }
   2963      1.1  mrg 
   2964      1.1  mrg       constexpr _Vp
   2965      1.1  mrg       base() const& requires copy_constructible<_Vp>
   2966      1.1  mrg       { return _M_base; }
   2967      1.1  mrg 
   2968      1.1  mrg       constexpr _Vp
   2969      1.1  mrg       base() &&
   2970      1.1  mrg       { return std::move(_M_base); }
   2971      1.1  mrg 
   2972      1.1  mrg       constexpr auto
   2973      1.1  mrg       begin()
   2974      1.1  mrg       {
   2975      1.1  mrg 	constexpr bool __use_const
   2976      1.1  mrg 	  = (__detail::__simple_view<_Vp>
   2977      1.1  mrg 	     && is_reference_v<range_reference_t<_Vp>>);
   2978      1.1  mrg 	return _Iterator<__use_const>{this, ranges::begin(_M_base)};
   2979      1.1  mrg       }
   2980      1.1  mrg 
   2981      1.1  mrg       constexpr auto
   2982      1.1  mrg       begin() const
   2983      1.1  mrg 	requires input_range<const _Vp>
   2984      1.1  mrg 	  && is_reference_v<range_reference_t<const _Vp>>
   2985      1.1  mrg       {
   2986      1.1  mrg 	return _Iterator<true>{this, ranges::begin(_M_base)};
   2987      1.1  mrg       }
   2988      1.1  mrg 
   2989      1.1  mrg       constexpr auto
   2990      1.1  mrg       end()
   2991      1.1  mrg       {
   2992      1.1  mrg 	if constexpr (forward_range<_Vp> && is_reference_v<_InnerRange>
   2993      1.1  mrg 		      && forward_range<_InnerRange>
   2994      1.1  mrg 		      && common_range<_Vp> && common_range<_InnerRange>)
   2995      1.1  mrg 	  return _Iterator<__detail::__simple_view<_Vp>>{this,
   2996      1.1  mrg 							 ranges::end(_M_base)};
   2997      1.1  mrg 	else
   2998      1.1  mrg 	  return _Sentinel<__detail::__simple_view<_Vp>>{this};
   2999      1.1  mrg       }
   3000      1.1  mrg 
   3001      1.1  mrg       constexpr auto
   3002      1.1  mrg       end() const
   3003      1.1  mrg 	requires input_range<const _Vp>
   3004      1.1  mrg 	  && is_reference_v<range_reference_t<const _Vp>>
   3005      1.1  mrg       {
   3006      1.1  mrg 	if constexpr (forward_range<const _Vp>
   3007      1.1  mrg 		      && is_reference_v<range_reference_t<const _Vp>>
   3008      1.1  mrg 		      && forward_range<range_reference_t<const _Vp>>
   3009      1.1  mrg 		      && common_range<const _Vp>
   3010      1.1  mrg 		      && common_range<range_reference_t<const _Vp>>)
   3011      1.1  mrg 	  return _Iterator<true>{this, ranges::end(_M_base)};
   3012      1.1  mrg 	else
   3013      1.1  mrg 	  return _Sentinel<true>{this};
   3014      1.1  mrg       }
   3015      1.1  mrg     };
   3016      1.1  mrg 
   3017      1.1  mrg   template<typename _Range>
   3018      1.1  mrg     explicit join_view(_Range&&) -> join_view<views::all_t<_Range>>;
   3019      1.1  mrg 
   3020      1.1  mrg   namespace views
   3021      1.1  mrg   {
   3022  1.1.1.3  mrg     namespace __detail
   3023  1.1.1.3  mrg     {
   3024  1.1.1.3  mrg       template<typename _Range>
   3025  1.1.1.3  mrg 	concept __can_join_view
   3026  1.1.1.3  mrg 	  = requires { join_view<all_t<_Range>>{std::declval<_Range>()}; };
   3027  1.1.1.3  mrg     } // namespace __detail
   3028  1.1.1.3  mrg 
   3029  1.1.1.3  mrg     struct _Join : __adaptor::_RangeAdaptorClosure
   3030  1.1.1.3  mrg     {
   3031  1.1.1.3  mrg       template<viewable_range _Range>
   3032  1.1.1.3  mrg 	requires __detail::__can_join_view<_Range>
   3033  1.1.1.3  mrg 	constexpr auto
   3034  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r) const
   3035  1.1.1.3  mrg 	{
   3036  1.1.1.3  mrg 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
   3037  1.1.1.3  mrg 	  // 3474. Nesting join_views is broken because of CTAD
   3038  1.1.1.3  mrg 	  return join_view<all_t<_Range>>{std::forward<_Range>(__r)};
   3039  1.1.1.3  mrg 	}
   3040  1.1.1.3  mrg 
   3041  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   3042  1.1.1.3  mrg     };
   3043  1.1.1.3  mrg 
   3044  1.1.1.3  mrg     inline constexpr _Join join;
   3045      1.1  mrg   } // namespace views
   3046      1.1  mrg 
   3047      1.1  mrg   namespace __detail
   3048      1.1  mrg   {
   3049      1.1  mrg     template<auto>
   3050      1.1  mrg       struct __require_constant;
   3051      1.1  mrg 
   3052      1.1  mrg     template<typename _Range>
   3053      1.1  mrg       concept __tiny_range = sized_range<_Range>
   3054      1.1  mrg 	&& requires
   3055      1.1  mrg 	   { typename __require_constant<remove_reference_t<_Range>::size()>; }
   3056      1.1  mrg 	&& (remove_reference_t<_Range>::size() <= 1);
   3057      1.1  mrg 
   3058      1.1  mrg     template<typename _Base>
   3059  1.1.1.3  mrg       struct __lazy_split_view_outer_iter_cat
   3060      1.1  mrg       { };
   3061      1.1  mrg 
   3062      1.1  mrg     template<forward_range _Base>
   3063  1.1.1.3  mrg       struct __lazy_split_view_outer_iter_cat<_Base>
   3064      1.1  mrg       { using iterator_category = input_iterator_tag; };
   3065      1.1  mrg 
   3066      1.1  mrg     template<typename _Base>
   3067  1.1.1.3  mrg       struct __lazy_split_view_inner_iter_cat
   3068      1.1  mrg       { };
   3069      1.1  mrg 
   3070      1.1  mrg     template<forward_range _Base>
   3071  1.1.1.3  mrg       struct __lazy_split_view_inner_iter_cat<_Base>
   3072      1.1  mrg       {
   3073      1.1  mrg       private:
   3074      1.1  mrg 	static constexpr auto
   3075      1.1  mrg 	_S_iter_cat()
   3076      1.1  mrg 	{
   3077      1.1  mrg 	  using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category;
   3078      1.1  mrg 	  if constexpr (derived_from<_Cat, forward_iterator_tag>)
   3079      1.1  mrg 	    return forward_iterator_tag{};
   3080      1.1  mrg 	  else
   3081      1.1  mrg 	    return _Cat{};
   3082      1.1  mrg 	}
   3083      1.1  mrg       public:
   3084      1.1  mrg 	using iterator_category = decltype(_S_iter_cat());
   3085      1.1  mrg       };
   3086      1.1  mrg   }
   3087      1.1  mrg 
   3088      1.1  mrg   template<input_range _Vp, forward_range _Pattern>
   3089      1.1  mrg     requires view<_Vp> && view<_Pattern>
   3090      1.1  mrg       && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
   3091      1.1  mrg 			       ranges::equal_to>
   3092      1.1  mrg       && (forward_range<_Vp> || __detail::__tiny_range<_Pattern>)
   3093  1.1.1.3  mrg     class lazy_split_view : public view_interface<lazy_split_view<_Vp, _Pattern>>
   3094      1.1  mrg     {
   3095      1.1  mrg     private:
   3096      1.1  mrg       template<bool _Const>
   3097      1.1  mrg 	using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   3098      1.1  mrg 
   3099      1.1  mrg       template<bool _Const>
   3100      1.1  mrg 	struct _InnerIter;
   3101      1.1  mrg 
   3102      1.1  mrg       template<bool _Const>
   3103      1.1  mrg 	struct _OuterIter
   3104  1.1.1.3  mrg 	  : __detail::__lazy_split_view_outer_iter_cat<_Base<_Const>>
   3105      1.1  mrg 	{
   3106      1.1  mrg 	private:
   3107  1.1.1.3  mrg 	  using _Parent = __detail::__maybe_const_t<_Const, lazy_split_view>;
   3108  1.1.1.3  mrg 	  using _Base = lazy_split_view::_Base<_Const>;
   3109      1.1  mrg 
   3110      1.1  mrg 	  constexpr bool
   3111      1.1  mrg 	  __at_end() const
   3112  1.1.1.3  mrg 	  { return __current() == ranges::end(_M_parent->_M_base) && !_M_trailing_empty; }
   3113      1.1  mrg 
   3114  1.1.1.3  mrg 	  // [range.lazy.split.outer] p1
   3115      1.1  mrg 	  //  Many of the following specifications refer to the notional member
   3116      1.1  mrg 	  //  current of outer-iterator.  current is equivalent to current_ if
   3117      1.1  mrg 	  //  V models forward_range, and parent_->current_ otherwise.
   3118      1.1  mrg 	  constexpr auto&
   3119      1.1  mrg 	  __current() noexcept
   3120      1.1  mrg 	  {
   3121      1.1  mrg 	    if constexpr (forward_range<_Vp>)
   3122      1.1  mrg 	      return _M_current;
   3123      1.1  mrg 	    else
   3124  1.1.1.3  mrg 	      return *_M_parent->_M_current;
   3125      1.1  mrg 	  }
   3126      1.1  mrg 
   3127      1.1  mrg 	  constexpr auto&
   3128      1.1  mrg 	  __current() const noexcept
   3129      1.1  mrg 	  {
   3130      1.1  mrg 	    if constexpr (forward_range<_Vp>)
   3131      1.1  mrg 	      return _M_current;
   3132      1.1  mrg 	    else
   3133  1.1.1.3  mrg 	      return *_M_parent->_M_current;
   3134      1.1  mrg 	  }
   3135      1.1  mrg 
   3136      1.1  mrg 	  _Parent* _M_parent = nullptr;
   3137      1.1  mrg 
   3138      1.1  mrg 	  // XXX: _M_current is present only if "V models forward_range"
   3139      1.1  mrg 	  [[no_unique_address]]
   3140      1.1  mrg 	    __detail::__maybe_present_t<forward_range<_Vp>,
   3141      1.1  mrg 					iterator_t<_Base>> _M_current;
   3142  1.1.1.3  mrg 	  bool _M_trailing_empty = false;
   3143      1.1  mrg 
   3144      1.1  mrg 	public:
   3145  1.1.1.3  mrg 	  using iterator_concept = __conditional_t<forward_range<_Base>,
   3146  1.1.1.3  mrg 						   forward_iterator_tag,
   3147  1.1.1.3  mrg 						   input_iterator_tag>;
   3148  1.1.1.3  mrg 	  // iterator_category defined in __lazy_split_view_outer_iter_cat
   3149      1.1  mrg 	  using difference_type = range_difference_t<_Base>;
   3150      1.1  mrg 
   3151      1.1  mrg 	  struct value_type : view_interface<value_type>
   3152      1.1  mrg 	  {
   3153      1.1  mrg 	  private:
   3154      1.1  mrg 	    _OuterIter _M_i = _OuterIter();
   3155      1.1  mrg 
   3156      1.1  mrg 	  public:
   3157      1.1  mrg 	    value_type() = default;
   3158      1.1  mrg 
   3159      1.1  mrg 	    constexpr explicit
   3160      1.1  mrg 	    value_type(_OuterIter __i)
   3161      1.1  mrg 	      : _M_i(std::move(__i))
   3162      1.1  mrg 	    { }
   3163      1.1  mrg 
   3164      1.1  mrg 	    constexpr _InnerIter<_Const>
   3165      1.1  mrg 	    begin() const
   3166      1.1  mrg 	    { return _InnerIter<_Const>{_M_i}; }
   3167      1.1  mrg 
   3168      1.1  mrg 	    constexpr default_sentinel_t
   3169  1.1.1.3  mrg 	    end() const noexcept
   3170      1.1  mrg 	    { return default_sentinel; }
   3171      1.1  mrg 	  };
   3172      1.1  mrg 
   3173      1.1  mrg 	  _OuterIter() = default;
   3174      1.1  mrg 
   3175      1.1  mrg 	  constexpr explicit
   3176      1.1  mrg 	  _OuterIter(_Parent* __parent) requires (!forward_range<_Base>)
   3177      1.1  mrg 	    : _M_parent(__parent)
   3178      1.1  mrg 	  { }
   3179      1.1  mrg 
   3180      1.1  mrg 	  constexpr
   3181      1.1  mrg 	  _OuterIter(_Parent* __parent, iterator_t<_Base> __current)
   3182      1.1  mrg 	    requires forward_range<_Base>
   3183      1.1  mrg 	    : _M_parent(__parent),
   3184      1.1  mrg 	      _M_current(std::move(__current))
   3185      1.1  mrg 	  { }
   3186      1.1  mrg 
   3187      1.1  mrg 	  constexpr
   3188      1.1  mrg 	  _OuterIter(_OuterIter<!_Const> __i)
   3189      1.1  mrg 	    requires _Const
   3190      1.1  mrg 	      && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
   3191  1.1.1.3  mrg 	    : _M_parent(__i._M_parent), _M_current(std::move(__i._M_current)),
   3192  1.1.1.3  mrg 	      _M_trailing_empty(__i._M_trailing_empty)
   3193      1.1  mrg 	  { }
   3194      1.1  mrg 
   3195      1.1  mrg 	  constexpr value_type
   3196      1.1  mrg 	  operator*() const
   3197      1.1  mrg 	  { return value_type{*this}; }
   3198      1.1  mrg 
   3199      1.1  mrg 	  constexpr _OuterIter&
   3200      1.1  mrg 	  operator++()
   3201      1.1  mrg 	  {
   3202      1.1  mrg 	    // _GLIBCXX_RESOLVE_LIB_DEFECTS
   3203  1.1.1.3  mrg 	    // 3505. lazy_split_view::outer-iterator::operator++ misspecified
   3204      1.1  mrg 	    const auto __end = ranges::end(_M_parent->_M_base);
   3205      1.1  mrg 	    if (__current() == __end)
   3206  1.1.1.3  mrg 	      {
   3207  1.1.1.3  mrg 		_M_trailing_empty = false;
   3208  1.1.1.3  mrg 		return *this;
   3209  1.1.1.3  mrg 	      }
   3210      1.1  mrg 	    const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern};
   3211      1.1  mrg 	    if (__pbegin == __pend)
   3212      1.1  mrg 	      ++__current();
   3213      1.1  mrg 	    else if constexpr (__detail::__tiny_range<_Pattern>)
   3214      1.1  mrg 	      {
   3215  1.1.1.3  mrg 		__current() = ranges::find(std::move(__current()), __end,
   3216  1.1.1.3  mrg 					   *__pbegin);
   3217      1.1  mrg 		if (__current() != __end)
   3218  1.1.1.3  mrg 		  {
   3219  1.1.1.3  mrg 		    ++__current();
   3220  1.1.1.3  mrg 		    if (__current() == __end)
   3221  1.1.1.3  mrg 		      _M_trailing_empty = true;
   3222  1.1.1.3  mrg 		  }
   3223      1.1  mrg 	      }
   3224      1.1  mrg 	    else
   3225      1.1  mrg 	      do
   3226      1.1  mrg 		{
   3227      1.1  mrg 		  auto [__b, __p]
   3228  1.1.1.3  mrg 		    = ranges::mismatch(__current(), __end, __pbegin, __pend);
   3229      1.1  mrg 		  if (__p == __pend)
   3230      1.1  mrg 		    {
   3231      1.1  mrg 		      __current() = __b;
   3232  1.1.1.3  mrg 		      if (__current() == __end)
   3233  1.1.1.3  mrg 			_M_trailing_empty = true;
   3234      1.1  mrg 		      break;
   3235      1.1  mrg 		    }
   3236      1.1  mrg 		} while (++__current() != __end);
   3237      1.1  mrg 	    return *this;
   3238      1.1  mrg 	  }
   3239      1.1  mrg 
   3240      1.1  mrg 	  constexpr decltype(auto)
   3241      1.1  mrg 	  operator++(int)
   3242      1.1  mrg 	  {
   3243      1.1  mrg 	    if constexpr (forward_range<_Base>)
   3244      1.1  mrg 	      {
   3245      1.1  mrg 		auto __tmp = *this;
   3246      1.1  mrg 		++*this;
   3247      1.1  mrg 		return __tmp;
   3248      1.1  mrg 	      }
   3249      1.1  mrg 	    else
   3250      1.1  mrg 	      ++*this;
   3251      1.1  mrg 	  }
   3252      1.1  mrg 
   3253      1.1  mrg 	  friend constexpr bool
   3254      1.1  mrg 	  operator==(const _OuterIter& __x, const _OuterIter& __y)
   3255      1.1  mrg 	    requires forward_range<_Base>
   3256  1.1.1.3  mrg 	  {
   3257  1.1.1.3  mrg 	    return __x._M_current == __y._M_current
   3258  1.1.1.3  mrg 	      && __x._M_trailing_empty == __y._M_trailing_empty;
   3259  1.1.1.3  mrg 	  }
   3260      1.1  mrg 
   3261      1.1  mrg 	  friend constexpr bool
   3262      1.1  mrg 	  operator==(const _OuterIter& __x, default_sentinel_t)
   3263      1.1  mrg 	  { return __x.__at_end(); };
   3264      1.1  mrg 
   3265      1.1  mrg 	  friend _OuterIter<!_Const>;
   3266      1.1  mrg 	  friend _InnerIter<_Const>;
   3267      1.1  mrg 	};
   3268      1.1  mrg 
   3269      1.1  mrg       template<bool _Const>
   3270      1.1  mrg 	struct _InnerIter
   3271  1.1.1.3  mrg 	  : __detail::__lazy_split_view_inner_iter_cat<_Base<_Const>>
   3272      1.1  mrg 	{
   3273      1.1  mrg 	private:
   3274  1.1.1.3  mrg 	  using _Base = lazy_split_view::_Base<_Const>;
   3275      1.1  mrg 
   3276      1.1  mrg 	  constexpr bool
   3277      1.1  mrg 	  __at_end() const
   3278      1.1  mrg 	  {
   3279      1.1  mrg 	    auto [__pcur, __pend] = subrange{_M_i._M_parent->_M_pattern};
   3280      1.1  mrg 	    auto __end = ranges::end(_M_i._M_parent->_M_base);
   3281      1.1  mrg 	    if constexpr (__detail::__tiny_range<_Pattern>)
   3282      1.1  mrg 	      {
   3283      1.1  mrg 		const auto& __cur = _M_i_current();
   3284      1.1  mrg 		if (__cur == __end)
   3285      1.1  mrg 		  return true;
   3286      1.1  mrg 		if (__pcur == __pend)
   3287      1.1  mrg 		  return _M_incremented;
   3288      1.1  mrg 		return *__cur == *__pcur;
   3289      1.1  mrg 	      }
   3290      1.1  mrg 	    else
   3291      1.1  mrg 	      {
   3292      1.1  mrg 		auto __cur = _M_i_current();
   3293      1.1  mrg 		if (__cur == __end)
   3294      1.1  mrg 		  return true;
   3295      1.1  mrg 		if (__pcur == __pend)
   3296      1.1  mrg 		  return _M_incremented;
   3297      1.1  mrg 		do
   3298      1.1  mrg 		  {
   3299      1.1  mrg 		    if (*__cur != *__pcur)
   3300      1.1  mrg 		      return false;
   3301      1.1  mrg 		    if (++__pcur == __pend)
   3302      1.1  mrg 		      return true;
   3303      1.1  mrg 		  } while (++__cur != __end);
   3304      1.1  mrg 		return false;
   3305      1.1  mrg 	      }
   3306      1.1  mrg 	  }
   3307      1.1  mrg 
   3308      1.1  mrg 	  constexpr auto&
   3309      1.1  mrg 	  _M_i_current() noexcept
   3310      1.1  mrg 	  { return _M_i.__current(); }
   3311      1.1  mrg 
   3312      1.1  mrg 	  constexpr auto&
   3313      1.1  mrg 	  _M_i_current() const noexcept
   3314      1.1  mrg 	  { return _M_i.__current(); }
   3315      1.1  mrg 
   3316      1.1  mrg 	  _OuterIter<_Const> _M_i = _OuterIter<_Const>();
   3317      1.1  mrg 	  bool _M_incremented = false;
   3318      1.1  mrg 
   3319      1.1  mrg 	public:
   3320      1.1  mrg 	  using iterator_concept
   3321      1.1  mrg 	    = typename _OuterIter<_Const>::iterator_concept;
   3322  1.1.1.3  mrg 	  // iterator_category defined in __lazy_split_view_inner_iter_cat
   3323      1.1  mrg 	  using value_type = range_value_t<_Base>;
   3324      1.1  mrg 	  using difference_type = range_difference_t<_Base>;
   3325      1.1  mrg 
   3326      1.1  mrg 	  _InnerIter() = default;
   3327      1.1  mrg 
   3328      1.1  mrg 	  constexpr explicit
   3329      1.1  mrg 	  _InnerIter(_OuterIter<_Const> __i)
   3330      1.1  mrg 	    : _M_i(std::move(__i))
   3331      1.1  mrg 	  { }
   3332      1.1  mrg 
   3333      1.1  mrg 	  constexpr const iterator_t<_Base>&
   3334      1.1  mrg 	  base() const& noexcept
   3335      1.1  mrg 	  { return _M_i_current(); }
   3336      1.1  mrg 
   3337      1.1  mrg 	  constexpr iterator_t<_Base>
   3338  1.1.1.3  mrg 	  base() && requires forward_range<_Vp>
   3339      1.1  mrg 	  { return std::move(_M_i_current()); }
   3340      1.1  mrg 
   3341      1.1  mrg 	  constexpr decltype(auto)
   3342      1.1  mrg 	  operator*() const
   3343      1.1  mrg 	  { return *_M_i_current(); }
   3344      1.1  mrg 
   3345      1.1  mrg 	  constexpr _InnerIter&
   3346      1.1  mrg 	  operator++()
   3347      1.1  mrg 	  {
   3348      1.1  mrg 	    _M_incremented = true;
   3349      1.1  mrg 	    if constexpr (!forward_range<_Base>)
   3350      1.1  mrg 	      if constexpr (_Pattern::size() == 0)
   3351      1.1  mrg 		return *this;
   3352      1.1  mrg 	    ++_M_i_current();
   3353      1.1  mrg 	    return *this;
   3354      1.1  mrg 	  }
   3355      1.1  mrg 
   3356      1.1  mrg 	  constexpr decltype(auto)
   3357      1.1  mrg 	  operator++(int)
   3358      1.1  mrg 	  {
   3359      1.1  mrg 	    if constexpr (forward_range<_Base>)
   3360      1.1  mrg 	      {
   3361      1.1  mrg 		auto __tmp = *this;
   3362      1.1  mrg 		++*this;
   3363      1.1  mrg 		return __tmp;
   3364      1.1  mrg 	      }
   3365      1.1  mrg 	    else
   3366      1.1  mrg 	      ++*this;
   3367      1.1  mrg 	  }
   3368      1.1  mrg 
   3369      1.1  mrg 	  friend constexpr bool
   3370      1.1  mrg 	  operator==(const _InnerIter& __x, const _InnerIter& __y)
   3371      1.1  mrg 	    requires forward_range<_Base>
   3372      1.1  mrg 	  { return __x._M_i == __y._M_i; }
   3373      1.1  mrg 
   3374      1.1  mrg 	  friend constexpr bool
   3375      1.1  mrg 	  operator==(const _InnerIter& __x, default_sentinel_t)
   3376      1.1  mrg 	  { return __x.__at_end(); }
   3377      1.1  mrg 
   3378      1.1  mrg 	  friend constexpr decltype(auto)
   3379      1.1  mrg 	  iter_move(const _InnerIter& __i)
   3380      1.1  mrg 	    noexcept(noexcept(ranges::iter_move(__i._M_i_current())))
   3381      1.1  mrg 	  { return ranges::iter_move(__i._M_i_current()); }
   3382      1.1  mrg 
   3383      1.1  mrg 	  friend constexpr void
   3384      1.1  mrg 	  iter_swap(const _InnerIter& __x, const _InnerIter& __y)
   3385      1.1  mrg 	    noexcept(noexcept(ranges::iter_swap(__x._M_i_current(),
   3386      1.1  mrg 						__y._M_i_current())))
   3387      1.1  mrg 	    requires indirectly_swappable<iterator_t<_Base>>
   3388      1.1  mrg 	  { ranges::iter_swap(__x._M_i_current(), __y._M_i_current()); }
   3389      1.1  mrg 	};
   3390      1.1  mrg 
   3391      1.1  mrg       _Vp _M_base = _Vp();
   3392      1.1  mrg       _Pattern _M_pattern = _Pattern();
   3393      1.1  mrg       // XXX: _M_current is "present only if !forward_range<V>"
   3394      1.1  mrg       [[no_unique_address]]
   3395  1.1.1.3  mrg 	__detail::__maybe_present_t<!forward_range<_Vp>,
   3396  1.1.1.3  mrg 	  __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_current;
   3397      1.1  mrg 
   3398      1.1  mrg 
   3399      1.1  mrg     public:
   3400  1.1.1.3  mrg       lazy_split_view() requires (default_initializable<_Vp>
   3401  1.1.1.3  mrg 				  && default_initializable<_Pattern>)
   3402      1.1  mrg 	= default;
   3403      1.1  mrg 
   3404      1.1  mrg       constexpr
   3405  1.1.1.3  mrg       lazy_split_view(_Vp __base, _Pattern __pattern)
   3406      1.1  mrg 	: _M_base(std::move(__base)), _M_pattern(std::move(__pattern))
   3407      1.1  mrg       { }
   3408      1.1  mrg 
   3409      1.1  mrg       template<input_range _Range>
   3410      1.1  mrg 	requires constructible_from<_Vp, views::all_t<_Range>>
   3411      1.1  mrg 	  && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
   3412      1.1  mrg 	constexpr
   3413  1.1.1.3  mrg 	lazy_split_view(_Range&& __r, range_value_t<_Range> __e)
   3414      1.1  mrg 	  : _M_base(views::all(std::forward<_Range>(__r))),
   3415  1.1.1.3  mrg 	    _M_pattern(views::single(std::move(__e)))
   3416      1.1  mrg 	{ }
   3417      1.1  mrg 
   3418      1.1  mrg       constexpr _Vp
   3419      1.1  mrg       base() const& requires copy_constructible<_Vp>
   3420      1.1  mrg       { return _M_base; }
   3421      1.1  mrg 
   3422      1.1  mrg       constexpr _Vp
   3423      1.1  mrg       base() &&
   3424      1.1  mrg       { return std::move(_M_base); }
   3425      1.1  mrg 
   3426      1.1  mrg       constexpr auto
   3427      1.1  mrg       begin()
   3428      1.1  mrg       {
   3429      1.1  mrg 	if constexpr (forward_range<_Vp>)
   3430  1.1.1.3  mrg 	  {
   3431  1.1.1.3  mrg 	    constexpr bool __simple
   3432  1.1.1.3  mrg 	      = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
   3433  1.1.1.3  mrg 	    return _OuterIter<__simple>{this, ranges::begin(_M_base)};
   3434  1.1.1.3  mrg 	  }
   3435      1.1  mrg 	else
   3436      1.1  mrg 	  {
   3437      1.1  mrg 	    _M_current = ranges::begin(_M_base);
   3438      1.1  mrg 	    return _OuterIter<false>{this};
   3439      1.1  mrg 	  }
   3440      1.1  mrg       }
   3441      1.1  mrg 
   3442      1.1  mrg       constexpr auto
   3443      1.1  mrg       begin() const requires forward_range<_Vp> && forward_range<const _Vp>
   3444      1.1  mrg       {
   3445      1.1  mrg 	return _OuterIter<true>{this, ranges::begin(_M_base)};
   3446      1.1  mrg       }
   3447      1.1  mrg 
   3448      1.1  mrg       constexpr auto
   3449      1.1  mrg       end() requires forward_range<_Vp> && common_range<_Vp>
   3450      1.1  mrg       {
   3451  1.1.1.3  mrg 	constexpr bool __simple
   3452  1.1.1.3  mrg 	  = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>;
   3453  1.1.1.3  mrg 	return _OuterIter<__simple>{this, ranges::end(_M_base)};
   3454      1.1  mrg       }
   3455      1.1  mrg 
   3456      1.1  mrg       constexpr auto
   3457      1.1  mrg       end() const
   3458      1.1  mrg       {
   3459      1.1  mrg 	if constexpr (forward_range<_Vp>
   3460      1.1  mrg 		      && forward_range<const _Vp>
   3461      1.1  mrg 		      && common_range<const _Vp>)
   3462      1.1  mrg 	  return _OuterIter<true>{this, ranges::end(_M_base)};
   3463      1.1  mrg 	else
   3464      1.1  mrg 	  return default_sentinel;
   3465      1.1  mrg       }
   3466      1.1  mrg     };
   3467      1.1  mrg 
   3468  1.1.1.3  mrg   template<typename _Range, typename _Pattern>
   3469  1.1.1.3  mrg     lazy_split_view(_Range&&, _Pattern&&)
   3470  1.1.1.3  mrg       -> lazy_split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
   3471      1.1  mrg 
   3472      1.1  mrg   template<input_range _Range>
   3473  1.1.1.3  mrg     lazy_split_view(_Range&&, range_value_t<_Range>)
   3474  1.1.1.3  mrg       -> lazy_split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>;
   3475  1.1.1.3  mrg 
   3476  1.1.1.3  mrg   namespace views
   3477  1.1.1.3  mrg   {
   3478  1.1.1.3  mrg     namespace __detail
   3479  1.1.1.3  mrg     {
   3480  1.1.1.3  mrg       template<typename _Range, typename _Pattern>
   3481  1.1.1.3  mrg 	concept __can_lazy_split_view
   3482  1.1.1.3  mrg 	  = requires { lazy_split_view(std::declval<_Range>(), std::declval<_Pattern>()); };
   3483  1.1.1.3  mrg     } // namespace __detail
   3484  1.1.1.3  mrg 
   3485  1.1.1.3  mrg     struct _LazySplit : __adaptor::_RangeAdaptor<_LazySplit>
   3486  1.1.1.3  mrg     {
   3487  1.1.1.3  mrg       template<viewable_range _Range, typename _Pattern>
   3488  1.1.1.3  mrg 	requires __detail::__can_lazy_split_view<_Range, _Pattern>
   3489  1.1.1.3  mrg 	constexpr auto
   3490  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f) const
   3491  1.1.1.3  mrg 	{
   3492  1.1.1.3  mrg 	  return lazy_split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f));
   3493  1.1.1.3  mrg 	}
   3494  1.1.1.3  mrg 
   3495  1.1.1.3  mrg       using _RangeAdaptor<_LazySplit>::operator();
   3496  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   3497  1.1.1.3  mrg       // The pattern argument of views::lazy_split is not always simple -- it can be
   3498  1.1.1.3  mrg       // a non-view range, the value category of which affects whether the call
   3499  1.1.1.3  mrg       // is well-formed.  But a scalar or a view pattern argument is surely
   3500  1.1.1.3  mrg       // simple.
   3501  1.1.1.3  mrg       template<typename _Pattern>
   3502  1.1.1.3  mrg 	static constexpr bool _S_has_simple_extra_args
   3503  1.1.1.3  mrg 	  = is_scalar_v<_Pattern> || (view<_Pattern>
   3504  1.1.1.3  mrg 				      && copy_constructible<_Pattern>);
   3505  1.1.1.3  mrg     };
   3506  1.1.1.3  mrg 
   3507  1.1.1.3  mrg     inline constexpr _LazySplit lazy_split;
   3508  1.1.1.3  mrg   } // namespace views
   3509  1.1.1.3  mrg 
   3510  1.1.1.3  mrg   template<forward_range _Vp, forward_range _Pattern>
   3511  1.1.1.3  mrg     requires view<_Vp> && view<_Pattern>
   3512  1.1.1.3  mrg       && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
   3513  1.1.1.3  mrg 			       ranges::equal_to>
   3514  1.1.1.3  mrg   class split_view : public view_interface<split_view<_Vp, _Pattern>>
   3515  1.1.1.3  mrg   {
   3516  1.1.1.3  mrg   private:
   3517  1.1.1.3  mrg     _Vp _M_base = _Vp();
   3518  1.1.1.3  mrg     _Pattern _M_pattern = _Pattern();
   3519  1.1.1.3  mrg     __detail::__non_propagating_cache<subrange<iterator_t<_Vp>>> _M_cached_begin;
   3520  1.1.1.3  mrg 
   3521  1.1.1.3  mrg     struct _Iterator;
   3522  1.1.1.3  mrg     struct _Sentinel;
   3523  1.1.1.3  mrg 
   3524  1.1.1.3  mrg   public:
   3525  1.1.1.3  mrg     split_view() requires (default_initializable<_Vp>
   3526  1.1.1.3  mrg 			   && default_initializable<_Pattern>)
   3527  1.1.1.3  mrg       = default;
   3528  1.1.1.3  mrg 
   3529  1.1.1.3  mrg     constexpr
   3530  1.1.1.3  mrg     split_view(_Vp __base, _Pattern __pattern)
   3531  1.1.1.3  mrg       : _M_base(std::move(__base)), _M_pattern(std::move(__pattern))
   3532  1.1.1.3  mrg     { }
   3533  1.1.1.3  mrg 
   3534  1.1.1.3  mrg     template<forward_range _Range>
   3535  1.1.1.3  mrg       requires constructible_from<_Vp, views::all_t<_Range>>
   3536  1.1.1.3  mrg 	&& constructible_from<_Pattern, single_view<range_value_t<_Range>>>
   3537  1.1.1.3  mrg     constexpr
   3538  1.1.1.3  mrg     split_view(_Range&& __r, range_value_t<_Range> __e)
   3539  1.1.1.3  mrg       : _M_base(views::all(std::forward<_Range>(__r))),
   3540  1.1.1.3  mrg 	_M_pattern(views::single(std::move(__e)))
   3541  1.1.1.3  mrg     { }
   3542  1.1.1.3  mrg 
   3543  1.1.1.3  mrg     constexpr _Vp
   3544  1.1.1.3  mrg     base() const& requires copy_constructible<_Vp>
   3545  1.1.1.3  mrg     { return _M_base; }
   3546  1.1.1.3  mrg 
   3547  1.1.1.3  mrg     constexpr _Vp
   3548  1.1.1.3  mrg     base() &&
   3549  1.1.1.3  mrg     { return std::move(_M_base); }
   3550  1.1.1.3  mrg 
   3551  1.1.1.3  mrg     constexpr _Iterator
   3552  1.1.1.3  mrg     begin()
   3553  1.1.1.3  mrg     {
   3554  1.1.1.3  mrg       if (!_M_cached_begin)
   3555  1.1.1.3  mrg 	_M_cached_begin = _M_find_next(ranges::begin(_M_base));
   3556  1.1.1.3  mrg       return {this, ranges::begin(_M_base), *_M_cached_begin};
   3557  1.1.1.3  mrg     }
   3558  1.1.1.3  mrg 
   3559  1.1.1.3  mrg     constexpr auto
   3560  1.1.1.3  mrg     end()
   3561  1.1.1.3  mrg     {
   3562  1.1.1.3  mrg       if constexpr (common_range<_Vp>)
   3563  1.1.1.3  mrg 	return _Iterator{this, ranges::end(_M_base), {}};
   3564  1.1.1.3  mrg       else
   3565  1.1.1.3  mrg 	return _Sentinel{this};
   3566  1.1.1.3  mrg     }
   3567  1.1.1.3  mrg 
   3568  1.1.1.3  mrg     constexpr subrange<iterator_t<_Vp>>
   3569  1.1.1.3  mrg     _M_find_next(iterator_t<_Vp> __it)
   3570  1.1.1.3  mrg     {
   3571  1.1.1.3  mrg       auto [__b, __e] = ranges::search(subrange(__it, ranges::end(_M_base)), _M_pattern);
   3572  1.1.1.3  mrg       if (__b != ranges::end(_M_base) && ranges::empty(_M_pattern))
   3573  1.1.1.3  mrg 	{
   3574  1.1.1.3  mrg 	  ++__b;
   3575  1.1.1.3  mrg 	  ++__e;
   3576  1.1.1.3  mrg 	}
   3577  1.1.1.3  mrg       return {__b, __e};
   3578  1.1.1.3  mrg     }
   3579  1.1.1.3  mrg 
   3580  1.1.1.3  mrg   private:
   3581  1.1.1.3  mrg     struct _Iterator
   3582  1.1.1.3  mrg     {
   3583  1.1.1.3  mrg     private:
   3584  1.1.1.3  mrg       split_view* _M_parent = nullptr;
   3585  1.1.1.3  mrg       iterator_t<_Vp> _M_cur = iterator_t<_Vp>();
   3586  1.1.1.3  mrg       subrange<iterator_t<_Vp>> _M_next = subrange<iterator_t<_Vp>>();
   3587  1.1.1.3  mrg       bool _M_trailing_empty = false;
   3588  1.1.1.3  mrg 
   3589  1.1.1.3  mrg       friend struct _Sentinel;
   3590  1.1.1.3  mrg 
   3591  1.1.1.3  mrg     public:
   3592  1.1.1.3  mrg       using iterator_concept = forward_iterator_tag;
   3593  1.1.1.3  mrg       using iterator_category = input_iterator_tag;
   3594  1.1.1.3  mrg       using value_type = subrange<iterator_t<_Vp>>;
   3595  1.1.1.3  mrg       using difference_type = range_difference_t<_Vp>;
   3596  1.1.1.3  mrg 
   3597  1.1.1.3  mrg       _Iterator() = default;
   3598  1.1.1.3  mrg 
   3599  1.1.1.3  mrg       constexpr
   3600  1.1.1.3  mrg       _Iterator(split_view* __parent,
   3601  1.1.1.3  mrg 		iterator_t<_Vp> __current,
   3602  1.1.1.3  mrg 		subrange<iterator_t<_Vp>> __next)
   3603  1.1.1.3  mrg 	: _M_parent(__parent),
   3604  1.1.1.3  mrg 	  _M_cur(std::move(__current)),
   3605  1.1.1.3  mrg 	  _M_next(std::move(__next))
   3606  1.1.1.3  mrg       { }
   3607  1.1.1.3  mrg 
   3608  1.1.1.3  mrg       constexpr iterator_t<_Vp>
   3609  1.1.1.3  mrg       base() const
   3610  1.1.1.3  mrg       { return _M_cur; }
   3611  1.1.1.3  mrg 
   3612  1.1.1.3  mrg       constexpr value_type
   3613  1.1.1.3  mrg       operator*() const
   3614  1.1.1.3  mrg       { return {_M_cur, _M_next.begin()}; }
   3615  1.1.1.3  mrg 
   3616  1.1.1.3  mrg       constexpr _Iterator&
   3617  1.1.1.3  mrg       operator++()
   3618  1.1.1.3  mrg       {
   3619  1.1.1.3  mrg 	_M_cur = _M_next.begin();
   3620  1.1.1.3  mrg 	if (_M_cur != ranges::end(_M_parent->_M_base))
   3621  1.1.1.3  mrg 	  {
   3622  1.1.1.3  mrg 	    _M_cur = _M_next.end();
   3623  1.1.1.3  mrg 	    if (_M_cur == ranges::end(_M_parent->_M_base))
   3624  1.1.1.3  mrg 	      {
   3625  1.1.1.3  mrg 		_M_trailing_empty = true;
   3626  1.1.1.3  mrg 		_M_next = {_M_cur, _M_cur};
   3627  1.1.1.3  mrg 	      }
   3628  1.1.1.3  mrg 	    else
   3629  1.1.1.3  mrg 	      _M_next = _M_parent->_M_find_next(_M_cur);
   3630  1.1.1.3  mrg 	  }
   3631  1.1.1.3  mrg 	else
   3632  1.1.1.3  mrg 	  _M_trailing_empty = false;
   3633  1.1.1.3  mrg 	return *this;
   3634  1.1.1.3  mrg       }
   3635  1.1.1.3  mrg 
   3636  1.1.1.3  mrg       constexpr _Iterator
   3637  1.1.1.3  mrg       operator++(int)
   3638  1.1.1.3  mrg       {
   3639  1.1.1.3  mrg 	auto __tmp = *this;
   3640  1.1.1.3  mrg 	++*this;
   3641  1.1.1.3  mrg 	return __tmp;
   3642  1.1.1.3  mrg       }
   3643  1.1.1.3  mrg 
   3644  1.1.1.3  mrg       friend constexpr bool
   3645  1.1.1.3  mrg       operator==(const _Iterator& __x, const _Iterator& __y)
   3646  1.1.1.3  mrg       {
   3647  1.1.1.3  mrg 	return __x._M_cur == __y._M_cur
   3648  1.1.1.3  mrg 	  && __x._M_trailing_empty == __y._M_trailing_empty;
   3649  1.1.1.3  mrg       }
   3650  1.1.1.3  mrg     };
   3651  1.1.1.3  mrg 
   3652  1.1.1.3  mrg     struct _Sentinel
   3653  1.1.1.3  mrg     {
   3654  1.1.1.3  mrg     private:
   3655  1.1.1.3  mrg       sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
   3656  1.1.1.3  mrg 
   3657  1.1.1.3  mrg       constexpr bool
   3658  1.1.1.3  mrg       _M_equal(const _Iterator& __x) const
   3659  1.1.1.3  mrg       { return __x._M_cur == _M_end && !__x._M_trailing_empty; }
   3660  1.1.1.3  mrg 
   3661  1.1.1.3  mrg     public:
   3662  1.1.1.3  mrg       _Sentinel() = default;
   3663  1.1.1.3  mrg 
   3664  1.1.1.3  mrg       constexpr explicit
   3665  1.1.1.3  mrg       _Sentinel(split_view* __parent)
   3666  1.1.1.3  mrg 	: _M_end(ranges::end(__parent->_M_base))
   3667  1.1.1.3  mrg       { }
   3668  1.1.1.3  mrg 
   3669  1.1.1.3  mrg       friend constexpr bool
   3670  1.1.1.3  mrg       operator==(const _Iterator& __x, const _Sentinel& __y)
   3671  1.1.1.3  mrg       { return __y._M_equal(__x); }
   3672  1.1.1.3  mrg     };
   3673  1.1.1.3  mrg   };
   3674  1.1.1.3  mrg 
   3675  1.1.1.3  mrg   template<typename _Range, typename _Pattern>
   3676  1.1.1.3  mrg     split_view(_Range&&, _Pattern&&)
   3677  1.1.1.3  mrg       -> split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
   3678  1.1.1.3  mrg 
   3679  1.1.1.3  mrg   template<forward_range _Range>
   3680      1.1  mrg     split_view(_Range&&, range_value_t<_Range>)
   3681      1.1  mrg       -> split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>;
   3682      1.1  mrg 
   3683      1.1  mrg   namespace views
   3684      1.1  mrg   {
   3685  1.1.1.3  mrg     namespace __detail
   3686  1.1.1.3  mrg     {
   3687  1.1.1.3  mrg       template<typename _Range, typename _Pattern>
   3688  1.1.1.3  mrg 	concept __can_split_view
   3689  1.1.1.3  mrg 	  = requires { split_view(std::declval<_Range>(), std::declval<_Pattern>()); };
   3690  1.1.1.3  mrg     } // namespace __detail
   3691  1.1.1.3  mrg 
   3692  1.1.1.3  mrg     struct _Split : __adaptor::_RangeAdaptor<_Split>
   3693  1.1.1.3  mrg     {
   3694  1.1.1.3  mrg       template<viewable_range _Range, typename _Pattern>
   3695  1.1.1.3  mrg 	requires __detail::__can_split_view<_Range, _Pattern>
   3696  1.1.1.3  mrg 	constexpr auto
   3697  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f) const
   3698  1.1.1.3  mrg 	{
   3699  1.1.1.3  mrg 	  return split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f));
   3700  1.1.1.3  mrg 	}
   3701  1.1.1.3  mrg 
   3702  1.1.1.3  mrg       using _RangeAdaptor<_Split>::operator();
   3703  1.1.1.3  mrg       static constexpr int _S_arity = 2;
   3704  1.1.1.3  mrg       template<typename _Pattern>
   3705  1.1.1.3  mrg 	static constexpr bool _S_has_simple_extra_args
   3706  1.1.1.3  mrg 	  = _LazySplit::_S_has_simple_extra_args<_Pattern>;
   3707  1.1.1.3  mrg     };
   3708  1.1.1.3  mrg 
   3709  1.1.1.3  mrg     inline constexpr _Split split;
   3710      1.1  mrg   } // namespace views
   3711      1.1  mrg 
   3712      1.1  mrg   namespace views
   3713      1.1  mrg   {
   3714      1.1  mrg     struct _Counted
   3715      1.1  mrg     {
   3716      1.1  mrg       template<input_or_output_iterator _Iter>
   3717      1.1  mrg       constexpr auto
   3718  1.1.1.3  mrg       operator() [[nodiscard]] (_Iter __i, iter_difference_t<_Iter> __n) const
   3719      1.1  mrg       {
   3720  1.1.1.3  mrg 	if constexpr (contiguous_iterator<_Iter>)
   3721  1.1.1.3  mrg 	  return span(std::__to_address(__i), __n);
   3722  1.1.1.3  mrg 	else if constexpr (random_access_iterator<_Iter>)
   3723  1.1.1.3  mrg 	  return subrange(__i, __i + __n);
   3724      1.1  mrg 	else
   3725  1.1.1.3  mrg 	  return subrange(counted_iterator(std::move(__i), __n),
   3726  1.1.1.3  mrg 			  default_sentinel);
   3727      1.1  mrg       }
   3728      1.1  mrg     };
   3729      1.1  mrg 
   3730      1.1  mrg     inline constexpr _Counted counted{};
   3731      1.1  mrg   } // namespace views
   3732      1.1  mrg 
   3733      1.1  mrg   template<view _Vp>
   3734      1.1  mrg     requires (!common_range<_Vp>) && copyable<iterator_t<_Vp>>
   3735      1.1  mrg     class common_view : public view_interface<common_view<_Vp>>
   3736      1.1  mrg     {
   3737      1.1  mrg     private:
   3738      1.1  mrg       _Vp _M_base = _Vp();
   3739      1.1  mrg 
   3740      1.1  mrg     public:
   3741      1.1  mrg       common_view() requires default_initializable<_Vp> = default;
   3742      1.1  mrg 
   3743      1.1  mrg       constexpr explicit
   3744      1.1  mrg       common_view(_Vp __r)
   3745      1.1  mrg 	: _M_base(std::move(__r))
   3746      1.1  mrg       { }
   3747      1.1  mrg 
   3748      1.1  mrg       /* XXX: LWG 3280 didn't remove this constructor, but I think it should?
   3749      1.1  mrg       template<viewable_range _Range>
   3750      1.1  mrg 	requires (!common_range<_Range>)
   3751      1.1  mrg 	  && constructible_from<_Vp, views::all_t<_Range>>
   3752      1.1  mrg 	constexpr explicit
   3753      1.1  mrg 	common_view(_Range&& __r)
   3754      1.1  mrg 	  : _M_base(views::all(std::forward<_Range>(__r)))
   3755      1.1  mrg 	{ }
   3756      1.1  mrg       */
   3757      1.1  mrg 
   3758      1.1  mrg       constexpr _Vp
   3759      1.1  mrg       base() const& requires copy_constructible<_Vp>
   3760      1.1  mrg       { return _M_base; }
   3761      1.1  mrg 
   3762      1.1  mrg       constexpr _Vp
   3763      1.1  mrg       base() &&
   3764      1.1  mrg       { return std::move(_M_base); }
   3765      1.1  mrg 
   3766      1.1  mrg       constexpr auto
   3767      1.1  mrg       begin()
   3768      1.1  mrg       {
   3769      1.1  mrg 	if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
   3770      1.1  mrg 	  return ranges::begin(_M_base);
   3771      1.1  mrg 	else
   3772      1.1  mrg 	  return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
   3773      1.1  mrg 		  (ranges::begin(_M_base));
   3774      1.1  mrg       }
   3775      1.1  mrg 
   3776      1.1  mrg       constexpr auto
   3777      1.1  mrg       begin() const requires range<const _Vp>
   3778      1.1  mrg       {
   3779      1.1  mrg 	if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
   3780      1.1  mrg 	  return ranges::begin(_M_base);
   3781      1.1  mrg 	else
   3782      1.1  mrg 	  return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
   3783      1.1  mrg 		  (ranges::begin(_M_base));
   3784      1.1  mrg       }
   3785      1.1  mrg 
   3786      1.1  mrg       constexpr auto
   3787      1.1  mrg       end()
   3788      1.1  mrg       {
   3789      1.1  mrg 	if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
   3790      1.1  mrg 	  return ranges::begin(_M_base) + ranges::size(_M_base);
   3791      1.1  mrg 	else
   3792      1.1  mrg 	  return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
   3793      1.1  mrg 		  (ranges::end(_M_base));
   3794      1.1  mrg       }
   3795      1.1  mrg 
   3796      1.1  mrg       constexpr auto
   3797      1.1  mrg       end() const requires range<const _Vp>
   3798      1.1  mrg       {
   3799      1.1  mrg 	if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
   3800      1.1  mrg 	  return ranges::begin(_M_base) + ranges::size(_M_base);
   3801      1.1  mrg 	else
   3802      1.1  mrg 	  return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
   3803      1.1  mrg 		  (ranges::end(_M_base));
   3804      1.1  mrg       }
   3805      1.1  mrg 
   3806      1.1  mrg       constexpr auto
   3807      1.1  mrg       size() requires sized_range<_Vp>
   3808      1.1  mrg       { return ranges::size(_M_base); }
   3809      1.1  mrg 
   3810      1.1  mrg       constexpr auto
   3811      1.1  mrg       size() const requires sized_range<const _Vp>
   3812      1.1  mrg       { return ranges::size(_M_base); }
   3813      1.1  mrg     };
   3814      1.1  mrg 
   3815      1.1  mrg   template<typename _Range>
   3816      1.1  mrg     common_view(_Range&&) -> common_view<views::all_t<_Range>>;
   3817      1.1  mrg 
   3818      1.1  mrg   template<typename _Tp>
   3819      1.1  mrg     inline constexpr bool enable_borrowed_range<common_view<_Tp>>
   3820      1.1  mrg       = enable_borrowed_range<_Tp>;
   3821      1.1  mrg 
   3822      1.1  mrg   namespace views
   3823      1.1  mrg   {
   3824  1.1.1.3  mrg     namespace __detail
   3825  1.1.1.3  mrg     {
   3826  1.1.1.3  mrg       template<typename _Range>
   3827  1.1.1.3  mrg 	concept __already_common = common_range<_Range>
   3828  1.1.1.3  mrg 	  && requires { views::all(std::declval<_Range>()); };
   3829  1.1.1.3  mrg 
   3830  1.1.1.3  mrg       template<typename _Range>
   3831  1.1.1.3  mrg 	concept __can_common_view
   3832  1.1.1.3  mrg 	  = requires { common_view{std::declval<_Range>()}; };
   3833  1.1.1.3  mrg     } // namespace __detail
   3834  1.1.1.3  mrg 
   3835  1.1.1.3  mrg     struct _Common : __adaptor::_RangeAdaptorClosure
   3836  1.1.1.3  mrg     {
   3837  1.1.1.3  mrg       template<viewable_range _Range>
   3838  1.1.1.3  mrg 	requires __detail::__already_common<_Range>
   3839  1.1.1.3  mrg 	  || __detail::__can_common_view<_Range>
   3840  1.1.1.3  mrg 	constexpr auto
   3841  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r) const
   3842  1.1.1.3  mrg 	{
   3843  1.1.1.3  mrg 	  if constexpr (__detail::__already_common<_Range>)
   3844  1.1.1.3  mrg 	    return views::all(std::forward<_Range>(__r));
   3845  1.1.1.3  mrg 	  else
   3846  1.1.1.3  mrg 	    return common_view{std::forward<_Range>(__r)};
   3847  1.1.1.3  mrg 	}
   3848  1.1.1.3  mrg 
   3849  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   3850  1.1.1.3  mrg     };
   3851      1.1  mrg 
   3852  1.1.1.3  mrg     inline constexpr _Common common;
   3853      1.1  mrg   } // namespace views
   3854      1.1  mrg 
   3855      1.1  mrg   template<view _Vp>
   3856      1.1  mrg     requires bidirectional_range<_Vp>
   3857      1.1  mrg     class reverse_view : public view_interface<reverse_view<_Vp>>
   3858      1.1  mrg     {
   3859      1.1  mrg     private:
   3860      1.1  mrg       static constexpr bool _S_needs_cached_begin
   3861  1.1.1.3  mrg 	= !common_range<_Vp> && !(random_access_range<_Vp>
   3862  1.1.1.3  mrg 				  && sized_sentinel_for<sentinel_t<_Vp>,
   3863  1.1.1.3  mrg 							iterator_t<_Vp>>);
   3864  1.1.1.3  mrg 
   3865  1.1.1.3  mrg       _Vp _M_base = _Vp();
   3866      1.1  mrg       [[no_unique_address]]
   3867      1.1  mrg 	__detail::__maybe_present_t<_S_needs_cached_begin,
   3868      1.1  mrg 				    __detail::_CachedPosition<_Vp>>
   3869      1.1  mrg 				      _M_cached_begin;
   3870      1.1  mrg 
   3871      1.1  mrg     public:
   3872      1.1  mrg       reverse_view() requires default_initializable<_Vp> = default;
   3873      1.1  mrg 
   3874      1.1  mrg       constexpr explicit
   3875      1.1  mrg       reverse_view(_Vp __r)
   3876      1.1  mrg 	: _M_base(std::move(__r))
   3877      1.1  mrg 	{ }
   3878      1.1  mrg 
   3879      1.1  mrg       constexpr _Vp
   3880      1.1  mrg       base() const& requires copy_constructible<_Vp>
   3881      1.1  mrg       { return _M_base; }
   3882      1.1  mrg 
   3883      1.1  mrg       constexpr _Vp
   3884      1.1  mrg       base() &&
   3885      1.1  mrg       { return std::move(_M_base); }
   3886      1.1  mrg 
   3887      1.1  mrg       constexpr reverse_iterator<iterator_t<_Vp>>
   3888      1.1  mrg       begin()
   3889      1.1  mrg       {
   3890      1.1  mrg 	if constexpr (_S_needs_cached_begin)
   3891      1.1  mrg 	  if (_M_cached_begin._M_has_value())
   3892      1.1  mrg 	    return std::make_reverse_iterator(_M_cached_begin._M_get(_M_base));
   3893      1.1  mrg 
   3894      1.1  mrg 	auto __it = ranges::next(ranges::begin(_M_base), ranges::end(_M_base));
   3895      1.1  mrg 	if constexpr (_S_needs_cached_begin)
   3896      1.1  mrg 	  _M_cached_begin._M_set(_M_base, __it);
   3897      1.1  mrg 	return std::make_reverse_iterator(std::move(__it));
   3898      1.1  mrg       }
   3899      1.1  mrg 
   3900      1.1  mrg       constexpr auto
   3901      1.1  mrg       begin() requires common_range<_Vp>
   3902      1.1  mrg       { return std::make_reverse_iterator(ranges::end(_M_base)); }
   3903      1.1  mrg 
   3904      1.1  mrg       constexpr auto
   3905      1.1  mrg       begin() const requires common_range<const _Vp>
   3906      1.1  mrg       { return std::make_reverse_iterator(ranges::end(_M_base)); }
   3907      1.1  mrg 
   3908      1.1  mrg       constexpr reverse_iterator<iterator_t<_Vp>>
   3909      1.1  mrg       end()
   3910      1.1  mrg       { return std::make_reverse_iterator(ranges::begin(_M_base)); }
   3911      1.1  mrg 
   3912      1.1  mrg       constexpr auto
   3913      1.1  mrg       end() const requires common_range<const _Vp>
   3914      1.1  mrg       { return std::make_reverse_iterator(ranges::begin(_M_base)); }
   3915      1.1  mrg 
   3916      1.1  mrg       constexpr auto
   3917      1.1  mrg       size() requires sized_range<_Vp>
   3918      1.1  mrg       { return ranges::size(_M_base); }
   3919      1.1  mrg 
   3920      1.1  mrg       constexpr auto
   3921      1.1  mrg       size() const requires sized_range<const _Vp>
   3922      1.1  mrg       { return ranges::size(_M_base); }
   3923      1.1  mrg     };
   3924      1.1  mrg 
   3925      1.1  mrg   template<typename _Range>
   3926      1.1  mrg     reverse_view(_Range&&) -> reverse_view<views::all_t<_Range>>;
   3927      1.1  mrg 
   3928      1.1  mrg   template<typename _Tp>
   3929      1.1  mrg     inline constexpr bool enable_borrowed_range<reverse_view<_Tp>>
   3930      1.1  mrg       = enable_borrowed_range<_Tp>;
   3931      1.1  mrg 
   3932      1.1  mrg   namespace views
   3933      1.1  mrg   {
   3934      1.1  mrg     namespace __detail
   3935      1.1  mrg     {
   3936      1.1  mrg       template<typename>
   3937      1.1  mrg 	inline constexpr bool __is_reversible_subrange = false;
   3938      1.1  mrg 
   3939      1.1  mrg       template<typename _Iter, subrange_kind _Kind>
   3940      1.1  mrg 	inline constexpr bool
   3941      1.1  mrg 	  __is_reversible_subrange<subrange<reverse_iterator<_Iter>,
   3942      1.1  mrg 					    reverse_iterator<_Iter>,
   3943      1.1  mrg 					    _Kind>> = true;
   3944      1.1  mrg 
   3945      1.1  mrg       template<typename>
   3946      1.1  mrg 	inline constexpr bool __is_reverse_view = false;
   3947      1.1  mrg 
   3948      1.1  mrg       template<typename _Vp>
   3949      1.1  mrg 	inline constexpr bool __is_reverse_view<reverse_view<_Vp>> = true;
   3950      1.1  mrg 
   3951  1.1.1.3  mrg       template<typename _Range>
   3952  1.1.1.3  mrg 	concept __can_reverse_view
   3953  1.1.1.3  mrg 	  = requires { reverse_view{std::declval<_Range>()}; };
   3954  1.1.1.3  mrg     } // namespace __detail
   3955  1.1.1.3  mrg 
   3956  1.1.1.3  mrg     struct _Reverse : __adaptor::_RangeAdaptorClosure
   3957  1.1.1.3  mrg     {
   3958  1.1.1.3  mrg       template<viewable_range _Range>
   3959  1.1.1.3  mrg 	requires __detail::__is_reverse_view<remove_cvref_t<_Range>>
   3960  1.1.1.3  mrg 	  || __detail::__is_reversible_subrange<remove_cvref_t<_Range>>
   3961  1.1.1.3  mrg 	  || __detail::__can_reverse_view<_Range>
   3962  1.1.1.3  mrg 	constexpr auto
   3963  1.1.1.3  mrg 	operator() [[nodiscard]] (_Range&& __r) const
   3964  1.1.1.3  mrg 	{
   3965  1.1.1.3  mrg 	  using _Tp = remove_cvref_t<_Range>;
   3966  1.1.1.3  mrg 	  if constexpr (__detail::__is_reverse_view<_Tp>)
   3967  1.1.1.3  mrg 	    return std::forward<_Range>(__r).base();
   3968  1.1.1.3  mrg 	  else if constexpr (__detail::__is_reversible_subrange<_Tp>)
   3969  1.1.1.3  mrg 	    {
   3970  1.1.1.3  mrg 	      using _Iter = decltype(ranges::begin(__r).base());
   3971  1.1.1.3  mrg 	      if constexpr (sized_range<_Tp>)
   3972  1.1.1.3  mrg 		return subrange<_Iter, _Iter, subrange_kind::sized>
   3973  1.1.1.3  mrg 			{__r.end().base(), __r.begin().base(), __r.size()};
   3974  1.1.1.3  mrg 	      else
   3975  1.1.1.3  mrg 		return subrange<_Iter, _Iter, subrange_kind::unsized>
   3976  1.1.1.3  mrg 			{__r.end().base(), __r.begin().base()};
   3977  1.1.1.3  mrg 	    }
   3978  1.1.1.3  mrg 	  else
   3979  1.1.1.3  mrg 	    return reverse_view{std::forward<_Range>(__r)};
   3980  1.1.1.3  mrg 	}
   3981  1.1.1.3  mrg 
   3982  1.1.1.3  mrg       static constexpr bool _S_has_simple_call_op = true;
   3983  1.1.1.3  mrg     };
   3984  1.1.1.3  mrg 
   3985  1.1.1.3  mrg     inline constexpr _Reverse reverse;
   3986      1.1  mrg   } // namespace views
   3987      1.1  mrg 
   3988      1.1  mrg   namespace __detail
   3989      1.1  mrg   {
   3990      1.1  mrg     template<typename _Tp, size_t _Nm>
   3991      1.1  mrg     concept __has_tuple_element = requires(_Tp __t)
   3992      1.1  mrg       {
   3993      1.1  mrg 	typename tuple_size<_Tp>::type;
   3994      1.1  mrg 	requires _Nm < tuple_size_v<_Tp>;
   3995      1.1  mrg 	typename tuple_element_t<_Nm, _Tp>;
   3996      1.1  mrg 	{ std::get<_Nm>(__t) }
   3997      1.1  mrg 	  -> convertible_to<const tuple_element_t<_Nm, _Tp>&>;
   3998      1.1  mrg       };
   3999      1.1  mrg 
   4000      1.1  mrg     template<typename _Tp, size_t _Nm>
   4001      1.1  mrg       concept __returnable_element
   4002      1.1  mrg 	= is_reference_v<_Tp> || move_constructible<tuple_element_t<_Nm, _Tp>>;
   4003      1.1  mrg   }
   4004      1.1  mrg 
   4005      1.1  mrg   template<input_range _Vp, size_t _Nm>
   4006      1.1  mrg     requires view<_Vp>
   4007      1.1  mrg       && __detail::__has_tuple_element<range_value_t<_Vp>, _Nm>
   4008      1.1  mrg       && __detail::__has_tuple_element<remove_reference_t<range_reference_t<_Vp>>,
   4009      1.1  mrg 				       _Nm>
   4010      1.1  mrg       && __detail::__returnable_element<range_reference_t<_Vp>, _Nm>
   4011      1.1  mrg     class elements_view : public view_interface<elements_view<_Vp, _Nm>>
   4012      1.1  mrg     {
   4013      1.1  mrg     public:
   4014      1.1  mrg       elements_view() requires default_initializable<_Vp> = default;
   4015      1.1  mrg 
   4016      1.1  mrg       constexpr explicit
   4017      1.1  mrg       elements_view(_Vp base)
   4018      1.1  mrg 	: _M_base(std::move(base))
   4019      1.1  mrg       { }
   4020      1.1  mrg 
   4021      1.1  mrg       constexpr _Vp
   4022      1.1  mrg       base() const& requires copy_constructible<_Vp>
   4023      1.1  mrg       { return _M_base; }
   4024      1.1  mrg 
   4025      1.1  mrg       constexpr _Vp
   4026      1.1  mrg       base() &&
   4027      1.1  mrg       { return std::move(_M_base); }
   4028      1.1  mrg 
   4029      1.1  mrg       constexpr auto
   4030      1.1  mrg       begin() requires (!__detail::__simple_view<_Vp>)
   4031      1.1  mrg       { return _Iterator<false>(ranges::begin(_M_base)); }
   4032      1.1  mrg 
   4033      1.1  mrg       constexpr auto
   4034      1.1  mrg       begin() const requires range<const _Vp>
   4035      1.1  mrg       { return _Iterator<true>(ranges::begin(_M_base)); }
   4036      1.1  mrg 
   4037      1.1  mrg       constexpr auto
   4038      1.1  mrg       end() requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>)
   4039      1.1  mrg       { return _Sentinel<false>{ranges::end(_M_base)}; }
   4040      1.1  mrg 
   4041      1.1  mrg       constexpr auto
   4042      1.1  mrg       end() requires (!__detail::__simple_view<_Vp> && common_range<_Vp>)
   4043      1.1  mrg       { return _Iterator<false>{ranges::end(_M_base)}; }
   4044      1.1  mrg 
   4045      1.1  mrg       constexpr auto
   4046      1.1  mrg       end() const requires range<const _Vp>
   4047      1.1  mrg       { return _Sentinel<true>{ranges::end(_M_base)}; }
   4048      1.1  mrg 
   4049      1.1  mrg       constexpr auto
   4050      1.1  mrg       end() const requires common_range<const _Vp>
   4051      1.1  mrg       { return _Iterator<true>{ranges::end(_M_base)}; }
   4052      1.1  mrg 
   4053      1.1  mrg       constexpr auto
   4054      1.1  mrg       size() requires sized_range<_Vp>
   4055      1.1  mrg       { return ranges::size(_M_base); }
   4056      1.1  mrg 
   4057      1.1  mrg       constexpr auto
   4058      1.1  mrg       size() const requires sized_range<const _Vp>
   4059      1.1  mrg       { return ranges::size(_M_base); }
   4060      1.1  mrg 
   4061      1.1  mrg     private:
   4062      1.1  mrg       template<bool _Const>
   4063      1.1  mrg 	using _Base = __detail::__maybe_const_t<_Const, _Vp>;
   4064      1.1  mrg 
   4065      1.1  mrg       template<bool _Const>
   4066      1.1  mrg 	struct __iter_cat
   4067      1.1  mrg 	{ };
   4068      1.1  mrg 
   4069      1.1  mrg       template<bool _Const>
   4070      1.1  mrg 	requires forward_range<_Base<_Const>>
   4071      1.1  mrg 	struct __iter_cat<_Const>
   4072      1.1  mrg 	{
   4073      1.1  mrg 	private:
   4074      1.1  mrg 	  static auto _S_iter_cat()
   4075      1.1  mrg 	  {
   4076      1.1  mrg 	    using _Base = elements_view::_Base<_Const>;
   4077      1.1  mrg 	    using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category;
   4078      1.1  mrg 	    using _Res = decltype((std::get<_Nm>(*std::declval<iterator_t<_Base>>())));
   4079      1.1  mrg 	    if constexpr (!is_lvalue_reference_v<_Res>)
   4080      1.1  mrg 	      return input_iterator_tag{};
   4081      1.1  mrg 	    else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
   4082      1.1  mrg 	      return random_access_iterator_tag{};
   4083      1.1  mrg 	    else
   4084      1.1  mrg 	      return _Cat{};
   4085      1.1  mrg 	  }
   4086      1.1  mrg 	public:
   4087      1.1  mrg 	  using iterator_category = decltype(_S_iter_cat());
   4088      1.1  mrg 	};
   4089      1.1  mrg 
   4090      1.1  mrg       template<bool _Const>
   4091      1.1  mrg 	struct _Sentinel;
   4092      1.1  mrg 
   4093      1.1  mrg       template<bool _Const>
   4094      1.1  mrg 	struct _Iterator : __iter_cat<_Const>
   4095      1.1  mrg 	{
   4096      1.1  mrg 	private:
   4097      1.1  mrg 	  using _Base = elements_view::_Base<_Const>;
   4098      1.1  mrg 
   4099      1.1  mrg 	  iterator_t<_Base> _M_current = iterator_t<_Base>();
   4100      1.1  mrg 
   4101      1.1  mrg 	  static constexpr decltype(auto)
   4102      1.1  mrg 	  _S_get_element(const iterator_t<_Base>& __i)
   4103      1.1  mrg 	  {
   4104      1.1  mrg 	    if constexpr (is_reference_v<range_reference_t<_Base>>)
   4105      1.1  mrg 	      return std::get<_Nm>(*__i);
   4106      1.1  mrg 	    else
   4107      1.1  mrg 	      {
   4108      1.1  mrg 		using _Et = remove_cv_t<tuple_element_t<_Nm, range_reference_t<_Base>>>;
   4109      1.1  mrg 		return static_cast<_Et>(std::get<_Nm>(*__i));
   4110      1.1  mrg 	      }
   4111      1.1  mrg 	  }
   4112      1.1  mrg 
   4113      1.1  mrg 	  static auto
   4114      1.1  mrg 	  _S_iter_concept()
   4115      1.1  mrg 	  {
   4116      1.1  mrg 	    if constexpr (random_access_range<_Base>)
   4117      1.1  mrg 	      return random_access_iterator_tag{};
   4118      1.1  mrg 	    else if constexpr (bidirectional_range<_Base>)
   4119      1.1  mrg 	      return bidirectional_iterator_tag{};
   4120      1.1  mrg 	    else if constexpr (forward_range<_Base>)
   4121      1.1  mrg 	      return forward_iterator_tag{};
   4122      1.1  mrg 	    else
   4123      1.1  mrg 	      return input_iterator_tag{};
   4124      1.1  mrg 	  }
   4125      1.1  mrg 
   4126      1.1  mrg 	  friend _Iterator<!_Const>;
   4127      1.1  mrg 
   4128      1.1  mrg 	public:
   4129      1.1  mrg 	  using iterator_concept = decltype(_S_iter_concept());
   4130      1.1  mrg 	  // iterator_category defined in elements_view::__iter_cat
   4131      1.1  mrg 	  using value_type
   4132      1.1  mrg 	    = remove_cvref_t<tuple_element_t<_Nm, range_value_t<_Base>>>;
   4133      1.1  mrg 	  using difference_type = range_difference_t<_Base>;
   4134      1.1  mrg 
   4135      1.1  mrg 	  _Iterator() requires default_initializable<iterator_t<_Base>> = default;
   4136      1.1  mrg 
   4137      1.1  mrg 	  constexpr explicit
   4138      1.1  mrg 	  _Iterator(iterator_t<_Base> current)
   4139      1.1  mrg 	    : _M_current(std::move(current))
   4140      1.1  mrg 	  { }
   4141      1.1  mrg 
   4142      1.1  mrg 	  constexpr
   4143      1.1  mrg 	  _Iterator(_Iterator<!_Const> i)
   4144      1.1  mrg 	    requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
   4145      1.1  mrg 	    : _M_current(std::move(i._M_current))
   4146      1.1  mrg 	  { }
   4147      1.1  mrg 
   4148      1.1  mrg 	  constexpr const iterator_t<_Base>&
   4149      1.1  mrg 	  base() const& noexcept
   4150      1.1  mrg 	  { return _M_current; }
   4151      1.1  mrg 
   4152      1.1  mrg 	  constexpr iterator_t<_Base>
   4153      1.1  mrg 	  base() &&
   4154      1.1  mrg 	  { return std::move(_M_current); }
   4155      1.1  mrg 
   4156      1.1  mrg 	  constexpr decltype(auto)
   4157      1.1  mrg 	  operator*() const
   4158      1.1  mrg 	  { return _S_get_element(_M_current); }
   4159      1.1  mrg 
   4160      1.1  mrg 	  constexpr _Iterator&
   4161      1.1  mrg 	  operator++()
   4162      1.1  mrg 	  {
   4163      1.1  mrg 	    ++_M_current;
   4164      1.1  mrg 	    return *this;
   4165      1.1  mrg 	  }
   4166      1.1  mrg 
   4167      1.1  mrg 	  constexpr void
   4168      1.1  mrg 	  operator++(int)
   4169      1.1  mrg 	  { ++_M_current; }
   4170      1.1  mrg 
   4171      1.1  mrg 	  constexpr _Iterator
   4172      1.1  mrg 	  operator++(int) requires forward_range<_Base>
   4173      1.1  mrg 	  {
   4174      1.1  mrg 	    auto __tmp = *this;
   4175      1.1  mrg 	    ++_M_current;
   4176      1.1  mrg 	    return __tmp;
   4177      1.1  mrg 	  }
   4178      1.1  mrg 
   4179      1.1  mrg 	  constexpr _Iterator&
   4180      1.1  mrg 	  operator--() requires bidirectional_range<_Base>
   4181      1.1  mrg 	  {
   4182      1.1  mrg 	    --_M_current;
   4183      1.1  mrg 	    return *this;
   4184      1.1  mrg 	  }
   4185      1.1  mrg 
   4186      1.1  mrg 	  constexpr _Iterator
   4187      1.1  mrg 	  operator--(int) requires bidirectional_range<_Base>
   4188      1.1  mrg 	  {
   4189      1.1  mrg 	    auto __tmp = *this;
   4190      1.1  mrg 	    --_M_current;
   4191      1.1  mrg 	    return __tmp;
   4192      1.1  mrg 	  }
   4193      1.1  mrg 
   4194      1.1  mrg 	  constexpr _Iterator&
   4195      1.1  mrg 	  operator+=(difference_type __n)
   4196      1.1  mrg 	    requires random_access_range<_Base>
   4197      1.1  mrg 	  {
   4198      1.1  mrg 	    _M_current += __n;
   4199      1.1  mrg 	    return *this;
   4200      1.1  mrg 	  }
   4201      1.1  mrg 
   4202      1.1  mrg 	  constexpr _Iterator&
   4203      1.1  mrg 	  operator-=(difference_type __n)
   4204      1.1  mrg 	    requires random_access_range<_Base>
   4205      1.1  mrg 	  {
   4206      1.1  mrg 	    _M_current -= __n;
   4207      1.1  mrg 	    return *this;
   4208      1.1  mrg 	  }
   4209      1.1  mrg 
   4210      1.1  mrg 	  constexpr decltype(auto)
   4211      1.1  mrg 	  operator[](difference_type __n) const
   4212      1.1  mrg 	    requires random_access_range<_Base>
   4213      1.1  mrg 	  { return _S_get_element(_M_current + __n); }
   4214      1.1  mrg 
   4215      1.1  mrg 	  friend constexpr bool
   4216      1.1  mrg 	  operator==(const _Iterator& __x, const _Iterator& __y)
   4217      1.1  mrg 	    requires equality_comparable<iterator_t<_Base>>
   4218      1.1  mrg 	  { return __x._M_current == __y._M_current; }
   4219      1.1  mrg 
   4220      1.1  mrg 	  friend constexpr bool
   4221      1.1  mrg 	  operator<(const _Iterator& __x, const _Iterator& __y)
   4222      1.1  mrg 	    requires random_access_range<_Base>
   4223      1.1  mrg 	  { return __x._M_current < __y._M_current; }
   4224      1.1  mrg 
   4225      1.1  mrg 	  friend constexpr bool
   4226      1.1  mrg 	  operator>(const _Iterator& __x, const _Iterator& __y)
   4227      1.1  mrg 	    requires random_access_range<_Base>
   4228      1.1  mrg 	  { return __y._M_current < __x._M_current; }
   4229      1.1  mrg 
   4230      1.1  mrg 	  friend constexpr bool
   4231      1.1  mrg 	  operator<=(const _Iterator& __x, const _Iterator& __y)
   4232      1.1  mrg 	    requires random_access_range<_Base>
   4233      1.1  mrg 	  { return !(__y._M_current > __x._M_current); }
   4234      1.1  mrg 
   4235      1.1  mrg 	  friend constexpr bool
   4236      1.1  mrg 	  operator>=(const _Iterator& __x, const _Iterator& __y)
   4237      1.1  mrg 	    requires random_access_range<_Base>
   4238      1.1  mrg 	  { return !(__x._M_current > __y._M_current); }
   4239      1.1  mrg 
   4240      1.1  mrg #ifdef __cpp_lib_three_way_comparison
   4241      1.1  mrg 	  friend constexpr auto
   4242      1.1  mrg 	  operator<=>(const _Iterator& __x, const _Iterator& __y)
   4243      1.1  mrg 	    requires random_access_range<_Base>
   4244      1.1  mrg 	      && three_way_comparable<iterator_t<_Base>>
   4245      1.1  mrg 	  { return __x._M_current <=> __y._M_current; }
   4246      1.1  mrg #endif
   4247      1.1  mrg 
   4248      1.1  mrg 	  friend constexpr _Iterator
   4249      1.1  mrg 	  operator+(const _Iterator& __x, difference_type __y)
   4250      1.1  mrg 	    requires random_access_range<_Base>
   4251      1.1  mrg 	  { return _Iterator{__x} += __y; }
   4252      1.1  mrg 
   4253      1.1  mrg 	  friend constexpr _Iterator
   4254      1.1  mrg 	  operator+(difference_type __x, const _Iterator& __y)
   4255      1.1  mrg 	    requires random_access_range<_Base>
   4256      1.1  mrg 	  { return __y + __x; }
   4257      1.1  mrg 
   4258      1.1  mrg 	  friend constexpr _Iterator
   4259      1.1  mrg 	  operator-(const _Iterator& __x, difference_type __y)
   4260      1.1  mrg 	    requires random_access_range<_Base>
   4261      1.1  mrg 	  { return _Iterator{__x} -= __y; }
   4262      1.1  mrg 
   4263      1.1  mrg 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
   4264      1.1  mrg 	  // 3483. transform_view::iterator's difference is overconstrained
   4265      1.1  mrg 	  friend constexpr difference_type
   4266      1.1  mrg 	  operator-(const _Iterator& __x, const _Iterator& __y)
   4267      1.1  mrg 	    requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
   4268      1.1  mrg 	  { return __x._M_current - __y._M_current; }
   4269      1.1  mrg 
   4270      1.1  mrg 	  template <bool> friend struct _Sentinel;
   4271      1.1  mrg 	};
   4272      1.1  mrg 
   4273      1.1  mrg       template<bool _Const>
   4274      1.1  mrg 	struct _Sentinel
   4275      1.1  mrg 	{
   4276      1.1  mrg 	private:
   4277      1.1  mrg 	  template<bool _Const2>
   4278      1.1  mrg 	    constexpr bool
   4279      1.1  mrg 	    _M_equal(const _Iterator<_Const2>& __x) const
   4280      1.1  mrg 	    { return __x._M_current == _M_end; }
   4281      1.1  mrg 
   4282      1.1  mrg 	  template<bool _Const2>
   4283      1.1  mrg 	    constexpr auto
   4284      1.1  mrg 	    _M_distance_from(const _Iterator<_Const2>& __i) const
   4285      1.1  mrg 	    { return _M_end - __i._M_current; }
   4286      1.1  mrg 
   4287      1.1  mrg 	  using _Base = elements_view::_Base<_Const>;
   4288      1.1  mrg 	  sentinel_t<_Base> _M_end = sentinel_t<_Base>();
   4289      1.1  mrg 
   4290      1.1  mrg 	public:
   4291      1.1  mrg 	  _Sentinel() = default;
   4292      1.1  mrg 
   4293      1.1  mrg 	  constexpr explicit
   4294      1.1  mrg 	  _Sentinel(sentinel_t<_Base> __end)
   4295      1.1  mrg 	    : _M_end(std::move(__end))
   4296      1.1  mrg 	  { }
   4297      1.1  mrg 
   4298      1.1  mrg 	  constexpr
   4299      1.1  mrg 	  _Sentinel(_Sentinel<!_Const> __other)
   4300      1.1  mrg 	    requires _Const
   4301      1.1  mrg 	      && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
   4302      1.1  mrg 	    : _M_end(std::move(__other._M_end))
   4303      1.1  mrg 	  { }
   4304      1.1  mrg 
   4305      1.1  mrg 	  constexpr sentinel_t<_Base>
   4306      1.1  mrg 	  base() const
   4307      1.1  mrg 	  { return _M_end; }
   4308      1.1  mrg 
   4309      1.1  mrg 	  template<bool _Const2>
   4310      1.1  mrg 	    requires sentinel_for<sentinel_t<_Base>,
   4311      1.1  mrg 		       iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
   4312      1.1  mrg 	    friend constexpr bool
   4313      1.1  mrg 	    operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
   4314      1.1  mrg 	    { return __y._M_equal(__x); }
   4315      1.1  mrg 
   4316      1.1  mrg 	  template<bool _Const2,
   4317      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
   4318      1.1  mrg 	    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   4319      1.1  mrg 	    friend constexpr range_difference_t<_Base2>
   4320      1.1  mrg 	    operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y)
   4321      1.1  mrg 	    { return -__y._M_distance_from(__x); }
   4322      1.1  mrg 
   4323      1.1  mrg 	  template<bool _Const2,
   4324      1.1  mrg 		   typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
   4325      1.1  mrg 	    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
   4326      1.1  mrg 	    friend constexpr range_difference_t<_Base2>
   4327      1.1  mrg 	    operator-(const _Sentinel& __x, const _Iterator<_Const2>& __y)
   4328      1.1  mrg 	    { return __x._M_distance_from(__y); }
   4329      1.1  mrg 
   4330      1.1  mrg 	  friend _Sentinel<!_Const>;
   4331      1.1  mrg 	};
   4332      1.1  mrg 
   4333      1.1  mrg       _Vp _M_base = _Vp();
   4334      1.1  mrg     };
   4335      1.1  mrg 
   4336      1.1  mrg   template<typename _Tp, size_t _Nm>
   4337      1.1  mrg     inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>>
   4338      1.1  mrg       = enable_borrowed_range<_Tp>;
   4339      1.1  mrg 
   4340      1.1  mrg   template<typename _Range>
   4341      1.1  mrg     using keys_view = elements_view<views::all_t<_Range>, 0>;
   4342      1.1  mrg 
   4343      1.1  mrg   template<typename _Range>
   4344      1.1  mrg     using values_view = elements_view<views::all_t<_Range>, 1>;
   4345      1.1  mrg 
   4346      1.1  mrg   namespace views
   4347      1.1  mrg   {
   4348  1.1.1.3  mrg     namespace __detail
   4349  1.1.1.3  mrg     {
   4350  1.1.1.3  mrg       template<size_t _Nm, typename _Range>
   4351  1.1.1.3  mrg 	concept __can_elements_view
   4352  1.1.1.3  mrg 	  = requires { elements_view<all_t<_Range>, _Nm>{std::declval<_Range>()}; };
   4353  1.1.1.3  mrg     } // namespace __detail
   4354  1.1.1.3  mrg 
   4355      1.1  mrg     template<size_t _Nm>
   4356  1.1.1.3  mrg       struct _Elements : __adaptor::_RangeAdaptorClosure
   4357      1.1  mrg       {
   4358  1.1.1.3  mrg 	template<viewable_range _Range>
   4359  1.1.1.3  mrg 	  requires __detail::__can_elements_view<_Nm, _Range>
   4360  1.1.1.3  mrg 	  constexpr auto
   4361  1.1.1.3  mrg 	  operator() [[nodiscard]] (_Range&& __r) const
   4362  1.1.1.3  mrg 	  {
   4363  1.1.1.3  mrg 	    return elements_view<all_t<_Range>, _Nm>{std::forward<_Range>(__r)};
   4364  1.1.1.3  mrg 	  }
   4365  1.1.1.3  mrg 
   4366  1.1.1.3  mrg 	static constexpr bool _S_has_simple_call_op = true;
   4367      1.1  mrg       };
   4368      1.1  mrg 
   4369  1.1.1.3  mrg     template<size_t _Nm>
   4370  1.1.1.3  mrg       inline constexpr _Elements<_Nm> elements;
   4371  1.1.1.3  mrg     inline constexpr auto keys = elements<0>;
   4372  1.1.1.3  mrg     inline constexpr auto values = elements<1>;
   4373      1.1  mrg   } // namespace views
   4374      1.1  mrg 
   4375      1.1  mrg } // namespace ranges
   4376      1.1  mrg 
   4377      1.1  mrg   namespace views = ranges::views;
   4378      1.1  mrg 
   4379      1.1  mrg _GLIBCXX_END_NAMESPACE_VERSION
   4380      1.1  mrg } // namespace
   4381      1.1  mrg #endif // library concepts
   4382      1.1  mrg #endif // C++2a
   4383      1.1  mrg #endif /* _GLIBCXX_RANGES */
   4384