LCOV - code coverage report
Current view: top level - usr/include/c++/10/bits - stl_iterator.h (source / functions) Hit Total Coverage
Test: GNU roff Lines: 21 42 50.0 %
Date: 2026-01-16 17:51:41 Functions: 19 46 41.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14