LCOV - code coverage report
Current view: top level - 11/bits - stl_iterator.h (source / functions) Hit Total Coverage
Test: jami-coverage-filtered.info Lines: 113 126 89.7 %
Date: 2025-08-24 09:11:10 Functions: 1000 1393 71.8 %

          Line data    Source code
       1             : // Iterators -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-2021 Free Software Foundation, Inc.
       4             : //
       5             : // This file is part of the GNU ISO C++ Library.  This library is free
       6             : // software; you can redistribute it and/or modify it under the
       7             : // terms of the GNU General Public License as published by the
       8             : // Free Software Foundation; either version 3, or (at your option)
       9             : // any later version.
      10             : 
      11             : // This library is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : 
      16             : // Under Section 7 of GPL version 3, you are granted additional
      17             : // permissions described in the GCC Runtime Library Exception, version
      18             : // 3.1, as published by the Free Software Foundation.
      19             : 
      20             : // You should have received a copy of the GNU General Public License and
      21             : // a copy of the GCC Runtime Library Exception along with this program;
      22             : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23             : // <http://www.gnu.org/licenses/>.
      24             : 
      25             : /*
      26             :  *
      27             :  * Copyright (c) 1994
      28             :  * Hewlett-Packard Company
      29             :  *
      30             :  * Permission to use, copy, modify, distribute and sell this software
      31             :  * and its documentation for any purpose is hereby granted without fee,
      32             :  * provided that the above copyright notice appear in all copies and
      33             :  * that both that copyright notice and this permission notice appear
      34             :  * in supporting documentation.  Hewlett-Packard Company makes no
      35             :  * representations about the suitability of this software for any
      36             :  * purpose.  It is provided "as is" without express or implied warranty.
      37             :  *
      38             :  *
      39             :  * Copyright (c) 1996-1998
      40             :  * Silicon Graphics Computer Systems, Inc.
      41             :  *
      42             :  * Permission to use, copy, modify, distribute and sell this software
      43             :  * and its documentation for any purpose is hereby granted without fee,
      44             :  * provided that the above copyright notice appear in all copies and
      45             :  * that both that copyright notice and this permission notice appear
      46             :  * in supporting documentation.  Silicon Graphics makes no
      47             :  * representations about the suitability of this software for any
      48             :  * purpose.  It is provided "as is" without express or implied warranty.
      49             :  */
      50             : 
      51             : /** @file bits/stl_iterator.h
      52             :  *  This is an internal header file, included by other library headers.
      53             :  *  Do not attempt to use it directly. @headername{iterator}
      54             :  *
      55             :  *  This file implements reverse_iterator, back_insert_iterator,
      56             :  *  front_insert_iterator, insert_iterator, __normal_iterator, and their
      57             :  *  supporting functions and overloaded operators.
      58             :  */
      59             : 
      60             : #ifndef _STL_ITERATOR_H
      61             : #define _STL_ITERATOR_H 1
      62             : 
      63             : #include <bits/cpp_type_traits.h>
      64             : #include <bits/stl_iterator_base_types.h>
      65             : #include <ext/type_traits.h>
      66             : #include <bits/move.h>
      67             : #include <bits/ptr_traits.h>
      68             : 
      69             : #if __cplusplus >= 201103L
      70             : # include <type_traits>
      71             : #endif
      72             : 
      73             : #if __cplusplus > 201703L
      74             : # define __cpp_lib_array_constexpr 201811L
      75             : # define __cpp_lib_constexpr_iterator 201811L
      76             : #elif __cplusplus == 201703L
      77             : # define __cpp_lib_array_constexpr 201803L
      78             : #endif
      79             : 
      80             : #if __cplusplus >= 202002L
      81             : # include <compare>
      82             : # include <new>
      83             : # include <bits/exception_defines.h>
      84             : # include <bits/iterator_concepts.h>
      85             : # include <bits/stl_construct.h>
      86             : #endif
      87             : 
      88             : namespace std _GLIBCXX_VISIBILITY(default)
      89             : {
      90             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      91             : 
      92             :   /**
      93             :    * @addtogroup iterators
      94             :    * @{
      95             :    */
      96             : 
      97             : #if __cpp_lib_concepts
      98             :   namespace __detail
      99             :   {
     100             :     // Weaken iterator_category _Cat to _Limit if it is derived from that,
     101             :     // otherwise use _Otherwise.
     102             :     template<typename _Cat, typename _Limit, typename _Otherwise = _Cat>
     103             :       using __clamp_iter_cat
     104             :         = conditional_t<derived_from<_Cat, _Limit>, _Limit, _Otherwise>;
     105             :   }
     106             : #endif
     107             : 
     108             :   // 24.4.1 Reverse iterators
     109             :   /**
     110             :    *  Bidirectional and random access iterators have corresponding reverse
     111             :    *  %iterator adaptors that iterate through the data structure in the
     112             :    *  opposite direction.  They have the same signatures as the corresponding
     113             :    *  iterators.  The fundamental relation between a reverse %iterator and its
     114             :    *  corresponding %iterator @c i is established by the identity:
     115             :    *  @code
     116             :    *      &*(reverse_iterator(i)) == &*(i - 1)
     117             :    *  @endcode
     118             :    *
     119             :    *  <em>This mapping is dictated by the fact that while there is always a
     120             :    *  pointer past the end of an array, there might not be a valid pointer
     121             :    *  before the beginning of an array.</em> [24.4.1]/1,2
     122             :    *
     123             :    *  Reverse iterators can be tricky and surprising at first.  Their
     124             :    *  semantics make sense, however, and the trickiness is a side effect of
     125             :    *  the requirement that the iterators must be safe.
     126             :   */
     127             :   template<typename _Iterator>
     128             :     class reverse_iterator
     129             :     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
     130             :                       typename iterator_traits<_Iterator>::value_type,
     131             :                       typename iterator_traits<_Iterator>::difference_type,
     132             :                       typename iterator_traits<_Iterator>::pointer,
     133             :                       typename iterator_traits<_Iterator>::reference>
     134             :     {
     135             :       template<typename _Iter>
     136             :         friend class reverse_iterator;
     137             : 
     138             : #if __cpp_lib_concepts
     139             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     140             :       // 3435. three_way_comparable_with<reverse_iterator<int*>, [...]>
     141             :       template<typename _Iter>
     142             :         static constexpr bool __convertible = !is_same_v<_Iter, _Iterator>
     143             :             && convertible_to<const _Iter&, _Iterator>;
     144             : #endif
     145             : 
     146             :     protected:
     147             :       _Iterator current;
     148             : 
     149             :       typedef iterator_traits<_Iterator>          __traits_type;
     150             : 
     151             :     public:
     152             :       typedef _Iterator                                 iterator_type;
     153             :       typedef typename __traits_type::pointer           pointer;
     154             : #if ! __cpp_lib_concepts
     155             :       typedef typename __traits_type::difference_type   difference_type;
     156             :       typedef typename __traits_type::reference         reference;
     157             : #else
     158             :       using iterator_concept
     159             :         = conditional_t<random_access_iterator<_Iterator>,
     160             :                         random_access_iterator_tag,
     161             :                         bidirectional_iterator_tag>;
     162             :       using iterator_category
     163             :         = __detail::__clamp_iter_cat<typename __traits_type::iterator_category,
     164             :                                      random_access_iterator_tag>;
     165             :       using value_type = iter_value_t<_Iterator>;
     166             :       using difference_type = iter_difference_t<_Iterator>;
     167             :       using reference = iter_reference_t<_Iterator>;
     168             : #endif
     169             : 
     170             :       /**
     171             :        *  The default constructor value-initializes member @p current.
     172             :        *  If it is a pointer, that means it is zero-initialized.
     173             :       */
     174             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     175             :       // 235 No specification of default ctor for reverse_iterator
     176             :       // 1012. reverse_iterator default ctor should value initialize
     177             :       _GLIBCXX17_CONSTEXPR
     178             :       reverse_iterator() : current() { }
     179             : 
     180             :       /**
     181             :        *  This %iterator will move in the opposite direction that @p x does.
     182             :       */
     183             :       explicit _GLIBCXX17_CONSTEXPR
     184       60561 :       reverse_iterator(iterator_type __x) : current(__x) { }
     185             : 
     186             :       /**
     187             :        *  The copy constructor is normal.
     188             :       */
     189             :       _GLIBCXX17_CONSTEXPR
     190       13190 :       reverse_iterator(const reverse_iterator& __x)
     191       13190 :       : current(__x.current) { }
     192             : 
     193             : #if __cplusplus >= 201103L
     194             :       reverse_iterator& operator=(const reverse_iterator&) = default;
     195             : #endif
     196             : 
     197             :       /**
     198             :        *  A %reverse_iterator across other types can be copied if the
     199             :        *  underlying %iterator can be converted to the type of @c current.
     200             :       */
     201             :       template<typename _Iter>
     202             : #if __cpp_lib_concepts
     203             :         requires __convertible<_Iter>
     204             : #endif
     205             :         _GLIBCXX17_CONSTEXPR
     206             :         reverse_iterator(const reverse_iterator<_Iter>& __x)
     207             :         : current(__x.current) { }
     208             : 
     209             : #if __cplusplus >= 201103L
     210             :       template<typename _Iter>
     211             : #if __cpp_lib_concepts
     212             :         requires __convertible<_Iter>
     213             :           && assignable_from<_Iterator&, const _Iter&>
     214             : #endif
     215             :         _GLIBCXX17_CONSTEXPR
     216             :         reverse_iterator&
     217             :         operator=(const reverse_iterator<_Iter>& __x)
     218             :         {
     219             :           current = __x.current;
     220             :           return *this;
     221             :         }
     222             : #endif
     223             : 
     224             :       /**
     225             :        *  @return  @c current, the %iterator used for underlying work.
     226             :       */
     227             :       _GLIBCXX17_CONSTEXPR iterator_type
     228       50263 :       base() const
     229       50263 :       { return current; }
     230             : 
     231             :       /**
     232             :        *  @return  A reference to the value at @c --current
     233             :        *
     234             :        *  This requires that @c --current is dereferenceable.
     235             :        *
     236             :        *  @warning This implementation requires that for an iterator of the
     237             :        *           underlying iterator type, @c x, a reference obtained by
     238             :        *           @c *x remains valid after @c x has been modified or
     239             :        *           destroyed. This is a bug: http://gcc.gnu.org/PR51823
     240             :       */
     241             :       _GLIBCXX17_CONSTEXPR reference
     242       17706 :       operator*() const
     243             :       {
     244       17706 :         _Iterator __tmp = current;
     245       17706 :         return *--__tmp;
     246             :       }
     247             : 
     248             :       /**
     249             :        *  @return  A pointer to the value at @c --current
     250             :        *
     251             :        *  This requires that @c --current is dereferenceable.
     252             :       */
     253             :       _GLIBCXX17_CONSTEXPR pointer
     254       17803 :       operator->() const
     255             : #if __cplusplus > 201703L && __cpp_concepts >= 201907L
     256             :       requires is_pointer_v<_Iterator>
     257             :         || requires(const _Iterator __i) { __i.operator->(); }
     258             : #endif
     259             :       {
     260             :         // _GLIBCXX_RESOLVE_LIB_DEFECTS
     261             :         // 1052. operator-> should also support smart pointers
     262       17803 :         _Iterator __tmp = current;
     263       17803 :         --__tmp;
     264       17803 :         return _S_to_pointer(__tmp);
     265             :       }
     266             : 
     267             :       /**
     268             :        *  @return  @c *this
     269             :        *
     270             :        *  Decrements the underlying iterator.
     271             :       */
     272             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     273           0 :       operator++()
     274             :       {
     275           0 :         --current;
     276           0 :         return *this;
     277             :       }
     278             : 
     279             :       /**
     280             :        *  @return  The original value of @c *this
     281             :        *
     282             :        *  Decrements the underlying iterator.
     283             :       */
     284             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     285       12488 :       operator++(int)
     286             :       {
     287       12488 :         reverse_iterator __tmp = *this;
     288       12488 :         --current;
     289       12488 :         return __tmp;
     290             :       }
     291             : 
     292             :       /**
     293             :        *  @return  @c *this
     294             :        *
     295             :        *  Increments the underlying iterator.
     296             :       */
     297             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     298             :       operator--()
     299             :       {
     300             :         ++current;
     301             :         return *this;
     302             :       }
     303             : 
     304             :       /**
     305             :        *  @return  A reverse_iterator with the previous value of @c *this
     306             :        *
     307             :        *  Increments the underlying iterator.
     308             :       */
     309             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     310             :       operator--(int)
     311             :       {
     312             :         reverse_iterator __tmp = *this;
     313             :         ++current;
     314             :         return __tmp;
     315             :       }
     316             : 
     317             :       /**
     318             :        *  @return  A reverse_iterator that refers to @c current - @a __n
     319             :        *
     320             :        *  The underlying iterator must be a Random Access Iterator.
     321             :       */
     322             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     323           1 :       operator+(difference_type __n) const
     324           1 :       { return reverse_iterator(current - __n); }
     325             : 
     326             :       /**
     327             :        *  @return  *this
     328             :        *
     329             :        *  Moves the underlying iterator backwards @a __n steps.
     330             :        *  The underlying iterator must be a Random Access Iterator.
     331             :       */
     332             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     333             :       operator+=(difference_type __n)
     334             :       {
     335             :         current -= __n;
     336             :         return *this;
     337             :       }
     338             : 
     339             :       /**
     340             :        *  @return  A reverse_iterator that refers to @c current - @a __n
     341             :        *
     342             :        *  The underlying iterator must be a Random Access Iterator.
     343             :       */
     344             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     345             :       operator-(difference_type __n) const
     346             :       { return reverse_iterator(current + __n); }
     347             : 
     348             :       /**
     349             :        *  @return  *this
     350             :        *
     351             :        *  Moves the underlying iterator forwards @a __n steps.
     352             :        *  The underlying iterator must be a Random Access Iterator.
     353             :       */
     354             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     355             :       operator-=(difference_type __n)
     356             :       {
     357             :         current += __n;
     358             :         return *this;
     359             :       }
     360             : 
     361             :       /**
     362             :        *  @return  The value at @c current - @a __n - 1
     363             :        *
     364             :        *  The underlying iterator must be a Random Access Iterator.
     365             :       */
     366             :       _GLIBCXX17_CONSTEXPR reference
     367             :       operator[](difference_type __n) const
     368             :       { return *(*this + __n); }
     369             : 
     370             : #if __cplusplus > 201703L && __cpp_lib_concepts
     371             :       friend constexpr iter_rvalue_reference_t<_Iterator>
     372             :       iter_move(const reverse_iterator& __i)
     373             :       noexcept(is_nothrow_copy_constructible_v<_Iterator>
     374             :                && noexcept(ranges::iter_move(--std::declval<_Iterator&>())))
     375             :       {
     376             :         auto __tmp = __i.base();
     377             :         return ranges::iter_move(--__tmp);
     378             :       }
     379             : 
     380             :       template<indirectly_swappable<_Iterator> _Iter2>
     381             :         friend constexpr void
     382             :         iter_swap(const reverse_iterator& __x,
     383             :                   const reverse_iterator<_Iter2>& __y)
     384             :         noexcept(is_nothrow_copy_constructible_v<_Iterator>
     385             :                  && is_nothrow_copy_constructible_v<_Iter2>
     386             :                  && noexcept(ranges::iter_swap(--std::declval<_Iterator&>(),
     387             :                                                --std::declval<_Iter2&>())))
     388             :         {
     389             :           auto __xtmp = __x.base();
     390             :           auto __ytmp = __y.base();
     391             :           ranges::iter_swap(--__xtmp, --__ytmp);
     392             :         }
     393             : #endif
     394             : 
     395             :     private:
     396             :       template<typename _Tp>
     397             :         static _GLIBCXX17_CONSTEXPR _Tp*
     398             :         _S_to_pointer(_Tp* __p)
     399             :         { return __p; }
     400             : 
     401             :       template<typename _Tp>
     402             :         static _GLIBCXX17_CONSTEXPR pointer
     403       17803 :         _S_to_pointer(_Tp __t)
     404       17803 :         { return __t.operator->(); }
     405             :     };
     406             : 
     407             :   ///@{
     408             :   /**
     409             :    *  @param  __x  A %reverse_iterator.
     410             :    *  @param  __y  A %reverse_iterator.
     411             :    *  @return  A simple bool.
     412             :    *
     413             :    *  Reverse iterators forward comparisons to their underlying base()
     414             :    *  iterators.
     415             :    *
     416             :   */
     417             : #if __cplusplus <= 201703L || ! defined __cpp_lib_concepts
     418             :   template<typename _Iterator>
     419             :     inline _GLIBCXX17_CONSTEXPR bool
     420       24955 :     operator==(const reverse_iterator<_Iterator>& __x,
     421             :                const reverse_iterator<_Iterator>& __y)
     422       24955 :     { return __x.base() == __y.base(); }
     423             : 
     424             :   template<typename _Iterator>
     425             :     inline _GLIBCXX17_CONSTEXPR bool
     426             :     operator<(const reverse_iterator<_Iterator>& __x,
     427             :               const reverse_iterator<_Iterator>& __y)
     428             :     { return __y.base() < __x.base(); }
     429             : 
     430             :   template<typename _Iterator>
     431             :     inline _GLIBCXX17_CONSTEXPR bool
     432       24955 :     operator!=(const reverse_iterator<_Iterator>& __x,
     433             :                const reverse_iterator<_Iterator>& __y)
     434       24955 :     { return !(__x == __y); }
     435             : 
     436             :   template<typename _Iterator>
     437             :     inline _GLIBCXX17_CONSTEXPR bool
     438             :     operator>(const reverse_iterator<_Iterator>& __x,
     439             :               const reverse_iterator<_Iterator>& __y)
     440             :     { return __y < __x; }
     441             : 
     442             :   template<typename _Iterator>
     443             :     inline _GLIBCXX17_CONSTEXPR bool
     444             :     operator<=(const reverse_iterator<_Iterator>& __x,
     445             :                const reverse_iterator<_Iterator>& __y)
     446             :     { return !(__y < __x); }
     447             : 
     448             :   template<typename _Iterator>
     449             :     inline _GLIBCXX17_CONSTEXPR bool
     450             :     operator>=(const reverse_iterator<_Iterator>& __x,
     451             :                const reverse_iterator<_Iterator>& __y)
     452             :     { return !(__x < __y); }
     453             : 
     454             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     455             :   // DR 280. Comparison of reverse_iterator to const reverse_iterator.
     456             : 
     457             :   template<typename _IteratorL, typename _IteratorR>
     458             :     inline _GLIBCXX17_CONSTEXPR bool
     459             :     operator==(const reverse_iterator<_IteratorL>& __x,
     460             :                const reverse_iterator<_IteratorR>& __y)
     461             :     { return __x.base() == __y.base(); }
     462             : 
     463             :   template<typename _IteratorL, typename _IteratorR>
     464             :     inline _GLIBCXX17_CONSTEXPR bool
     465             :     operator<(const reverse_iterator<_IteratorL>& __x,
     466             :               const reverse_iterator<_IteratorR>& __y)
     467             :     { return __x.base() > __y.base(); }
     468             : 
     469             :   template<typename _IteratorL, typename _IteratorR>
     470             :     inline _GLIBCXX17_CONSTEXPR bool
     471             :     operator!=(const reverse_iterator<_IteratorL>& __x,
     472             :                const reverse_iterator<_IteratorR>& __y)
     473             :     { return __x.base() != __y.base(); }
     474             : 
     475             :   template<typename _IteratorL, typename _IteratorR>
     476             :     inline _GLIBCXX17_CONSTEXPR bool
     477             :     operator>(const reverse_iterator<_IteratorL>& __x,
     478             :               const reverse_iterator<_IteratorR>& __y)
     479             :     { return __x.base() < __y.base(); }
     480             : 
     481             :   template<typename _IteratorL, typename _IteratorR>
     482             :     inline _GLIBCXX17_CONSTEXPR bool
     483             :     operator<=(const reverse_iterator<_IteratorL>& __x,
     484             :                const reverse_iterator<_IteratorR>& __y)
     485             :     { return __x.base() >= __y.base(); }
     486             : 
     487             :   template<typename _IteratorL, typename _IteratorR>
     488             :     inline _GLIBCXX17_CONSTEXPR bool
     489             :     operator>=(const reverse_iterator<_IteratorL>& __x,
     490             :                const reverse_iterator<_IteratorR>& __y)
     491             :     { return __x.base() <= __y.base(); }
     492             : #else // C++20
     493             :   template<typename _IteratorL, typename _IteratorR>
     494             :     constexpr bool
     495             :     operator==(const reverse_iterator<_IteratorL>& __x,
     496             :                const reverse_iterator<_IteratorR>& __y)
     497             :     requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
     498             :     { return __x.base() == __y.base(); }
     499             : 
     500             :   template<typename _IteratorL, typename _IteratorR>
     501             :     constexpr bool
     502             :     operator!=(const reverse_iterator<_IteratorL>& __x,
     503             :                const reverse_iterator<_IteratorR>& __y)
     504             :     requires requires { { __x.base() != __y.base() } -> convertible_to<bool>; }
     505             :     { return __x.base() != __y.base(); }
     506             : 
     507             :   template<typename _IteratorL, typename _IteratorR>
     508             :     constexpr bool
     509             :     operator<(const reverse_iterator<_IteratorL>& __x,
     510             :               const reverse_iterator<_IteratorR>& __y)
     511             :     requires requires { { __x.base() > __y.base() } -> convertible_to<bool>; }
     512             :     { return __x.base() > __y.base(); }
     513             : 
     514             :   template<typename _IteratorL, typename _IteratorR>
     515             :     constexpr bool
     516             :     operator>(const reverse_iterator<_IteratorL>& __x,
     517             :               const reverse_iterator<_IteratorR>& __y)
     518             :     requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
     519             :     { return __x.base() < __y.base(); }
     520             : 
     521             :   template<typename _IteratorL, typename _IteratorR>
     522             :     constexpr bool
     523             :     operator<=(const reverse_iterator<_IteratorL>& __x,
     524             :                const reverse_iterator<_IteratorR>& __y)
     525             :     requires requires { { __x.base() >= __y.base() } -> convertible_to<bool>; }
     526             :     { return __x.base() >= __y.base(); }
     527             : 
     528             :   template<typename _IteratorL, typename _IteratorR>
     529             :     constexpr bool
     530             :     operator>=(const reverse_iterator<_IteratorL>& __x,
     531             :                const reverse_iterator<_IteratorR>& __y)
     532             :     requires requires { { __x.base() <= __y.base() } -> convertible_to<bool>; }
     533             :     { return __x.base() <= __y.base(); }
     534             : 
     535             :   template<typename _IteratorL,
     536             :            three_way_comparable_with<_IteratorL> _IteratorR>
     537             :     constexpr compare_three_way_result_t<_IteratorL, _IteratorR>
     538             :     operator<=>(const reverse_iterator<_IteratorL>& __x,
     539             :                 const reverse_iterator<_IteratorR>& __y)
     540             :     { return __y.base() <=> __x.base(); }
     541             : 
     542             :   // Additional, non-standard overloads to avoid ambiguities with greedy,
     543             :   // unconstrained overloads in associated namespaces.
     544             : 
     545             :   template<typename _Iterator>
     546             :     constexpr bool
     547             :     operator==(const reverse_iterator<_Iterator>& __x,
     548             :                const reverse_iterator<_Iterator>& __y)
     549             :     requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
     550             :     { return __x.base() == __y.base(); }
     551             : 
     552             :   template<three_way_comparable _Iterator>
     553             :     constexpr compare_three_way_result_t<_Iterator, _Iterator>
     554             :     operator<=>(const reverse_iterator<_Iterator>& __x,
     555             :                 const reverse_iterator<_Iterator>& __y)
     556             :     { return __y.base() <=> __x.base(); }
     557             : #endif // C++20
     558             :   ///@}
     559             : 
     560             : #if __cplusplus < 201103L
     561             :   template<typename _Iterator>
     562             :     inline typename reverse_iterator<_Iterator>::difference_type
     563             :     operator-(const reverse_iterator<_Iterator>& __x,
     564             :               const reverse_iterator<_Iterator>& __y)
     565             :     { return __y.base() - __x.base(); }
     566             : 
     567             :   template<typename _IteratorL, typename _IteratorR>
     568             :     inline typename reverse_iterator<_IteratorL>::difference_type
     569             :     operator-(const reverse_iterator<_IteratorL>& __x,
     570             :               const reverse_iterator<_IteratorR>& __y)
     571             :     { return __y.base() - __x.base(); }
     572             : #else
     573             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     574             :   // DR 685. reverse_iterator/move_iterator difference has invalid signatures
     575             :   template<typename _IteratorL, typename _IteratorR>
     576             :     inline _GLIBCXX17_CONSTEXPR auto
     577         118 :     operator-(const reverse_iterator<_IteratorL>& __x,
     578             :               const reverse_iterator<_IteratorR>& __y)
     579             :     -> decltype(__y.base() - __x.base())
     580         118 :     { return __y.base() - __x.base(); }
     581             : #endif
     582             : 
     583             :   template<typename _Iterator>
     584             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     585             :     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
     586             :               const reverse_iterator<_Iterator>& __x)
     587             :     { return reverse_iterator<_Iterator>(__x.base() - __n); }
     588             : 
     589             : #if __cplusplus >= 201103L
     590             :   // Same as C++14 make_reverse_iterator but used in C++11 mode too.
     591             :   template<typename _Iterator>
     592             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     593           0 :     __make_reverse_iterator(_Iterator __i)
     594           0 :     { return reverse_iterator<_Iterator>(__i); }
     595             : 
     596             : # if __cplusplus >= 201402L
     597             : #  define __cpp_lib_make_reverse_iterator 201402
     598             : 
     599             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     600             :   // DR 2285. make_reverse_iterator
     601             :   /// Generator function for reverse_iterator.
     602             :   template<typename _Iterator>
     603             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     604             :     make_reverse_iterator(_Iterator __i)
     605             :     { return reverse_iterator<_Iterator>(__i); }
     606             : 
     607             : #  if __cplusplus > 201703L && defined __cpp_lib_concepts
     608             :   template<typename _Iterator1, typename _Iterator2>
     609             :     requires (!sized_sentinel_for<_Iterator1, _Iterator2>)
     610             :     inline constexpr bool
     611             :     disable_sized_sentinel_for<reverse_iterator<_Iterator1>,
     612             :                                reverse_iterator<_Iterator2>> = true;
     613             : #  endif // C++20
     614             : # endif // C++14
     615             : 
     616             :   template<typename _Iterator>
     617             :     _GLIBCXX20_CONSTEXPR
     618             :     auto
     619           0 :     __niter_base(reverse_iterator<_Iterator> __it)
     620             :     -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
     621           0 :     { return __make_reverse_iterator(__niter_base(__it.base())); }
     622             : 
     623             :   template<typename _Iterator>
     624             :     struct __is_move_iterator<reverse_iterator<_Iterator> >
     625             :       : __is_move_iterator<_Iterator>
     626             :     { };
     627             : 
     628             :   template<typename _Iterator>
     629             :     _GLIBCXX20_CONSTEXPR
     630             :     auto
     631             :     __miter_base(reverse_iterator<_Iterator> __it)
     632             :     -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
     633             :     { return __make_reverse_iterator(__miter_base(__it.base())); }
     634             : #endif // C++11
     635             : 
     636             :   // 24.4.2.2.1 back_insert_iterator
     637             :   /**
     638             :    *  @brief  Turns assignment into insertion.
     639             :    *
     640             :    *  These are output iterators, constructed from a container-of-T.
     641             :    *  Assigning a T to the iterator appends it to the container using
     642             :    *  push_back.
     643             :    *
     644             :    *  Tip:  Using the back_inserter function to create these iterators can
     645             :    *  save typing.
     646             :   */
     647             :   template<typename _Container>
     648             :     class back_insert_iterator
     649             :     : public iterator<output_iterator_tag, void, void, void, void>
     650             :     {
     651             :     protected:
     652             :       _Container* container;
     653             : 
     654             :     public:
     655             :       /// A nested typedef for the type of whatever container you used.
     656             :       typedef _Container          container_type;
     657             : #if __cplusplus > 201703L
     658             :       using difference_type = ptrdiff_t;
     659             : 
     660             :       constexpr back_insert_iterator() noexcept : container(nullptr) { }
     661             : #endif
     662             : 
     663             :       /// The only way to create this %iterator is with a container.
     664             :       explicit _GLIBCXX20_CONSTEXPR
     665      324817 :       back_insert_iterator(_Container& __x)
     666      324817 :       : container(std::__addressof(__x)) { }
     667             : 
     668             :       /**
     669             :        *  @param  __value  An instance of whatever type
     670             :        *                 container_type::const_reference is; presumably a
     671             :        *                 reference-to-const T for container<T>.
     672             :        *  @return  This %iterator, for chained operations.
     673             :        *
     674             :        *  This kind of %iterator doesn't really have a @a position in the
     675             :        *  container (you can think of the position as being permanently at
     676             :        *  the end, if you like).  Assigning a value to the %iterator will
     677             :        *  always append the value to the end of the container.
     678             :       */
     679             : #if __cplusplus < 201103L
     680             :       back_insert_iterator&
     681             :       operator=(typename _Container::const_reference __value)
     682             :       {
     683             :         container->push_back(__value);
     684             :         return *this;
     685             :       }
     686             : #else
     687             :       _GLIBCXX20_CONSTEXPR
     688             :       back_insert_iterator&
     689     1506946 :       operator=(const typename _Container::value_type& __value)
     690             :       {
     691     1506946 :         container->push_back(__value);
     692     1506946 :         return *this;
     693             :       }
     694             : 
     695             :       _GLIBCXX20_CONSTEXPR
     696             :       back_insert_iterator&
     697         232 :       operator=(typename _Container::value_type&& __value)
     698             :       {
     699         232 :         container->push_back(std::move(__value));
     700         232 :         return *this;
     701             :       }
     702             : #endif
     703             : 
     704             :       /// Simply returns *this.
     705             :       _GLIBCXX20_CONSTEXPR
     706             :       back_insert_iterator&
     707     1507178 :       operator*()
     708     1507178 :       { return *this; }
     709             : 
     710             :       /// Simply returns *this.  (This %iterator does not @a move.)
     711             :       _GLIBCXX20_CONSTEXPR
     712             :       back_insert_iterator&
     713      290968 :       operator++()
     714      290968 :       { return *this; }
     715             : 
     716             :       /// Simply returns *this.  (This %iterator does not @a move.)
     717             :       _GLIBCXX20_CONSTEXPR
     718             :       back_insert_iterator
     719     1216127 :       operator++(int)
     720     1216127 :       { return *this; }
     721             :     };
     722             : 
     723             :   /**
     724             :    *  @param  __x  A container of arbitrary type.
     725             :    *  @return  An instance of back_insert_iterator working on @p __x.
     726             :    *
     727             :    *  This wrapper function helps in creating back_insert_iterator instances.
     728             :    *  Typing the name of the %iterator requires knowing the precise full
     729             :    *  type of the container, which can be tedious and impedes generic
     730             :    *  programming.  Using this function lets you take advantage of automatic
     731             :    *  template parameter deduction, making the compiler match the correct
     732             :    *  types for you.
     733             :   */
     734             :   template<typename _Container>
     735             :     _GLIBCXX20_CONSTEXPR
     736             :     inline back_insert_iterator<_Container>
     737      319228 :     back_inserter(_Container& __x)
     738      319228 :     { return back_insert_iterator<_Container>(__x); }
     739             : 
     740             :   /**
     741             :    *  @brief  Turns assignment into insertion.
     742             :    *
     743             :    *  These are output iterators, constructed from a container-of-T.
     744             :    *  Assigning a T to the iterator prepends it to the container using
     745             :    *  push_front.
     746             :    *
     747             :    *  Tip:  Using the front_inserter function to create these iterators can
     748             :    *  save typing.
     749             :   */
     750             :   template<typename _Container>
     751             :     class front_insert_iterator
     752             :     : public iterator<output_iterator_tag, void, void, void, void>
     753             :     {
     754             :     protected:
     755             :       _Container* container;
     756             : 
     757             :     public:
     758             :       /// A nested typedef for the type of whatever container you used.
     759             :       typedef _Container          container_type;
     760             : #if __cplusplus > 201703L
     761             :       using difference_type = ptrdiff_t;
     762             : 
     763             :       constexpr front_insert_iterator() noexcept : container(nullptr) { }
     764             : #endif
     765             : 
     766             :       /// The only way to create this %iterator is with a container.
     767             :       explicit _GLIBCXX20_CONSTEXPR
     768             :       front_insert_iterator(_Container& __x)
     769             :       : container(std::__addressof(__x)) { }
     770             : 
     771             :       /**
     772             :        *  @param  __value  An instance of whatever type
     773             :        *                 container_type::const_reference is; presumably a
     774             :        *                 reference-to-const T for container<T>.
     775             :        *  @return  This %iterator, for chained operations.
     776             :        *
     777             :        *  This kind of %iterator doesn't really have a @a position in the
     778             :        *  container (you can think of the position as being permanently at
     779             :        *  the front, if you like).  Assigning a value to the %iterator will
     780             :        *  always prepend the value to the front of the container.
     781             :       */
     782             : #if __cplusplus < 201103L
     783             :       front_insert_iterator&
     784             :       operator=(typename _Container::const_reference __value)
     785             :       {
     786             :         container->push_front(__value);
     787             :         return *this;
     788             :       }
     789             : #else
     790             :       _GLIBCXX20_CONSTEXPR
     791             :       front_insert_iterator&
     792             :       operator=(const typename _Container::value_type& __value)
     793             :       {
     794             :         container->push_front(__value);
     795             :         return *this;
     796             :       }
     797             : 
     798             :       _GLIBCXX20_CONSTEXPR
     799             :       front_insert_iterator&
     800             :       operator=(typename _Container::value_type&& __value)
     801             :       {
     802             :         container->push_front(std::move(__value));
     803             :         return *this;
     804             :       }
     805             : #endif
     806             : 
     807             :       /// Simply returns *this.
     808             :       _GLIBCXX20_CONSTEXPR
     809             :       front_insert_iterator&
     810             :       operator*()
     811             :       { return *this; }
     812             : 
     813             :       /// Simply returns *this.  (This %iterator does not @a move.)
     814             :       _GLIBCXX20_CONSTEXPR
     815             :       front_insert_iterator&
     816             :       operator++()
     817             :       { return *this; }
     818             : 
     819             :       /// Simply returns *this.  (This %iterator does not @a move.)
     820             :       _GLIBCXX20_CONSTEXPR
     821             :       front_insert_iterator
     822             :       operator++(int)
     823             :       { return *this; }
     824             :     };
     825             : 
     826             :   /**
     827             :    *  @param  __x  A container of arbitrary type.
     828             :    *  @return  An instance of front_insert_iterator working on @p x.
     829             :    *
     830             :    *  This wrapper function helps in creating front_insert_iterator instances.
     831             :    *  Typing the name of the %iterator requires knowing the precise full
     832             :    *  type of the container, which can be tedious and impedes generic
     833             :    *  programming.  Using this function lets you take advantage of automatic
     834             :    *  template parameter deduction, making the compiler match the correct
     835             :    *  types for you.
     836             :   */
     837             :   template<typename _Container>
     838             :     _GLIBCXX20_CONSTEXPR
     839             :     inline front_insert_iterator<_Container>
     840             :     front_inserter(_Container& __x)
     841             :     { return front_insert_iterator<_Container>(__x); }
     842             : 
     843             :   /**
     844             :    *  @brief  Turns assignment into insertion.
     845             :    *
     846             :    *  These are output iterators, constructed from a container-of-T.
     847             :    *  Assigning a T to the iterator inserts it in the container at the
     848             :    *  %iterator's position, rather than overwriting the value at that
     849             :    *  position.
     850             :    *
     851             :    *  (Sequences will actually insert a @e copy of the value before the
     852             :    *  %iterator's position.)
     853             :    *
     854             :    *  Tip:  Using the inserter function to create these iterators can
     855             :    *  save typing.
     856             :   */
     857             :   template<typename _Container>
     858             :     class insert_iterator
     859             :     : public iterator<output_iterator_tag, void, void, void, void>
     860             :     {
     861             : #if __cplusplus > 201703L && defined __cpp_lib_concepts
     862             :       using _Iter = std::__detail::__range_iter_t<_Container>;
     863             : 
     864             :     protected:
     865             :       _Container* container = nullptr;
     866             :       _Iter iter = _Iter();
     867             : #else
     868             :       typedef typename _Container::iterator             _Iter;
     869             : 
     870             :     protected:
     871             :       _Container* container;
     872             :       _Iter iter;
     873             : #endif
     874             : 
     875             :     public:
     876             :       /// A nested typedef for the type of whatever container you used.
     877             :       typedef _Container          container_type;
     878             : 
     879             : #if __cplusplus > 201703L && defined __cpp_lib_concepts
     880             :       using difference_type = ptrdiff_t;
     881             : 
     882             :       insert_iterator() = default;
     883             : #endif
     884             : 
     885             :       /**
     886             :        *  The only way to create this %iterator is with a container and an
     887             :        *  initial position (a normal %iterator into the container).
     888             :       */
     889             :       _GLIBCXX20_CONSTEXPR
     890        1564 :       insert_iterator(_Container& __x, _Iter __i)
     891        1564 :       : container(std::__addressof(__x)), iter(__i) {}
     892             : 
     893             :       /**
     894             :        *  @param  __value  An instance of whatever type
     895             :        *                 container_type::const_reference is; presumably a
     896             :        *                 reference-to-const T for container<T>.
     897             :        *  @return  This %iterator, for chained operations.
     898             :        *
     899             :        *  This kind of %iterator maintains its own position in the
     900             :        *  container.  Assigning a value to the %iterator will insert the
     901             :        *  value into the container at the place before the %iterator.
     902             :        *
     903             :        *  The position is maintained such that subsequent assignments will
     904             :        *  insert values immediately after one another.  For example,
     905             :        *  @code
     906             :        *     // vector v contains A and Z
     907             :        *
     908             :        *     insert_iterator i (v, ++v.begin());
     909             :        *     i = 1;
     910             :        *     i = 2;
     911             :        *     i = 3;
     912             :        *
     913             :        *     // vector v contains A, 1, 2, 3, and Z
     914             :        *  @endcode
     915             :       */
     916             : #if __cplusplus < 201103L
     917             :       insert_iterator&
     918             :       operator=(typename _Container::const_reference __value)
     919             :       {
     920             :         iter = container->insert(iter, __value);
     921             :         ++iter;
     922             :         return *this;
     923             :       }
     924             : #else
     925             :       _GLIBCXX20_CONSTEXPR
     926             :       insert_iterator&
     927        3330 :       operator=(const typename _Container::value_type& __value)
     928             :       {
     929        3330 :         iter = container->insert(iter, __value);
     930        3330 :         ++iter;
     931        3330 :         return *this;
     932             :       }
     933             : 
     934             :       _GLIBCXX20_CONSTEXPR
     935             :       insert_iterator&
     936             :       operator=(typename _Container::value_type&& __value)
     937             :       {
     938             :         iter = container->insert(iter, std::move(__value));
     939             :         ++iter;
     940             :         return *this;
     941             :       }
     942             : #endif
     943             : 
     944             :       /// Simply returns *this.
     945             :       _GLIBCXX20_CONSTEXPR
     946             :       insert_iterator&
     947        3330 :       operator*()
     948        3330 :       { return *this; }
     949             : 
     950             :       /// Simply returns *this.  (This %iterator does not @a move.)
     951             :       _GLIBCXX20_CONSTEXPR
     952             :       insert_iterator&
     953        3330 :       operator++()
     954        3330 :       { return *this; }
     955             : 
     956             :       /// Simply returns *this.  (This %iterator does not @a move.)
     957             :       _GLIBCXX20_CONSTEXPR
     958             :       insert_iterator&
     959             :       operator++(int)
     960             :       { return *this; }
     961             :     };
     962             : 
     963             :   /**
     964             :    *  @param __x  A container of arbitrary type.
     965             :    *  @param __i  An iterator into the container.
     966             :    *  @return  An instance of insert_iterator working on @p __x.
     967             :    *
     968             :    *  This wrapper function helps in creating insert_iterator instances.
     969             :    *  Typing the name of the %iterator requires knowing the precise full
     970             :    *  type of the container, which can be tedious and impedes generic
     971             :    *  programming.  Using this function lets you take advantage of automatic
     972             :    *  template parameter deduction, making the compiler match the correct
     973             :    *  types for you.
     974             :   */
     975             : #if __cplusplus > 201703L && defined __cpp_lib_concepts
     976             :   template<typename _Container>
     977             :     constexpr insert_iterator<_Container>
     978             :     inserter(_Container& __x, std::__detail::__range_iter_t<_Container> __i)
     979             :     { return insert_iterator<_Container>(__x, __i); }
     980             : #else
     981             :   template<typename _Container>
     982             :     inline insert_iterator<_Container>
     983        1564 :     inserter(_Container& __x, typename _Container::iterator __i)
     984        1564 :     { return insert_iterator<_Container>(__x, __i); }
     985             : #endif
     986             : 
     987             :   /// @} group iterators
     988             : 
     989             : _GLIBCXX_END_NAMESPACE_VERSION
     990             : } // namespace
     991             : 
     992             : namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
     993             : {
     994             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
     995             : 
     996             :   // This iterator adapter is @a normal in the sense that it does not
     997             :   // change the semantics of any of the operators of its iterator
     998             :   // parameter.  Its primary purpose is to convert an iterator that is
     999             :   // not a class, e.g. a pointer, into an iterator that is a class.
    1000             :   // The _Container parameter exists solely so that different containers
    1001             :   // using this template can instantiate different types, even if the
    1002             :   // _Iterator parameter is the same.
    1003             :   template<typename _Iterator, typename _Container>
    1004             :     class __normal_iterator
    1005             :     {
    1006             :     protected:
    1007             :       _Iterator _M_current;
    1008             : 
    1009             :       typedef std::iterator_traits<_Iterator>             __traits_type;
    1010             : 
    1011             :     public:
    1012             :       typedef _Iterator                                 iterator_type;
    1013             :       typedef typename __traits_type::iterator_category iterator_category;
    1014             :       typedef typename __traits_type::value_type        value_type;
    1015             :       typedef typename __traits_type::difference_type   difference_type;
    1016             :       typedef typename __traits_type::reference         reference;
    1017             :       typedef typename __traits_type::pointer           pointer;
    1018             : 
    1019             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1020             :       using iterator_concept = std::__detail::__iter_concept<_Iterator>;
    1021             : #endif
    1022             : 
    1023      758009 :       _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
    1024      758009 :       : _M_current(_Iterator()) { }
    1025             : 
    1026             :       explicit _GLIBCXX20_CONSTEXPR
    1027   692620425 :       __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
    1028   692620425 :       : _M_current(__i) { }
    1029             : 
    1030             :       // Allow iterator to const_iterator conversion
    1031             :       template<typename _Iter>
    1032             :         _GLIBCXX20_CONSTEXPR
    1033       75099 :         __normal_iterator(const __normal_iterator<_Iter,
    1034             :                           typename __enable_if<
    1035             :                (std::__are_same<_Iter, typename _Container::pointer>::__value),
    1036             :                       _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
    1037       75099 :         : _M_current(__i.base()) { }
    1038             : 
    1039             :       // Forward iterator requirements
    1040             :       _GLIBCXX20_CONSTEXPR
    1041             :       reference
    1042   264562781 :       operator*() const _GLIBCXX_NOEXCEPT
    1043   264562781 :       { return *_M_current; }
    1044             : 
    1045             :       _GLIBCXX20_CONSTEXPR
    1046             :       pointer
    1047       36307 :       operator->() const _GLIBCXX_NOEXCEPT
    1048       36307 :       { return _M_current; }
    1049             : 
    1050             :       _GLIBCXX20_CONSTEXPR
    1051             :       __normal_iterator&
    1052     2149841 :       operator++() _GLIBCXX_NOEXCEPT
    1053             :       {
    1054     2149841 :         ++_M_current;
    1055     2149841 :         return *this;
    1056             :       }
    1057             : 
    1058             :       _GLIBCXX20_CONSTEXPR
    1059             :       __normal_iterator
    1060       11268 :       operator++(int) _GLIBCXX_NOEXCEPT
    1061       11268 :       { return __normal_iterator(_M_current++); }
    1062             : 
    1063             :       // Bidirectional iterator requirements
    1064             :       _GLIBCXX20_CONSTEXPR
    1065             :       __normal_iterator&
    1066      375556 :       operator--() _GLIBCXX_NOEXCEPT
    1067             :       {
    1068      375556 :         --_M_current;
    1069      375556 :         return *this;
    1070             :       }
    1071             : 
    1072             :       _GLIBCXX20_CONSTEXPR
    1073             :       __normal_iterator
    1074             :       operator--(int) _GLIBCXX_NOEXCEPT
    1075             :       { return __normal_iterator(_M_current--); }
    1076             : 
    1077             :       // Random access iterator requirements
    1078             :       _GLIBCXX20_CONSTEXPR
    1079             :       reference
    1080             :       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
    1081             :       { return _M_current[__n]; }
    1082             : 
    1083             :       _GLIBCXX20_CONSTEXPR
    1084             :       __normal_iterator&
    1085      124889 :       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
    1086      124889 :       { _M_current += __n; return *this; }
    1087             : 
    1088             :       _GLIBCXX20_CONSTEXPR
    1089             :       __normal_iterator
    1090      887221 :       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
    1091      887221 :       { return __normal_iterator(_M_current + __n); }
    1092             : 
    1093             :       _GLIBCXX20_CONSTEXPR
    1094             :       __normal_iterator&
    1095             :       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
    1096             :       { _M_current -= __n; return *this; }
    1097             : 
    1098             :       _GLIBCXX20_CONSTEXPR
    1099             :       __normal_iterator
    1100   261950285 :       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
    1101   261950285 :       { return __normal_iterator(_M_current - __n); }
    1102             : 
    1103             :       _GLIBCXX20_CONSTEXPR
    1104             :       const _Iterator&
    1105   174194594 :       base() const _GLIBCXX_NOEXCEPT
    1106   174194594 :       { return _M_current; }
    1107             :     };
    1108             : 
    1109             :   // Note: In what follows, the left- and right-hand-side iterators are
    1110             :   // allowed to vary in types (conceptually in cv-qualification) so that
    1111             :   // comparison between cv-qualified and non-cv-qualified iterators be
    1112             :   // valid.  However, the greedy and unfriendly operators in std::rel_ops
    1113             :   // will make overload resolution ambiguous (when in scope) if we don't
    1114             :   // provide overloads whose operands are of the same type.  Can someone
    1115             :   // remind me what generic programming is about? -- Gaby
    1116             : 
    1117             : #if __cpp_lib_three_way_comparison
    1118             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1119             :     requires requires (_IteratorL __lhs, _IteratorR __rhs)
    1120             :     { { __lhs == __rhs } -> std::convertible_to<bool>; }
    1121             :     constexpr bool
    1122             :     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1123             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
    1124             :     noexcept(noexcept(__lhs.base() == __rhs.base()))
    1125             :     { return __lhs.base() == __rhs.base(); }
    1126             : 
    1127             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1128             :     constexpr std::__detail::__synth3way_t<_IteratorR, _IteratorL>
    1129             :     operator<=>(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1130             :                 const __normal_iterator<_IteratorR, _Container>& __rhs)
    1131             :     noexcept(noexcept(std::__detail::__synth3way(__lhs.base(), __rhs.base())))
    1132             :     { return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
    1133             : 
    1134             :   template<typename _Iterator, typename _Container>
    1135             :     constexpr bool
    1136             :     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
    1137             :                const __normal_iterator<_Iterator, _Container>& __rhs)
    1138             :     noexcept(noexcept(__lhs.base() == __rhs.base()))
    1139             :     requires requires {
    1140             :       { __lhs.base() == __rhs.base() } -> std::convertible_to<bool>;
    1141             :     }
    1142             :     { return __lhs.base() == __rhs.base(); }
    1143             : 
    1144             :   template<typename _Iterator, typename _Container>
    1145             :     constexpr std::__detail::__synth3way_t<_Iterator>
    1146             :     operator<=>(const __normal_iterator<_Iterator, _Container>& __lhs,
    1147             :                 const __normal_iterator<_Iterator, _Container>& __rhs)
    1148             :     noexcept(noexcept(std::__detail::__synth3way(__lhs.base(), __rhs.base())))
    1149             :     { return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
    1150             : #else
    1151             :    // Forward iterator requirements
    1152             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1153             :     _GLIBCXX20_CONSTEXPR
    1154             :     inline bool
    1155        2744 :     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1156             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
    1157             :     _GLIBCXX_NOEXCEPT
    1158        2744 :     { return __lhs.base() == __rhs.base(); }
    1159             : 
    1160             :   template<typename _Iterator, typename _Container>
    1161             :     _GLIBCXX20_CONSTEXPR
    1162             :     inline bool
    1163    81621634 :     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
    1164             :                const __normal_iterator<_Iterator, _Container>& __rhs)
    1165             :     _GLIBCXX_NOEXCEPT
    1166    81621634 :     { return __lhs.base() == __rhs.base(); }
    1167             : 
    1168             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1169             :     _GLIBCXX20_CONSTEXPR
    1170             :     inline bool
    1171           0 :     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1172             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
    1173             :     _GLIBCXX_NOEXCEPT
    1174           0 :     { return __lhs.base() != __rhs.base(); }
    1175             : 
    1176             :   template<typename _Iterator, typename _Container>
    1177             :     _GLIBCXX20_CONSTEXPR
    1178             :     inline bool
    1179     2789816 :     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
    1180             :                const __normal_iterator<_Iterator, _Container>& __rhs)
    1181             :     _GLIBCXX_NOEXCEPT
    1182     2789816 :     { return __lhs.base() != __rhs.base(); }
    1183             : 
    1184             :   // Random access iterator requirements
    1185             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1186             :     inline bool
    1187             :     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1188             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
    1189             :     _GLIBCXX_NOEXCEPT
    1190             :     { return __lhs.base() < __rhs.base(); }
    1191             : 
    1192             :   template<typename _Iterator, typename _Container>
    1193             :     _GLIBCXX20_CONSTEXPR
    1194             :     inline bool
    1195        2765 :     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
    1196             :               const __normal_iterator<_Iterator, _Container>& __rhs)
    1197             :     _GLIBCXX_NOEXCEPT
    1198        2765 :     { return __lhs.base() < __rhs.base(); }
    1199             : 
    1200             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1201             :     inline bool
    1202             :     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1203             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
    1204             :     _GLIBCXX_NOEXCEPT
    1205             :     { return __lhs.base() > __rhs.base(); }
    1206             : 
    1207             :   template<typename _Iterator, typename _Container>
    1208             :     _GLIBCXX20_CONSTEXPR
    1209             :     inline bool
    1210             :     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
    1211             :               const __normal_iterator<_Iterator, _Container>& __rhs)
    1212             :     _GLIBCXX_NOEXCEPT
    1213             :     { return __lhs.base() > __rhs.base(); }
    1214             : 
    1215             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1216             :     inline bool
    1217             :     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1218             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
    1219             :     _GLIBCXX_NOEXCEPT
    1220             :     { return __lhs.base() <= __rhs.base(); }
    1221             : 
    1222             :   template<typename _Iterator, typename _Container>
    1223             :     _GLIBCXX20_CONSTEXPR
    1224             :     inline bool
    1225             :     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
    1226             :                const __normal_iterator<_Iterator, _Container>& __rhs)
    1227             :     _GLIBCXX_NOEXCEPT
    1228             :     { return __lhs.base() <= __rhs.base(); }
    1229             : 
    1230             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1231             :     inline bool
    1232             :     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1233             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
    1234             :     _GLIBCXX_NOEXCEPT
    1235             :     { return __lhs.base() >= __rhs.base(); }
    1236             : 
    1237             :   template<typename _Iterator, typename _Container>
    1238             :     _GLIBCXX20_CONSTEXPR
    1239             :     inline bool
    1240             :     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
    1241             :                const __normal_iterator<_Iterator, _Container>& __rhs)
    1242             :     _GLIBCXX_NOEXCEPT
    1243             :     { return __lhs.base() >= __rhs.base(); }
    1244             : #endif // three-way comparison
    1245             : 
    1246             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1247             :   // According to the resolution of DR179 not only the various comparison
    1248             :   // operators but also operator- must accept mixed iterator/const_iterator
    1249             :   // parameters.
    1250             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
    1251             : #if __cplusplus >= 201103L
    1252             :     // DR 685.
    1253             :     _GLIBCXX20_CONSTEXPR
    1254             :     inline auto
    1255        7500 :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1256             :               const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
    1257             :     -> decltype(__lhs.base() - __rhs.base())
    1258             : #else
    1259             :     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
    1260             :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
    1261             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
    1262             : #endif
    1263        7500 :     { return __lhs.base() - __rhs.base(); }
    1264             : 
    1265             :   template<typename _Iterator, typename _Container>
    1266             :     _GLIBCXX20_CONSTEXPR
    1267             :     inline typename __normal_iterator<_Iterator, _Container>::difference_type
    1268      749880 :     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
    1269             :               const __normal_iterator<_Iterator, _Container>& __rhs)
    1270             :     _GLIBCXX_NOEXCEPT
    1271      749880 :     { return __lhs.base() - __rhs.base(); }
    1272             : 
    1273             :   template<typename _Iterator, typename _Container>
    1274             :     _GLIBCXX20_CONSTEXPR
    1275             :     inline __normal_iterator<_Iterator, _Container>
    1276             :     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
    1277             :               __n, const __normal_iterator<_Iterator, _Container>& __i)
    1278             :     _GLIBCXX_NOEXCEPT
    1279             :     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
    1280             : 
    1281             : _GLIBCXX_END_NAMESPACE_VERSION
    1282             : } // namespace
    1283             : 
    1284             : namespace std _GLIBCXX_VISIBILITY(default)
    1285             : {
    1286             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
    1287             : 
    1288             :   template<typename _Iterator, typename _Container>
    1289             :     _GLIBCXX20_CONSTEXPR
    1290             :     _Iterator
    1291     3345909 :     __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
    1292             :     _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
    1293     3345909 :     { return __it.base(); }
    1294             : 
    1295             : #if __cplusplus >= 201103L
    1296             :   /**
    1297             :    * @addtogroup iterators
    1298             :    * @{
    1299             :    */
    1300             : 
    1301             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1302             :   template<semiregular _Sent>
    1303             :     class move_sentinel
    1304             :     {
    1305             :     public:
    1306             :       constexpr
    1307             :       move_sentinel()
    1308             :       noexcept(is_nothrow_default_constructible_v<_Sent>)
    1309             :       : _M_last() { }
    1310             : 
    1311             :       constexpr explicit
    1312             :       move_sentinel(_Sent __s)
    1313             :       noexcept(is_nothrow_move_constructible_v<_Sent>)
    1314             :       : _M_last(std::move(__s)) { }
    1315             : 
    1316             :       template<typename _S2> requires convertible_to<const _S2&, _Sent>
    1317             :         constexpr
    1318             :         move_sentinel(const move_sentinel<_S2>& __s)
    1319             :         noexcept(is_nothrow_constructible_v<_Sent, const _S2&>)
    1320             :         : _M_last(__s.base())
    1321             :         { }
    1322             : 
    1323             :       template<typename _S2> requires assignable_from<_Sent&, const _S2&>
    1324             :         constexpr move_sentinel&
    1325             :         operator=(const move_sentinel<_S2>& __s)
    1326             :         noexcept(is_nothrow_assignable_v<_Sent, const _S2&>)
    1327             :         {
    1328             :           _M_last = __s.base();
    1329             :           return *this;
    1330             :         }
    1331             : 
    1332             :       constexpr _Sent
    1333             :       base() const
    1334             :       noexcept(is_nothrow_copy_constructible_v<_Sent>)
    1335             :       { return _M_last; }
    1336             : 
    1337             :     private:
    1338             :       _Sent _M_last;
    1339             :     };
    1340             : #endif // C++20
    1341             : 
    1342             :   namespace __detail
    1343             :   {
    1344             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1345             :     template<typename _Iterator>
    1346             :       struct __move_iter_cat
    1347             :       { };
    1348             : 
    1349             :     template<typename _Iterator>
    1350             :       requires requires { typename iterator_traits<_Iterator>::iterator_category; }
    1351             :       struct __move_iter_cat<_Iterator>
    1352             :       {
    1353             :         using iterator_category
    1354             :           = __clamp_iter_cat<typename iterator_traits<_Iterator>::iterator_category,
    1355             :                              random_access_iterator_tag>;
    1356             :       };
    1357             : #endif
    1358             :   }
    1359             : 
    1360             :   // 24.4.3  Move iterators
    1361             :   /**
    1362             :    *  Class template move_iterator is an iterator adapter with the same
    1363             :    *  behavior as the underlying iterator except that its dereference
    1364             :    *  operator implicitly converts the value returned by the underlying
    1365             :    *  iterator's dereference operator to an rvalue reference.  Some
    1366             :    *  generic algorithms can be called with move iterators to replace
    1367             :    *  copying with moving.
    1368             :    */
    1369             :   template<typename _Iterator>
    1370             :     class move_iterator
    1371             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1372             :       : public __detail::__move_iter_cat<_Iterator>
    1373             : #endif
    1374             :     {
    1375             :       _Iterator _M_current;
    1376             : 
    1377             :       using __traits_type = iterator_traits<_Iterator>;
    1378             : #if ! (__cplusplus > 201703L && __cpp_lib_concepts)
    1379             :       using __base_ref = typename __traits_type::reference;
    1380             : #endif
    1381             : 
    1382             :       template<typename _Iter2>
    1383             :         friend class move_iterator;
    1384             : 
    1385             : #if __cpp_lib_concepts
    1386             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1387             :       // 3435. three_way_comparable_with<reverse_iterator<int*>, [...]>
    1388             :       template<typename _Iter2>
    1389             :         static constexpr bool __convertible = !is_same_v<_Iter2, _Iterator>
    1390             :             && convertible_to<const _Iter2&, _Iterator>;
    1391             : #endif
    1392             : 
    1393             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1394             :       static auto
    1395             :       _S_iter_concept()
    1396             :       {
    1397             :         if constexpr (random_access_iterator<_Iterator>)
    1398             :           return random_access_iterator_tag{};
    1399             :         else if constexpr (bidirectional_iterator<_Iterator>)
    1400             :           return bidirectional_iterator_tag{};
    1401             :         else if constexpr (forward_iterator<_Iterator>)
    1402             :           return forward_iterator_tag{};
    1403             :         else
    1404             :           return input_iterator_tag{};
    1405             :       }
    1406             : #endif
    1407             : 
    1408             :     public:
    1409             :       using iterator_type = _Iterator;
    1410             : 
    1411             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1412             :       // This is P2520R0, a C++23 change, but we treat it as a DR against C++20.
    1413             : # define __cpp_lib_move_iterator_concept 202207L
    1414             :       using iterator_concept = decltype(_S_iter_concept());
    1415             : 
    1416             :       // iterator_category defined in __move_iter_cat
    1417             :       using value_type = iter_value_t<_Iterator>;
    1418             :       using difference_type = iter_difference_t<_Iterator>;
    1419             :       using pointer = _Iterator;
    1420             :       using reference = iter_rvalue_reference_t<_Iterator>;
    1421             : #else
    1422             :       typedef typename __traits_type::iterator_category iterator_category;
    1423             :       typedef typename __traits_type::value_type        value_type;
    1424             :       typedef typename __traits_type::difference_type   difference_type;
    1425             :       // NB: DR 680.
    1426             :       typedef _Iterator                                 pointer;
    1427             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1428             :       // 2106. move_iterator wrapping iterators returning prvalues
    1429             :       typedef typename conditional<is_reference<__base_ref>::value,
    1430             :                          typename remove_reference<__base_ref>::type&&,
    1431             :                          __base_ref>::type           reference;
    1432             : #endif
    1433             : 
    1434             :       _GLIBCXX17_CONSTEXPR
    1435             :       move_iterator()
    1436             :       : _M_current() { }
    1437             : 
    1438             :       explicit _GLIBCXX17_CONSTEXPR
    1439       55616 :       move_iterator(iterator_type __i)
    1440       55616 :       : _M_current(std::move(__i)) { }
    1441             : 
    1442             :       template<typename _Iter>
    1443             : #if __cpp_lib_concepts
    1444             :         requires __convertible<_Iter>
    1445             : #endif
    1446             :         _GLIBCXX17_CONSTEXPR
    1447             :         move_iterator(const move_iterator<_Iter>& __i)
    1448             :         : _M_current(__i._M_current) { }
    1449             : 
    1450             :       template<typename _Iter>
    1451             : #if __cpp_lib_concepts
    1452             :         requires __convertible<_Iter>
    1453             :           && assignable_from<_Iterator&, const _Iter&>
    1454             : #endif
    1455             :         _GLIBCXX17_CONSTEXPR
    1456             :         move_iterator& operator=(const move_iterator<_Iter>& __i)
    1457             :         {
    1458             :           _M_current = __i._M_current;
    1459             :           return *this;
    1460             :         }
    1461             : 
    1462             : #if __cplusplus <= 201703L
    1463             :       _GLIBCXX17_CONSTEXPR iterator_type
    1464       94434 :       base() const
    1465       94434 :       { return _M_current; }
    1466             : #else
    1467             :       constexpr const iterator_type&
    1468             :       base() const & noexcept
    1469             :       { return _M_current; }
    1470             : 
    1471             :       constexpr iterator_type
    1472             :       base() &&
    1473             :       { return std::move(_M_current); }
    1474             : #endif
    1475             : 
    1476             :       _GLIBCXX17_CONSTEXPR reference
    1477       19409 :       operator*() const
    1478             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1479             :       { return ranges::iter_move(_M_current); }
    1480             : #else
    1481       19409 :       { return static_cast<reference>(*_M_current); }
    1482             : #endif
    1483             : 
    1484             :       _GLIBCXX17_CONSTEXPR pointer
    1485             :       operator->() const
    1486             :       { return _M_current; }
    1487             : 
    1488             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1489       19409 :       operator++()
    1490             :       {
    1491       19409 :         ++_M_current;
    1492       19409 :         return *this;
    1493             :       }
    1494             : 
    1495             :       _GLIBCXX17_CONSTEXPR move_iterator
    1496             :       operator++(int)
    1497             :       {
    1498             :         move_iterator __tmp = *this;
    1499             :         ++_M_current;
    1500             :         return __tmp;
    1501             :       }
    1502             : 
    1503             : #if __cpp_lib_concepts
    1504             :       constexpr void
    1505             :       operator++(int) requires (!forward_iterator<_Iterator>)
    1506             :       { ++_M_current; }
    1507             : #endif
    1508             : 
    1509             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1510             :       operator--()
    1511             :       {
    1512             :         --_M_current;
    1513             :         return *this;
    1514             :       }
    1515             : 
    1516             :       _GLIBCXX17_CONSTEXPR move_iterator
    1517             :       operator--(int)
    1518             :       {
    1519             :         move_iterator __tmp = *this;
    1520             :         --_M_current;
    1521             :         return __tmp;
    1522             :       }
    1523             : 
    1524             :       _GLIBCXX17_CONSTEXPR move_iterator
    1525             :       operator+(difference_type __n) const
    1526             :       { return move_iterator(_M_current + __n); }
    1527             : 
    1528             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1529             :       operator+=(difference_type __n)
    1530             :       {
    1531             :         _M_current += __n;
    1532             :         return *this;
    1533             :       }
    1534             : 
    1535             :       _GLIBCXX17_CONSTEXPR move_iterator
    1536             :       operator-(difference_type __n) const
    1537             :       { return move_iterator(_M_current - __n); }
    1538             :     
    1539             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1540             :       operator-=(difference_type __n)
    1541             :       { 
    1542             :         _M_current -= __n;
    1543             :         return *this;
    1544             :       }
    1545             : 
    1546             :       _GLIBCXX17_CONSTEXPR reference
    1547             :       operator[](difference_type __n) const
    1548             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1549             :       { return ranges::iter_move(_M_current + __n); }
    1550             : #else
    1551             :       { return std::move(_M_current[__n]); }
    1552             : #endif
    1553             : 
    1554             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1555             :       template<sentinel_for<_Iterator> _Sent>
    1556             :         friend constexpr bool
    1557             :         operator==(const move_iterator& __x, const move_sentinel<_Sent>& __y)
    1558             :         { return __x.base() == __y.base(); }
    1559             : 
    1560             :       template<sized_sentinel_for<_Iterator> _Sent>
    1561             :         friend constexpr iter_difference_t<_Iterator>
    1562             :         operator-(const move_sentinel<_Sent>& __x, const move_iterator& __y)
    1563             :         { return __x.base() - __y.base(); }
    1564             : 
    1565             :       template<sized_sentinel_for<_Iterator> _Sent>
    1566             :         friend constexpr iter_difference_t<_Iterator>
    1567             :         operator-(const move_iterator& __x, const move_sentinel<_Sent>& __y)
    1568             :         { return __x.base() - __y.base(); }
    1569             : 
    1570             :       friend constexpr iter_rvalue_reference_t<_Iterator>
    1571             :       iter_move(const move_iterator& __i)
    1572             :       noexcept(noexcept(ranges::iter_move(__i._M_current)))
    1573             :       { return ranges::iter_move(__i._M_current); }
    1574             : 
    1575             :       template<indirectly_swappable<_Iterator> _Iter2>
    1576             :         friend constexpr void
    1577             :         iter_swap(const move_iterator& __x, const move_iterator<_Iter2>& __y)
    1578             :         noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
    1579             :         { return ranges::iter_swap(__x._M_current, __y._M_current); }
    1580             : #endif // C++20
    1581             :     };
    1582             : 
    1583             :   template<typename _IteratorL, typename _IteratorR>
    1584             :     inline _GLIBCXX17_CONSTEXPR bool
    1585             :     operator==(const move_iterator<_IteratorL>& __x,
    1586             :                const move_iterator<_IteratorR>& __y)
    1587             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1588             :     requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
    1589             : #endif
    1590             :     { return __x.base() == __y.base(); }
    1591             : 
    1592             : #if __cpp_lib_three_way_comparison
    1593             :   template<typename _IteratorL,
    1594             :            three_way_comparable_with<_IteratorL> _IteratorR>
    1595             :     constexpr compare_three_way_result_t<_IteratorL, _IteratorR>
    1596             :     operator<=>(const move_iterator<_IteratorL>& __x,
    1597             :                 const move_iterator<_IteratorR>& __y)
    1598             :     { return __x.base() <=> __y.base(); }
    1599             : #else
    1600             :   template<typename _IteratorL, typename _IteratorR>
    1601             :     inline _GLIBCXX17_CONSTEXPR bool
    1602             :     operator!=(const move_iterator<_IteratorL>& __x,
    1603             :                const move_iterator<_IteratorR>& __y)
    1604             :     { return !(__x == __y); }
    1605             : #endif
    1606             : 
    1607             :   template<typename _IteratorL, typename _IteratorR>
    1608             :     inline _GLIBCXX17_CONSTEXPR bool
    1609             :     operator<(const move_iterator<_IteratorL>& __x,
    1610             :               const move_iterator<_IteratorR>& __y)
    1611             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1612             :     requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
    1613             : #endif
    1614             :     { return __x.base() < __y.base(); }
    1615             : 
    1616             :   template<typename _IteratorL, typename _IteratorR>
    1617             :     inline _GLIBCXX17_CONSTEXPR bool
    1618             :     operator<=(const move_iterator<_IteratorL>& __x,
    1619             :                const move_iterator<_IteratorR>& __y)
    1620             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1621             :     requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
    1622             : #endif
    1623             :     { return !(__y < __x); }
    1624             : 
    1625             :   template<typename _IteratorL, typename _IteratorR>
    1626             :     inline _GLIBCXX17_CONSTEXPR bool
    1627             :     operator>(const move_iterator<_IteratorL>& __x,
    1628             :               const move_iterator<_IteratorR>& __y)
    1629             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1630             :     requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
    1631             : #endif
    1632             :     { return __y < __x; }
    1633             : 
    1634             :   template<typename _IteratorL, typename _IteratorR>
    1635             :     inline _GLIBCXX17_CONSTEXPR bool
    1636             :     operator>=(const move_iterator<_IteratorL>& __x,
    1637             :                const move_iterator<_IteratorR>& __y)
    1638             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1639             :     requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
    1640             : #endif
    1641             :     { return !(__x < __y); }
    1642             : 
    1643             :   // Note: See __normal_iterator operators note from Gaby to understand
    1644             :   // why we have these extra overloads for some move_iterator operators.
    1645             : 
    1646             :   template<typename _Iterator>
    1647             :     inline _GLIBCXX17_CONSTEXPR bool
    1648       43769 :     operator==(const move_iterator<_Iterator>& __x,
    1649             :                const move_iterator<_Iterator>& __y)
    1650       43769 :     { return __x.base() == __y.base(); }
    1651             : 
    1652             : #if __cpp_lib_three_way_comparison
    1653             :   template<three_way_comparable _Iterator>
    1654             :     constexpr compare_three_way_result_t<_Iterator>
    1655             :     operator<=>(const move_iterator<_Iterator>& __x,
    1656             :                 const move_iterator<_Iterator>& __y)
    1657             :     { return __x.base() <=> __y.base(); }
    1658             : #else
    1659             :   template<typename _Iterator>
    1660             :     inline _GLIBCXX17_CONSTEXPR bool
    1661       43769 :     operator!=(const move_iterator<_Iterator>& __x,
    1662             :                const move_iterator<_Iterator>& __y)
    1663       43769 :     { return !(__x == __y); }
    1664             : 
    1665             :   template<typename _Iterator>
    1666             :     inline _GLIBCXX17_CONSTEXPR bool
    1667             :     operator<(const move_iterator<_Iterator>& __x,
    1668             :               const move_iterator<_Iterator>& __y)
    1669             :     { return __x.base() < __y.base(); }
    1670             : 
    1671             :   template<typename _Iterator>
    1672             :     inline _GLIBCXX17_CONSTEXPR bool
    1673             :     operator<=(const move_iterator<_Iterator>& __x,
    1674             :                const move_iterator<_Iterator>& __y)
    1675             :     { return !(__y < __x); }
    1676             : 
    1677             :   template<typename _Iterator>
    1678             :     inline _GLIBCXX17_CONSTEXPR bool
    1679             :     operator>(const move_iterator<_Iterator>& __x,
    1680             :               const move_iterator<_Iterator>& __y)
    1681             :     { return __y < __x; }
    1682             : 
    1683             :   template<typename _Iterator>
    1684             :     inline _GLIBCXX17_CONSTEXPR bool
    1685             :     operator>=(const move_iterator<_Iterator>& __x,
    1686             :                const move_iterator<_Iterator>& __y)
    1687             :     { return !(__x < __y); }
    1688             : #endif // ! C++20
    1689             : 
    1690             :   // DR 685.
    1691             :   template<typename _IteratorL, typename _IteratorR>
    1692             :     inline _GLIBCXX17_CONSTEXPR auto
    1693           0 :     operator-(const move_iterator<_IteratorL>& __x,
    1694             :               const move_iterator<_IteratorR>& __y)
    1695             :     -> decltype(__x.base() - __y.base())
    1696           0 :     { return __x.base() - __y.base(); }
    1697             : 
    1698             :   template<typename _Iterator>
    1699             :     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
    1700             :     operator+(typename move_iterator<_Iterator>::difference_type __n,
    1701             :               const move_iterator<_Iterator>& __x)
    1702             :     { return __x + __n; }
    1703             : 
    1704             :   template<typename _Iterator>
    1705             :     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
    1706       18018 :     make_move_iterator(_Iterator __i)
    1707       18018 :     { return move_iterator<_Iterator>(std::move(__i)); }
    1708             : 
    1709             :   template<typename _Iterator, typename _ReturnType
    1710             :     = typename conditional<__move_if_noexcept_cond
    1711             :       <typename iterator_traits<_Iterator>::value_type>::value,
    1712             :                 _Iterator, move_iterator<_Iterator>>::type>
    1713             :     inline _GLIBCXX17_CONSTEXPR _ReturnType
    1714           0 :     __make_move_if_noexcept_iterator(_Iterator __i)
    1715           0 :     { return _ReturnType(__i); }
    1716             : 
    1717             :   // Overload for pointers that matches std::move_if_noexcept more closely,
    1718             :   // returning a constant iterator when we don't want to move.
    1719             :   template<typename _Tp, typename _ReturnType
    1720             :     = typename conditional<__move_if_noexcept_cond<_Tp>::value,
    1721             :                            const _Tp*, move_iterator<_Tp*>>::type>
    1722             :     inline _GLIBCXX17_CONSTEXPR _ReturnType
    1723       37834 :     __make_move_if_noexcept_iterator(_Tp* __i)
    1724       37834 :     { return _ReturnType(__i); }
    1725             : 
    1726             : #if __cplusplus > 201703L && __cpp_lib_concepts
    1727             :   // [iterators.common] Common iterators
    1728             : 
    1729             :   namespace __detail
    1730             :   {
    1731             :     template<typename _It>
    1732             :       concept __common_iter_has_arrow = indirectly_readable<const _It>
    1733             :         && (requires(const _It& __it) { __it.operator->(); }
    1734             :             || is_reference_v<iter_reference_t<_It>>
    1735             :             || constructible_from<iter_value_t<_It>, iter_reference_t<_It>>);
    1736             : 
    1737             :     template<typename _It>
    1738             :       concept __common_iter_use_postfix_proxy
    1739             :         = (!requires (_It& __i) { { *__i++ } -> __can_reference; })
    1740             :           && constructible_from<iter_value_t<_It>, iter_reference_t<_It>>
    1741             :           && move_constructible<iter_value_t<_It>>;
    1742             :   } // namespace __detail
    1743             : 
    1744             :   /// An iterator/sentinel adaptor for representing a non-common range.
    1745             :   template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
    1746             :     requires (!same_as<_It, _Sent>) && copyable<_It>
    1747             :   class common_iterator
    1748             :   {
    1749             :     template<typename _Tp, typename _Up>
    1750             :       static constexpr bool
    1751             :       _S_noexcept1()
    1752             :       {
    1753             :         if constexpr (is_trivially_default_constructible_v<_Tp>)
    1754             :           return is_nothrow_assignable_v<_Tp&, _Up>;
    1755             :         else
    1756             :           return is_nothrow_constructible_v<_Tp, _Up>;
    1757             :       }
    1758             : 
    1759             :     template<typename _It2, typename _Sent2>
    1760             :       static constexpr bool
    1761             :       _S_noexcept()
    1762             :       { return _S_noexcept1<_It, _It2>() && _S_noexcept1<_Sent, _Sent2>(); }
    1763             : 
    1764             :     class __arrow_proxy
    1765             :     {
    1766             :       iter_value_t<_It> _M_keep;
    1767             : 
    1768             :       constexpr
    1769             :       __arrow_proxy(iter_reference_t<_It>&& __x)
    1770             :       : _M_keep(std::move(__x)) { }
    1771             : 
    1772             :       friend class common_iterator;
    1773             : 
    1774             :     public:
    1775             :       constexpr const iter_value_t<_It>*
    1776             :       operator->() const noexcept
    1777             :       { return std::__addressof(_M_keep); }
    1778             :     };
    1779             : 
    1780             :     class __postfix_proxy
    1781             :     {
    1782             :       iter_value_t<_It> _M_keep;
    1783             : 
    1784             :       constexpr
    1785             :       __postfix_proxy(iter_reference_t<_It>&& __x)
    1786             :       : _M_keep(std::forward<iter_reference_t<_It>>(__x)) { }
    1787             : 
    1788             :       friend class common_iterator;
    1789             : 
    1790             :     public:
    1791             :       constexpr const iter_value_t<_It>&
    1792             :       operator*() const noexcept
    1793             :       { return _M_keep; }
    1794             :     };
    1795             : 
    1796             :   public:
    1797             :     constexpr
    1798             :     common_iterator()
    1799             :     noexcept(is_nothrow_default_constructible_v<_It>)
    1800             :     requires default_initializable<_It>
    1801             :     : _M_it(), _M_index(0)
    1802             :     { }
    1803             : 
    1804             :     constexpr
    1805             :     common_iterator(_It __i)
    1806             :     noexcept(is_nothrow_move_constructible_v<_It>)
    1807             :     : _M_it(std::move(__i)), _M_index(0)
    1808             :     { }
    1809             : 
    1810             :     constexpr
    1811             :     common_iterator(_Sent __s)
    1812             :     noexcept(is_nothrow_move_constructible_v<_Sent>)
    1813             :     : _M_sent(std::move(__s)), _M_index(1)
    1814             :     { }
    1815             : 
    1816             :     template<typename _It2, typename _Sent2>
    1817             :       requires convertible_to<const _It2&, _It>
    1818             :         && convertible_to<const _Sent2&, _Sent>
    1819             :       constexpr
    1820             :       common_iterator(const common_iterator<_It2, _Sent2>& __x)
    1821             :       noexcept(_S_noexcept<const _It2&, const _Sent2&>())
    1822             :       : _M_valueless(), _M_index(__x._M_index)
    1823             :       {
    1824             :         __glibcxx_assert(__x._M_has_value());
    1825             :         if (_M_index == 0)
    1826             :           {
    1827             :             if constexpr (is_trivially_default_constructible_v<_It>)
    1828             :               _M_it = std::move(__x._M_it);
    1829             :             else
    1830             :               std::construct_at(std::__addressof(_M_it), __x._M_it);
    1831             :           }
    1832             :         else if (_M_index == 1)
    1833             :           {
    1834             :             if constexpr (is_trivially_default_constructible_v<_Sent>)
    1835             :               _M_sent = std::move(__x._M_sent);
    1836             :             else
    1837             :               std::construct_at(std::__addressof(_M_sent), __x._M_sent);
    1838             :           }
    1839             :       }
    1840             : 
    1841             :     constexpr
    1842             :     common_iterator(const common_iterator& __x)
    1843             :     noexcept(_S_noexcept<const _It&, const _Sent&>())
    1844             :     : _M_valueless(), _M_index(__x._M_index)
    1845             :     {
    1846             :       if (_M_index == 0)
    1847             :         {
    1848             :           if constexpr (is_trivially_default_constructible_v<_It>)
    1849             :             _M_it = __x._M_it;
    1850             :           else
    1851             :             std::construct_at(std::__addressof(_M_it), __x._M_it);
    1852             :         }
    1853             :       else if (_M_index == 1)
    1854             :         {
    1855             :           if constexpr (is_trivially_default_constructible_v<_Sent>)
    1856             :             _M_sent = __x._M_sent;
    1857             :           else
    1858             :             std::construct_at(std::__addressof(_M_sent), __x._M_sent);
    1859             :         }
    1860             :     }
    1861             : 
    1862             :     constexpr
    1863             :     common_iterator(common_iterator&& __x)
    1864             :     noexcept(_S_noexcept<_It, _Sent>())
    1865             :     : _M_valueless(), _M_index(__x._M_index)
    1866             :     {
    1867             :       if (_M_index == 0)
    1868             :         {
    1869             :           if constexpr (is_trivially_default_constructible_v<_It>)
    1870             :             _M_it = std::move(__x._M_it);
    1871             :           else
    1872             :             std::construct_at(std::__addressof(_M_it), std::move(__x._M_it));
    1873             :         }
    1874             :       else if (_M_index == 1)
    1875             :         {
    1876             :           if constexpr (is_trivially_default_constructible_v<_Sent>)
    1877             :             _M_sent = std::move(__x._M_sent);
    1878             :           else
    1879             :             std::construct_at(std::__addressof(_M_sent),
    1880             :                               std::move(__x._M_sent));
    1881             :         }
    1882             :     }
    1883             : 
    1884             :     constexpr common_iterator&
    1885             :     operator=(const common_iterator&) = default;
    1886             : 
    1887             :     constexpr common_iterator&
    1888             :     operator=(const common_iterator& __x)
    1889             :     noexcept(is_nothrow_copy_assignable_v<_It>
    1890             :              && is_nothrow_copy_assignable_v<_Sent>
    1891             :              && is_nothrow_copy_constructible_v<_It>
    1892             :              && is_nothrow_copy_constructible_v<_Sent>)
    1893             :     requires (!is_trivially_copy_assignable_v<_It>
    1894             :                 || !is_trivially_copy_assignable_v<_Sent>)
    1895             :     {
    1896             :       _M_assign(__x);
    1897             :       return *this;
    1898             :     }
    1899             : 
    1900             :     constexpr common_iterator&
    1901             :     operator=(common_iterator&&) = default;
    1902             : 
    1903             :     constexpr common_iterator&
    1904             :     operator=(common_iterator&& __x)
    1905             :     noexcept(is_nothrow_move_assignable_v<_It>
    1906             :              && is_nothrow_move_assignable_v<_Sent>
    1907             :              && is_nothrow_move_constructible_v<_It>
    1908             :              && is_nothrow_move_constructible_v<_Sent>)
    1909             :     requires (!is_trivially_move_assignable_v<_It>
    1910             :                 || !is_trivially_move_assignable_v<_Sent>)
    1911             :     {
    1912             :       _M_assign(std::move(__x));
    1913             :       return *this;
    1914             :     }
    1915             : 
    1916             :     template<typename _It2, typename _Sent2>
    1917             :       requires convertible_to<const _It2&, _It>
    1918             :         && convertible_to<const _Sent2&, _Sent>
    1919             :         && assignable_from<_It&, const _It2&>
    1920             :         && assignable_from<_Sent&, const _Sent2&>
    1921             :       constexpr common_iterator&
    1922             :       operator=(const common_iterator<_It2, _Sent2>& __x)
    1923             :       noexcept(is_nothrow_constructible_v<_It, const _It2&>
    1924             :                && is_nothrow_constructible_v<_Sent, const _Sent2&>
    1925             :                && is_nothrow_assignable_v<_It&, const _It2&>
    1926             :                && is_nothrow_assignable_v<_Sent&, const _Sent2&>)
    1927             :       {
    1928             :         __glibcxx_assert(__x._M_has_value());
    1929             :         _M_assign(__x);
    1930             :         return *this;
    1931             :       }
    1932             : 
    1933             :     constexpr
    1934             :     ~common_iterator()
    1935             :     {
    1936             :       if (_M_index == 0)
    1937             :         _M_it.~_It();
    1938             :       else if (_M_index == 1)
    1939             :         _M_sent.~_Sent();
    1940             :     }
    1941             : 
    1942             :     [[nodiscard]]
    1943             :     constexpr decltype(auto)
    1944             :     operator*()
    1945             :     {
    1946             :       __glibcxx_assert(_M_index == 0);
    1947             :       return *_M_it;
    1948             :     }
    1949             : 
    1950             :     [[nodiscard]]
    1951             :     constexpr decltype(auto)
    1952             :     operator*() const requires __detail::__dereferenceable<const _It>
    1953             :     {
    1954             :       __glibcxx_assert(_M_index == 0);
    1955             :       return *_M_it;
    1956             :     }
    1957             : 
    1958             :     [[nodiscard]]
    1959             :     constexpr auto
    1960             :     operator->() const requires __detail::__common_iter_has_arrow<_It>
    1961             :     {
    1962             :       __glibcxx_assert(_M_index == 0);
    1963             :       if constexpr (is_pointer_v<_It> || requires { _M_it.operator->(); })
    1964             :         return _M_it;
    1965             :       else if constexpr (is_reference_v<iter_reference_t<_It>>)
    1966             :         {
    1967             :           auto&& __tmp = *_M_it;
    1968             :           return std::__addressof(__tmp);
    1969             :         }
    1970             :       else
    1971             :         return __arrow_proxy{*_M_it};
    1972             :     }
    1973             : 
    1974             :     constexpr common_iterator&
    1975             :     operator++()
    1976             :     {
    1977             :       __glibcxx_assert(_M_index == 0);
    1978             :       ++_M_it;
    1979             :       return *this;
    1980             :     }
    1981             : 
    1982             :     constexpr decltype(auto)
    1983             :     operator++(int)
    1984             :     {
    1985             :       __glibcxx_assert(_M_index == 0);
    1986             :       if constexpr (forward_iterator<_It>)
    1987             :         {
    1988             :           common_iterator __tmp = *this;
    1989             :           ++*this;
    1990             :           return __tmp;
    1991             :         }
    1992             :       else if constexpr (!__detail::__common_iter_use_postfix_proxy<_It>)
    1993             :         return _M_it++;
    1994             :       else
    1995             :         {
    1996             :           __postfix_proxy __p(**this);
    1997             :           ++*this;
    1998             :           return __p;
    1999             :         }
    2000             :     }
    2001             : 
    2002             :     template<typename _It2, sentinel_for<_It> _Sent2>
    2003             :       requires sentinel_for<_Sent, _It2>
    2004             :       friend constexpr bool
    2005             :       operator== [[nodiscard]] (const common_iterator& __x,
    2006             :                                 const common_iterator<_It2, _Sent2>& __y)
    2007             :       {
    2008             :         switch(__x._M_index << 2 | __y._M_index)
    2009             :           {
    2010             :           case 0b0000:
    2011             :           case 0b0101:
    2012             :             return true;
    2013             :           case 0b0001:
    2014             :             return __x._M_it == __y._M_sent;
    2015             :           case 0b0100:
    2016             :             return __x._M_sent == __y._M_it;
    2017             :           default:
    2018             :             __glibcxx_assert(__x._M_has_value());
    2019             :             __glibcxx_assert(__y._M_has_value());
    2020             :             __builtin_unreachable();
    2021             :           }
    2022             :       }
    2023             : 
    2024             :     template<typename _It2, sentinel_for<_It> _Sent2>
    2025             :       requires sentinel_for<_Sent, _It2> && equality_comparable_with<_It, _It2>
    2026             :       friend constexpr bool
    2027             :       operator== [[nodiscard]] (const common_iterator& __x,
    2028             :                                 const common_iterator<_It2, _Sent2>& __y)
    2029             :       {
    2030             :         switch(__x._M_index << 2 | __y._M_index)
    2031             :           {
    2032             :           case 0b0101:
    2033             :             return true;
    2034             :           case 0b0000:
    2035             :             return __x._M_it == __y._M_it;
    2036             :           case 0b0001:
    2037             :             return __x._M_it == __y._M_sent;
    2038             :           case 0b0100:
    2039             :             return __x._M_sent == __y._M_it;
    2040             :           default:
    2041             :             __glibcxx_assert(__x._M_has_value());
    2042             :             __glibcxx_assert(__y._M_has_value());
    2043             :             __builtin_unreachable();
    2044             :           }
    2045             :       }
    2046             : 
    2047             :     template<sized_sentinel_for<_It> _It2, sized_sentinel_for<_It> _Sent2>
    2048             :       requires sized_sentinel_for<_Sent, _It2>
    2049             :       friend constexpr iter_difference_t<_It2>
    2050             :       operator- [[nodiscard]] (const common_iterator& __x,
    2051             :                                const common_iterator<_It2, _Sent2>& __y)
    2052             :       {
    2053             :         switch(__x._M_index << 2 | __y._M_index)
    2054             :           {
    2055             :           case 0b0101:
    2056             :             return 0;
    2057             :           case 0b0000:
    2058             :             return __x._M_it - __y._M_it;
    2059             :           case 0b0001:
    2060             :             return __x._M_it - __y._M_sent;
    2061             :           case 0b0100:
    2062             :             return __x._M_sent - __y._M_it;
    2063             :           default:
    2064             :             __glibcxx_assert(__x._M_has_value());
    2065             :             __glibcxx_assert(__y._M_has_value());
    2066             :             __builtin_unreachable();
    2067             :           }
    2068             :       }
    2069             : 
    2070             :     [[nodiscard]]
    2071             :     friend constexpr iter_rvalue_reference_t<_It>
    2072             :     iter_move(const common_iterator& __i)
    2073             :     noexcept(noexcept(ranges::iter_move(std::declval<const _It&>())))
    2074             :     requires input_iterator<_It>
    2075             :     {
    2076             :       __glibcxx_assert(__i._M_index == 0);
    2077             :       return ranges::iter_move(__i._M_it);
    2078             :     }
    2079             : 
    2080             :     template<indirectly_swappable<_It> _It2, typename _Sent2>
    2081             :       friend constexpr void
    2082             :       iter_swap(const common_iterator& __x,
    2083             :                 const common_iterator<_It2, _Sent2>& __y)
    2084             :       noexcept(noexcept(ranges::iter_swap(std::declval<const _It&>(),
    2085             :                                           std::declval<const _It2&>())))
    2086             :       {
    2087             :         __glibcxx_assert(__x._M_index == 0);
    2088             :         __glibcxx_assert(__y._M_index == 0);
    2089             :         return ranges::iter_swap(__x._M_it, __y._M_it);
    2090             :       }
    2091             : 
    2092             :   private:
    2093             :     template<input_or_output_iterator _It2, sentinel_for<_It2> _Sent2>
    2094             :       requires (!same_as<_It2, _Sent2>) && copyable<_It2>
    2095             :       friend class common_iterator;
    2096             : 
    2097             :     constexpr bool
    2098             :     _M_has_value() const noexcept { return _M_index != _S_valueless; }
    2099             : 
    2100             :     template<typename _CIt>
    2101             :       constexpr void
    2102             :       _M_assign(_CIt&& __x)
    2103             :       {
    2104             :         if (_M_index == __x._M_index)
    2105             :           {
    2106             :             if (_M_index == 0)
    2107             :               _M_it = std::forward<_CIt>(__x)._M_it;
    2108             :             else if (_M_index == 1)
    2109             :               _M_sent = std::forward<_CIt>(__x)._M_sent;
    2110             :           }
    2111             :         else
    2112             :           {
    2113             :             if (_M_index == 0)
    2114             :               _M_it.~_It();
    2115             :             else if (_M_index == 1)
    2116             :               _M_sent.~_Sent();
    2117             :             _M_index = _S_valueless;
    2118             : 
    2119             :             if (__x._M_index == 0)
    2120             :               std::construct_at(std::__addressof(_M_it),
    2121             :                                 std::forward<_CIt>(__x)._M_it);
    2122             :             else if (__x._M_index == 1)
    2123             :               std::construct_at(std::__addressof(_M_sent),
    2124             :                                 std::forward<_CIt>(__x)._M_sent);
    2125             :             _M_index = __x._M_index;
    2126             :           }
    2127             :       }
    2128             : 
    2129             :     union
    2130             :     {
    2131             :       _It _M_it;
    2132             :       _Sent _M_sent;
    2133             :       unsigned char _M_valueless;
    2134             :     };
    2135             :     unsigned char _M_index; // 0 == _M_it, 1 == _M_sent, 2 == valueless
    2136             : 
    2137             :     static constexpr unsigned char _S_valueless{2};
    2138             :   };
    2139             : 
    2140             :   template<typename _It, typename _Sent>
    2141             :     struct incrementable_traits<common_iterator<_It, _Sent>>
    2142             :     {
    2143             :       using difference_type = iter_difference_t<_It>;
    2144             :     };
    2145             : 
    2146             :   template<input_iterator _It, typename _Sent>
    2147             :     struct iterator_traits<common_iterator<_It, _Sent>>
    2148             :     {
    2149             :     private:
    2150             :       template<typename _Iter>
    2151             :         struct __ptr
    2152             :         {
    2153             :           using type = void;
    2154             :         };
    2155             : 
    2156             :       template<typename _Iter>
    2157             :         requires __detail::__common_iter_has_arrow<_Iter>
    2158             :         struct __ptr<_Iter>
    2159             :         {
    2160             :           using _CIter = common_iterator<_Iter, _Sent>;
    2161             :           using type = decltype(std::declval<const _CIter&>().operator->());
    2162             :         };
    2163             : 
    2164             :       static auto
    2165             :       _S_iter_cat()
    2166             :       {
    2167             :         using _Traits = iterator_traits<_It>;
    2168             :         if constexpr (requires { requires derived_from<typename _Traits::iterator_category,
    2169             :                                                        forward_iterator_tag>; })
    2170             :           return forward_iterator_tag{};
    2171             :         else
    2172             :           return input_iterator_tag{};
    2173             :       }
    2174             : 
    2175             :     public:
    2176             :       using iterator_concept = conditional_t<forward_iterator<_It>,
    2177             :             forward_iterator_tag, input_iterator_tag>;
    2178             :       using iterator_category = decltype(_S_iter_cat());
    2179             :       using value_type = iter_value_t<_It>;
    2180             :       using difference_type = iter_difference_t<_It>;
    2181             :       using pointer = typename __ptr<_It>::type;
    2182             :       using reference = iter_reference_t<_It>;
    2183             :     };
    2184             : 
    2185             :   // [iterators.counted] Counted iterators
    2186             : 
    2187             :   namespace __detail
    2188             :   {
    2189             :     template<typename _It>
    2190             :       struct __counted_iter_value_type
    2191             :       { };
    2192             : 
    2193             :     template<indirectly_readable _It>
    2194             :       struct __counted_iter_value_type<_It>
    2195             :       { using value_type = iter_value_t<_It>; };
    2196             : 
    2197             :     template<typename _It>
    2198             :       struct __counted_iter_concept
    2199             :       { };
    2200             : 
    2201             :     template<typename _It>
    2202             :       requires requires { typename _It::iterator_concept; }
    2203             :       struct __counted_iter_concept<_It>
    2204             :       { using iterator_concept = typename _It::iterator_concept; };
    2205             : 
    2206             :     template<typename _It>
    2207             :       struct __counted_iter_cat
    2208             :       { };
    2209             : 
    2210             :     template<typename _It>
    2211             :       requires requires { typename _It::iterator_category; }
    2212             :       struct __counted_iter_cat<_It>
    2213             :       { using iterator_category = typename _It::iterator_category; };
    2214             :   }
    2215             : 
    2216             :   /// An iterator adaptor that keeps track of the distance to the end.
    2217             :   template<input_or_output_iterator _It>
    2218             :     class counted_iterator
    2219             :       : public __detail::__counted_iter_value_type<_It>,
    2220             :         public __detail::__counted_iter_concept<_It>,
    2221             :         public __detail::__counted_iter_cat<_It>
    2222             :     {
    2223             :     public:
    2224             :       using iterator_type = _It;
    2225             :       // value_type defined in __counted_iter_value_type
    2226             :       using difference_type = iter_difference_t<_It>;
    2227             :       // iterator_concept defined in __counted_iter_concept
    2228             :       // iterator_category defined in __counted_iter_cat
    2229             : 
    2230             :       constexpr counted_iterator() requires default_initializable<_It> = default;
    2231             : 
    2232             :       constexpr
    2233             :       counted_iterator(_It __i, iter_difference_t<_It> __n)
    2234             :       : _M_current(std::move(__i)), _M_length(__n)
    2235             :       { __glibcxx_assert(__n >= 0); }
    2236             : 
    2237             :       template<typename _It2>
    2238             :         requires convertible_to<const _It2&, _It>
    2239             :         constexpr
    2240             :         counted_iterator(const counted_iterator<_It2>& __x)
    2241             :         : _M_current(__x._M_current), _M_length(__x._M_length)
    2242             :         { }
    2243             : 
    2244             :       template<typename _It2>
    2245             :         requires assignable_from<_It&, const _It2&>
    2246             :         constexpr counted_iterator&
    2247             :         operator=(const counted_iterator<_It2>& __x)
    2248             :         {
    2249             :           _M_current = __x._M_current;
    2250             :           _M_length = __x._M_length;
    2251             :           return *this;
    2252             :         }
    2253             : 
    2254             :       constexpr const _It&
    2255             :       base() const & noexcept
    2256             :       { return _M_current; }
    2257             : 
    2258             :       constexpr _It
    2259             :       base() &&
    2260             :       noexcept(is_nothrow_move_constructible_v<_It>)
    2261             :       { return std::move(_M_current); }
    2262             : 
    2263             :       constexpr iter_difference_t<_It>
    2264             :       count() const noexcept { return _M_length; }
    2265             : 
    2266             :       constexpr decltype(auto)
    2267             :       operator*()
    2268             :       noexcept(noexcept(*_M_current))
    2269             :       {
    2270             :         __glibcxx_assert( _M_length > 0 );
    2271             :         return *_M_current;
    2272             :       }
    2273             : 
    2274             :       constexpr decltype(auto)
    2275             :       operator*() const
    2276             :       noexcept(noexcept(*_M_current))
    2277             :       requires __detail::__dereferenceable<const _It>
    2278             :       {
    2279             :         __glibcxx_assert( _M_length > 0 );
    2280             :         return *_M_current;
    2281             :       }
    2282             : 
    2283             :       constexpr auto
    2284             :       operator->() const noexcept
    2285             :       requires contiguous_iterator<_It>
    2286             :       { return std::to_address(_M_current); }
    2287             : 
    2288             :       constexpr counted_iterator&
    2289             :       operator++()
    2290             :       {
    2291             :         __glibcxx_assert(_M_length > 0);
    2292             :         ++_M_current;
    2293             :         --_M_length;
    2294             :         return *this;
    2295             :       }
    2296             : 
    2297             :       constexpr decltype(auto)
    2298             :       operator++(int)
    2299             :       {
    2300             :         __glibcxx_assert(_M_length > 0);
    2301             :         --_M_length;
    2302             :         __try
    2303             :           {
    2304             :             return _M_current++;
    2305             :           } __catch(...) {
    2306             :             ++_M_length;
    2307             :             __throw_exception_again;
    2308             :           }
    2309             :       }
    2310             : 
    2311             :       constexpr counted_iterator
    2312             :       operator++(int) requires forward_iterator<_It>
    2313             :       {
    2314             :         auto __tmp = *this;
    2315             :         ++*this;
    2316             :         return __tmp;
    2317             :       }
    2318             : 
    2319             :       constexpr counted_iterator&
    2320             :       operator--() requires bidirectional_iterator<_It>
    2321             :       {
    2322             :         --_M_current;
    2323             :         ++_M_length;
    2324             :         return *this;
    2325             :       }
    2326             : 
    2327             :       constexpr counted_iterator
    2328             :       operator--(int) requires bidirectional_iterator<_It>
    2329             :       {
    2330             :         auto __tmp = *this;
    2331             :         --*this;
    2332             :         return __tmp;
    2333             :       }
    2334             : 
    2335             :       constexpr counted_iterator
    2336             :       operator+(iter_difference_t<_It> __n) const
    2337             :         requires random_access_iterator<_It>
    2338             :       { return counted_iterator(_M_current + __n, _M_length - __n); }
    2339             : 
    2340             :       friend constexpr counted_iterator
    2341             :       operator+(iter_difference_t<_It> __n, const counted_iterator& __x)
    2342             :       requires random_access_iterator<_It>
    2343             :       { return __x + __n; }
    2344             : 
    2345             :       constexpr counted_iterator&
    2346             :       operator+=(iter_difference_t<_It> __n)
    2347             :       requires random_access_iterator<_It>
    2348             :       {
    2349             :         __glibcxx_assert(__n <= _M_length);
    2350             :         _M_current += __n;
    2351             :         _M_length -= __n;
    2352             :         return *this;
    2353             :       }
    2354             : 
    2355             :       constexpr counted_iterator
    2356             :       operator-(iter_difference_t<_It> __n) const
    2357             :       requires random_access_iterator<_It>
    2358             :       { return counted_iterator(_M_current - __n, _M_length + __n); }
    2359             : 
    2360             :       template<common_with<_It> _It2>
    2361             :         friend constexpr iter_difference_t<_It2>
    2362             :         operator-(const counted_iterator& __x,
    2363             :                   const counted_iterator<_It2>& __y)
    2364             :         { return __y._M_length - __x._M_length; }
    2365             : 
    2366             :       friend constexpr iter_difference_t<_It>
    2367             :       operator-(const counted_iterator& __x, default_sentinel_t)
    2368             :       { return -__x._M_length; }
    2369             : 
    2370             :       friend constexpr iter_difference_t<_It>
    2371             :       operator-(default_sentinel_t, const counted_iterator& __y)
    2372             :       { return __y._M_length; }
    2373             : 
    2374             :       constexpr counted_iterator&
    2375             :       operator-=(iter_difference_t<_It> __n)
    2376             :       requires random_access_iterator<_It>
    2377             :       {
    2378             :         __glibcxx_assert(-__n <= _M_length);
    2379             :         _M_current -= __n;
    2380             :         _M_length += __n;
    2381             :         return *this;
    2382             :       }
    2383             : 
    2384             :       constexpr decltype(auto)
    2385             :       operator[](iter_difference_t<_It> __n) const
    2386             :       noexcept(noexcept(_M_current[__n]))
    2387             :       requires random_access_iterator<_It>
    2388             :       {
    2389             :         __glibcxx_assert(__n < _M_length);
    2390             :         return _M_current[__n];
    2391             :       }
    2392             : 
    2393             :       template<common_with<_It> _It2>
    2394             :         friend constexpr bool
    2395             :         operator==(const counted_iterator& __x,
    2396             :                    const counted_iterator<_It2>& __y)
    2397             :         { return __x._M_length == __y._M_length; }
    2398             : 
    2399             :       friend constexpr bool
    2400             :       operator==(const counted_iterator& __x, default_sentinel_t)
    2401             :       { return __x._M_length == 0; }
    2402             : 
    2403             :       template<common_with<_It> _It2>
    2404             :         friend constexpr strong_ordering
    2405             :         operator<=>(const counted_iterator& __x,
    2406             :                     const counted_iterator<_It2>& __y)
    2407             :         { return __y._M_length <=> __x._M_length; }
    2408             : 
    2409             :       friend constexpr iter_rvalue_reference_t<_It>
    2410             :       iter_move(const counted_iterator& __i)
    2411             :       noexcept(noexcept(ranges::iter_move(__i._M_current)))
    2412             :       requires input_iterator<_It>
    2413             :       {
    2414             :         __glibcxx_assert( __i._M_length > 0 );
    2415             :         return ranges::iter_move(__i._M_current);
    2416             :       }
    2417             : 
    2418             :       template<indirectly_swappable<_It> _It2>
    2419             :         friend constexpr void
    2420             :         iter_swap(const counted_iterator& __x,
    2421             :                   const counted_iterator<_It2>& __y)
    2422             :         noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
    2423             :         {
    2424             :           __glibcxx_assert( __x._M_length > 0 && __y._M_length > 0 );
    2425             :           ranges::iter_swap(__x._M_current, __y._M_current);
    2426             :         }
    2427             : 
    2428             :     private:
    2429             :       template<input_or_output_iterator _It2> friend class counted_iterator;
    2430             : 
    2431             :       _It _M_current = _It();
    2432             :       iter_difference_t<_It> _M_length = 0;
    2433             :     };
    2434             : 
    2435             :   template<input_iterator _It>
    2436             :     requires same_as<__detail::__iter_traits<_It>, iterator_traits<_It>>
    2437             :     struct iterator_traits<counted_iterator<_It>> : iterator_traits<_It>
    2438             :     {
    2439             :       using pointer = conditional_t<contiguous_iterator<_It>,
    2440             :                                     add_pointer_t<iter_reference_t<_It>>,
    2441             :                                     void>;
    2442             :     };
    2443             : #endif // C++20
    2444             : 
    2445             :   /// @} group iterators
    2446             : 
    2447             :   template<typename _Iterator>
    2448             :     _GLIBCXX20_CONSTEXPR
    2449             :     auto
    2450             :     __niter_base(move_iterator<_Iterator> __it)
    2451             :     -> decltype(make_move_iterator(__niter_base(__it.base())))
    2452             :     { return make_move_iterator(__niter_base(__it.base())); }
    2453             : 
    2454             :   template<typename _Iterator>
    2455             :     struct __is_move_iterator<move_iterator<_Iterator> >
    2456             :     {
    2457             :       enum { __value = 1 };
    2458             :       typedef __true_type __type;
    2459             :     };
    2460             : 
    2461             :   template<typename _Iterator>
    2462             :     _GLIBCXX20_CONSTEXPR
    2463             :     auto
    2464        6896 :     __miter_base(move_iterator<_Iterator> __it)
    2465             :     -> decltype(__miter_base(__it.base()))
    2466        6896 :     { return __miter_base(__it.base()); }
    2467             : 
    2468             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
    2469             : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
    2470             :   std::__make_move_if_noexcept_iterator(_Iter)
    2471             : #else
    2472             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
    2473             : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
    2474             : #endif // C++11
    2475             : 
    2476             : #if __cpp_deduction_guides >= 201606
    2477             :   // These helper traits are used for deduction guides
    2478             :   // of associative containers.
    2479             :   template<typename _InputIterator>
    2480             :     using __iter_key_t = remove_const_t<
    2481             :     typename iterator_traits<_InputIterator>::value_type::first_type>;
    2482             : 
    2483             :   template<typename _InputIterator>
    2484             :     using __iter_val_t =
    2485             :     typename iterator_traits<_InputIterator>::value_type::second_type;
    2486             : 
    2487             :   template<typename _T1, typename _T2>
    2488             :     struct pair;
    2489             : 
    2490             :   template<typename _InputIterator>
    2491             :     using __iter_to_alloc_t =
    2492             :     pair<add_const_t<__iter_key_t<_InputIterator>>,
    2493             :          __iter_val_t<_InputIterator>>;
    2494             : #endif // __cpp_deduction_guides
    2495             : 
    2496             : _GLIBCXX_END_NAMESPACE_VERSION
    2497             : } // namespace
    2498             : 
    2499             : #ifdef _GLIBCXX_DEBUG
    2500             : # include <debug/stl_iterator.h>
    2501             : #endif
    2502             : 
    2503             : #endif

Generated by: LCOV version 1.14