LCOV - code coverage report
Current view: top level - usr/include/c++/8/bits - stl_iterator.h (source / functions) Hit Total Coverage
Test: Coverage example Lines: 73 75 97.3 %
Date: 2021-12-02 17:21:05 Functions: 179 297 60.3 %

          Line data    Source code
       1             : // Iterators -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-2018 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 > 201402L
      69             : # define __cpp_lib_array_constexpr 201603
      70             : #endif
      71             : 
      72             : namespace std _GLIBCXX_VISIBILITY(default)
      73             : {
      74             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      75             : 
      76             :   /**
      77             :    * @addtogroup iterators
      78             :    * @{
      79             :    */
      80             : 
      81             :   // 24.4.1 Reverse iterators
      82             :   /**
      83             :    *  Bidirectional and random access iterators have corresponding reverse
      84             :    *  %iterator adaptors that iterate through the data structure in the
      85             :    *  opposite direction.  They have the same signatures as the corresponding
      86             :    *  iterators.  The fundamental relation between a reverse %iterator and its
      87             :    *  corresponding %iterator @c i is established by the identity:
      88             :    *  @code
      89             :    *      &*(reverse_iterator(i)) == &*(i - 1)
      90             :    *  @endcode
      91             :    *
      92             :    *  <em>This mapping is dictated by the fact that while there is always a
      93             :    *  pointer past the end of an array, there might not be a valid pointer
      94             :    *  before the beginning of an array.</em> [24.4.1]/1,2
      95             :    *
      96             :    *  Reverse iterators can be tricky and surprising at first.  Their
      97             :    *  semantics make sense, however, and the trickiness is a side effect of
      98             :    *  the requirement that the iterators must be safe.
      99             :   */
     100             :   template<typename _Iterator>
     101             :     class reverse_iterator
     102             :     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
     103             :                       typename iterator_traits<_Iterator>::value_type,
     104             :                       typename iterator_traits<_Iterator>::difference_type,
     105             :                       typename iterator_traits<_Iterator>::pointer,
     106             :                       typename iterator_traits<_Iterator>::reference>
     107             :     {
     108             :     protected:
     109             :       _Iterator current;
     110             : 
     111             :       typedef iterator_traits<_Iterator>          __traits_type;
     112             : 
     113             :     public:
     114             :       typedef _Iterator                                 iterator_type;
     115             :       typedef typename __traits_type::difference_type   difference_type;
     116             :       typedef typename __traits_type::pointer           pointer;
     117             :       typedef typename __traits_type::reference         reference;
     118             : 
     119             :       /**
     120             :        *  The default constructor value-initializes member @p current.
     121             :        *  If it is a pointer, that means it is zero-initialized.
     122             :       */
     123             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     124             :       // 235 No specification of default ctor for reverse_iterator
     125             :       // 1012. reverse_iterator default ctor should value initialize
     126             :       _GLIBCXX17_CONSTEXPR
     127             :       reverse_iterator() : current() { }
     128             : 
     129             :       /**
     130             :        *  This %iterator will move in the opposite direction that @p x does.
     131             :       */
     132             :       explicit _GLIBCXX17_CONSTEXPR
     133       36590 :       reverse_iterator(iterator_type __x) : current(__x) { }
     134             : 
     135             :       /**
     136             :        *  The copy constructor is normal.
     137             :       */
     138             :       _GLIBCXX17_CONSTEXPR
     139       73180 :       reverse_iterator(const reverse_iterator& __x)
     140       73180 :       : current(__x.current) { }
     141             : 
     142             :       /**
     143             :        *  A %reverse_iterator across other types can be copied if the
     144             :        *  underlying %iterator can be converted to the type of @c current.
     145             :       */
     146             :       template<typename _Iter>
     147             :         _GLIBCXX17_CONSTEXPR
     148             :         reverse_iterator(const reverse_iterator<_Iter>& __x)
     149             :         : current(__x.base()) { }
     150             : 
     151             :       /**
     152             :        *  @return  @c current, the %iterator used for underlying work.
     153             :       */
     154             :       _GLIBCXX17_CONSTEXPR iterator_type
     155       11752 :       base() const
     156       11752 :       { return current; }
     157             : 
     158             :       /**
     159             :        *  @return  A reference to the value at @c --current
     160             :        *
     161             :        *  This requires that @c --current is dereferenceable.
     162             :        *
     163             :        *  @warning This implementation requires that for an iterator of the
     164             :        *           underlying iterator type, @c x, a reference obtained by
     165             :        *           @c *x remains valid after @c x has been modified or
     166             :        *           destroyed. This is a bug: http://gcc.gnu.org/PR51823
     167             :       */
     168             :       _GLIBCXX17_CONSTEXPR reference
     169        3001 :       operator*() const
     170             :       {
     171        3001 :         _Iterator __tmp = current;
     172        3001 :         return *--__tmp;
     173             :       }
     174             : 
     175             :       /**
     176             :        *  @return  A pointer to the value at @c --current
     177             :        *
     178             :        *  This requires that @c --current is dereferenceable.
     179             :       */
     180             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     181             :       // 2188. Reverse iterator does not fully support targets that overload &
     182             :       _GLIBCXX17_CONSTEXPR pointer
     183             :       operator->() const
     184             :       { return std::__addressof(operator*()); }
     185             : 
     186             :       /**
     187             :        *  @return  @c *this
     188             :        *
     189             :        *  Decrements the underlying iterator.
     190             :       */
     191             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     192        3001 :       operator++()
     193             :       {
     194        3001 :         --current;
     195        3001 :         return *this;
     196             :       }
     197             : 
     198             :       /**
     199             :        *  @return  The original value of @c *this
     200             :        *
     201             :        *  Decrements the underlying iterator.
     202             :       */
     203             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     204             :       operator++(int)
     205             :       {
     206             :         reverse_iterator __tmp = *this;
     207             :         --current;
     208             :         return __tmp;
     209             :       }
     210             : 
     211             :       /**
     212             :        *  @return  @c *this
     213             :        *
     214             :        *  Increments the underlying iterator.
     215             :       */
     216             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     217             :       operator--()
     218             :       {
     219             :         ++current;
     220             :         return *this;
     221             :       }
     222             : 
     223             :       /**
     224             :        *  @return  A reverse_iterator with the previous value of @c *this
     225             :        *
     226             :        *  Increments the underlying iterator.
     227             :       */
     228             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     229             :       operator--(int)
     230             :       {
     231             :         reverse_iterator __tmp = *this;
     232             :         ++current;
     233             :         return __tmp;
     234             :       }
     235             : 
     236             :       /**
     237             :        *  @return  A reverse_iterator that refers to @c current - @a __n
     238             :        *
     239             :        *  The underlying iterator must be a Random Access Iterator.
     240             :       */
     241             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     242             :       operator+(difference_type __n) const
     243             :       { return reverse_iterator(current - __n); }
     244             : 
     245             :       /**
     246             :        *  @return  *this
     247             :        *
     248             :        *  Moves the underlying iterator backwards @a __n steps.
     249             :        *  The underlying iterator must be a Random Access Iterator.
     250             :       */
     251             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     252             :       operator+=(difference_type __n)
     253             :       {
     254             :         current -= __n;
     255             :         return *this;
     256             :       }
     257             : 
     258             :       /**
     259             :        *  @return  A reverse_iterator that refers to @c current - @a __n
     260             :        *
     261             :        *  The underlying iterator must be a Random Access Iterator.
     262             :       */
     263             :       _GLIBCXX17_CONSTEXPR reverse_iterator
     264             :       operator-(difference_type __n) const
     265             :       { return reverse_iterator(current + __n); }
     266             : 
     267             :       /**
     268             :        *  @return  *this
     269             :        *
     270             :        *  Moves the underlying iterator forwards @a __n steps.
     271             :        *  The underlying iterator must be a Random Access Iterator.
     272             :       */
     273             :       _GLIBCXX17_CONSTEXPR reverse_iterator&
     274             :       operator-=(difference_type __n)
     275             :       {
     276             :         current += __n;
     277             :         return *this;
     278             :       }
     279             : 
     280             :       /**
     281             :        *  @return  The value at @c current - @a __n - 1
     282             :        *
     283             :        *  The underlying iterator must be a Random Access Iterator.
     284             :       */
     285             :       _GLIBCXX17_CONSTEXPR reference
     286             :       operator[](difference_type __n) const
     287             :       { return *(*this + __n); }
     288             :     };
     289             : 
     290             :   //@{
     291             :   /**
     292             :    *  @param  __x  A %reverse_iterator.
     293             :    *  @param  __y  A %reverse_iterator.
     294             :    *  @return  A simple bool.
     295             :    *
     296             :    *  Reverse iterators forward many operations to their underlying base()
     297             :    *  iterators.  Others are implemented in terms of one another.
     298             :    *
     299             :   */
     300             :   template<typename _Iterator>
     301             :     inline _GLIBCXX17_CONSTEXPR bool
     302        5876 :     operator==(const reverse_iterator<_Iterator>& __x,
     303             :                const reverse_iterator<_Iterator>& __y)
     304        5876 :     { return __x.base() == __y.base(); }
     305             : 
     306             :   template<typename _Iterator>
     307             :     inline _GLIBCXX17_CONSTEXPR bool
     308             :     operator<(const reverse_iterator<_Iterator>& __x,
     309             :               const reverse_iterator<_Iterator>& __y)
     310             :     { return __y.base() < __x.base(); }
     311             : 
     312             :   template<typename _Iterator>
     313             :     inline _GLIBCXX17_CONSTEXPR bool
     314        5876 :     operator!=(const reverse_iterator<_Iterator>& __x,
     315             :                const reverse_iterator<_Iterator>& __y)
     316        5876 :     { return !(__x == __y); }
     317             : 
     318             :   template<typename _Iterator>
     319             :     inline _GLIBCXX17_CONSTEXPR bool
     320             :     operator>(const reverse_iterator<_Iterator>& __x,
     321             :               const reverse_iterator<_Iterator>& __y)
     322             :     { return __y < __x; }
     323             : 
     324             :   template<typename _Iterator>
     325             :     inline _GLIBCXX17_CONSTEXPR bool
     326             :     operator<=(const reverse_iterator<_Iterator>& __x,
     327             :                const reverse_iterator<_Iterator>& __y)
     328             :     { return !(__y < __x); }
     329             : 
     330             :   template<typename _Iterator>
     331             :     inline _GLIBCXX17_CONSTEXPR bool
     332             :     operator>=(const reverse_iterator<_Iterator>& __x,
     333             :                const reverse_iterator<_Iterator>& __y)
     334             :     { return !(__x < __y); }
     335             : 
     336             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     337             :   // DR 280. Comparison of reverse_iterator to const reverse_iterator.
     338             :   template<typename _IteratorL, typename _IteratorR>
     339             :     inline _GLIBCXX17_CONSTEXPR bool
     340             :     operator==(const reverse_iterator<_IteratorL>& __x,
     341             :                const reverse_iterator<_IteratorR>& __y)
     342             :     { return __x.base() == __y.base(); }
     343             : 
     344             :   template<typename _IteratorL, typename _IteratorR>
     345             :     inline _GLIBCXX17_CONSTEXPR bool
     346             :     operator<(const reverse_iterator<_IteratorL>& __x,
     347             :               const reverse_iterator<_IteratorR>& __y)
     348             :     { return __y.base() < __x.base(); }
     349             : 
     350             :   template<typename _IteratorL, typename _IteratorR>
     351             :     inline _GLIBCXX17_CONSTEXPR bool
     352             :     operator!=(const reverse_iterator<_IteratorL>& __x,
     353             :                const reverse_iterator<_IteratorR>& __y)
     354             :     { return !(__x == __y); }
     355             : 
     356             :   template<typename _IteratorL, typename _IteratorR>
     357             :     inline _GLIBCXX17_CONSTEXPR bool
     358             :     operator>(const reverse_iterator<_IteratorL>& __x,
     359             :               const reverse_iterator<_IteratorR>& __y)
     360             :     { return __y < __x; }
     361             : 
     362             :   template<typename _IteratorL, typename _IteratorR>
     363             :     inline _GLIBCXX17_CONSTEXPR bool
     364             :     operator<=(const reverse_iterator<_IteratorL>& __x,
     365             :                const reverse_iterator<_IteratorR>& __y)
     366             :     { return !(__y < __x); }
     367             : 
     368             :   template<typename _IteratorL, typename _IteratorR>
     369             :     inline _GLIBCXX17_CONSTEXPR bool
     370             :     operator>=(const reverse_iterator<_IteratorL>& __x,
     371             :                const reverse_iterator<_IteratorR>& __y)
     372             :     { return !(__x < __y); }
     373             :   //@}
     374             : 
     375             : #if __cplusplus < 201103L
     376             :   template<typename _Iterator>
     377             :     inline typename reverse_iterator<_Iterator>::difference_type
     378             :     operator-(const reverse_iterator<_Iterator>& __x,
     379             :               const reverse_iterator<_Iterator>& __y)
     380             :     { return __y.base() - __x.base(); }
     381             : 
     382             :   template<typename _IteratorL, typename _IteratorR>
     383             :     inline typename reverse_iterator<_IteratorL>::difference_type
     384             :     operator-(const reverse_iterator<_IteratorL>& __x,
     385             :               const reverse_iterator<_IteratorR>& __y)
     386             :     { return __y.base() - __x.base(); }
     387             : #else
     388             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     389             :   // DR 685. reverse_iterator/move_iterator difference has invalid signatures
     390             :   template<typename _IteratorL, typename _IteratorR>
     391             :     inline _GLIBCXX17_CONSTEXPR auto
     392             :     operator-(const reverse_iterator<_IteratorL>& __x,
     393             :               const reverse_iterator<_IteratorR>& __y)
     394             :     -> decltype(__y.base() - __x.base())
     395             :     { return __y.base() - __x.base(); }
     396             : #endif
     397             : 
     398             :   template<typename _Iterator>
     399             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     400             :     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
     401             :               const reverse_iterator<_Iterator>& __x)
     402             :     { return reverse_iterator<_Iterator>(__x.base() - __n); }
     403             : 
     404             : #if __cplusplus >= 201103L
     405             :   // Same as C++14 make_reverse_iterator but used in C++03 mode too.
     406             :   template<typename _Iterator>
     407             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     408             :     __make_reverse_iterator(_Iterator __i)
     409             :     { return reverse_iterator<_Iterator>(__i); }
     410             : 
     411             : # if __cplusplus > 201103L
     412             : #  define __cpp_lib_make_reverse_iterator 201402
     413             : 
     414             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     415             :   // DR 2285. make_reverse_iterator
     416             :   /// Generator function for reverse_iterator.
     417             :   template<typename _Iterator>
     418             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
     419             :     make_reverse_iterator(_Iterator __i)
     420             :     { return reverse_iterator<_Iterator>(__i); }
     421             : # endif
     422             : #endif
     423             : 
     424             : #if __cplusplus >= 201103L
     425             :   template<typename _Iterator>
     426             :     auto
     427             :     __niter_base(reverse_iterator<_Iterator> __it)
     428             :     -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
     429             :     { return __make_reverse_iterator(__niter_base(__it.base())); }
     430             : 
     431             :   template<typename _Iterator>
     432             :     struct __is_move_iterator<reverse_iterator<_Iterator> >
     433             :       : __is_move_iterator<_Iterator>
     434             :     { };
     435             : 
     436             :   template<typename _Iterator>
     437             :     auto
     438             :     __miter_base(reverse_iterator<_Iterator> __it)
     439             :     -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
     440             :     { return __make_reverse_iterator(__miter_base(__it.base())); }
     441             : #endif
     442             : 
     443             :   // 24.4.2.2.1 back_insert_iterator
     444             :   /**
     445             :    *  @brief  Turns assignment into insertion.
     446             :    *
     447             :    *  These are output iterators, constructed from a container-of-T.
     448             :    *  Assigning a T to the iterator appends it to the container using
     449             :    *  push_back.
     450             :    *
     451             :    *  Tip:  Using the back_inserter function to create these iterators can
     452             :    *  save typing.
     453             :   */
     454             :   template<typename _Container>
     455             :     class back_insert_iterator
     456             :     : public iterator<output_iterator_tag, void, void, void, void>
     457             :     {
     458             :     protected:
     459             :       _Container* container;
     460             : 
     461             :     public:
     462             :       /// A nested typedef for the type of whatever container you used.
     463             :       typedef _Container          container_type;
     464             : 
     465             :       /// The only way to create this %iterator is with a container.
     466             :       explicit
     467          16 :       back_insert_iterator(_Container& __x)
     468          16 :       : container(std::__addressof(__x)) { }
     469             : 
     470             :       /**
     471             :        *  @param  __value  An instance of whatever type
     472             :        *                 container_type::const_reference is; presumably a
     473             :        *                 reference-to-const T for container<T>.
     474             :        *  @return  This %iterator, for chained operations.
     475             :        *
     476             :        *  This kind of %iterator doesn't really have a @a position in the
     477             :        *  container (you can think of the position as being permanently at
     478             :        *  the end, if you like).  Assigning a value to the %iterator will
     479             :        *  always append the value to the end of the container.
     480             :       */
     481             : #if __cplusplus < 201103L
     482             :       back_insert_iterator&
     483             :       operator=(typename _Container::const_reference __value)
     484             :       {
     485             :         container->push_back(__value);
     486             :         return *this;
     487             :       }
     488             : #else
     489             :       back_insert_iterator&
     490             :       operator=(const typename _Container::value_type& __value)
     491             :       {
     492             :         container->push_back(__value);
     493             :         return *this;
     494             :       }
     495             : 
     496             :       back_insert_iterator&
     497         603 :       operator=(typename _Container::value_type&& __value)
     498             :       {
     499         603 :         container->push_back(std::move(__value));
     500         603 :         return *this;
     501             :       }
     502             : #endif
     503             : 
     504             :       /// Simply returns *this.
     505             :       back_insert_iterator&
     506         603 :       operator*()
     507         603 :       { return *this; }
     508             : 
     509             :       /// Simply returns *this.  (This %iterator does not @a move.)
     510             :       back_insert_iterator&
     511         603 :       operator++()
     512         603 :       { return *this; }
     513             : 
     514             :       /// Simply returns *this.  (This %iterator does not @a move.)
     515             :       back_insert_iterator
     516             :       operator++(int)
     517             :       { return *this; }
     518             :     };
     519             : 
     520             :   /**
     521             :    *  @param  __x  A container of arbitrary type.
     522             :    *  @return  An instance of back_insert_iterator working on @p __x.
     523             :    *
     524             :    *  This wrapper function helps in creating back_insert_iterator instances.
     525             :    *  Typing the name of the %iterator requires knowing the precise full
     526             :    *  type of the container, which can be tedious and impedes generic
     527             :    *  programming.  Using this function lets you take advantage of automatic
     528             :    *  template parameter deduction, making the compiler match the correct
     529             :    *  types for you.
     530             :   */
     531             :   template<typename _Container>
     532             :     inline back_insert_iterator<_Container>
     533          16 :     back_inserter(_Container& __x)
     534          16 :     { return back_insert_iterator<_Container>(__x); }
     535             : 
     536             :   /**
     537             :    *  @brief  Turns assignment into insertion.
     538             :    *
     539             :    *  These are output iterators, constructed from a container-of-T.
     540             :    *  Assigning a T to the iterator prepends it to the container using
     541             :    *  push_front.
     542             :    *
     543             :    *  Tip:  Using the front_inserter function to create these iterators can
     544             :    *  save typing.
     545             :   */
     546             :   template<typename _Container>
     547             :     class front_insert_iterator
     548             :     : public iterator<output_iterator_tag, void, void, void, void>
     549             :     {
     550             :     protected:
     551             :       _Container* container;
     552             : 
     553             :     public:
     554             :       /// A nested typedef for the type of whatever container you used.
     555             :       typedef _Container          container_type;
     556             : 
     557             :       /// The only way to create this %iterator is with a container.
     558             :       explicit front_insert_iterator(_Container& __x)
     559             :       : container(std::__addressof(__x)) { }
     560             : 
     561             :       /**
     562             :        *  @param  __value  An instance of whatever type
     563             :        *                 container_type::const_reference is; presumably a
     564             :        *                 reference-to-const T for container<T>.
     565             :        *  @return  This %iterator, for chained operations.
     566             :        *
     567             :        *  This kind of %iterator doesn't really have a @a position in the
     568             :        *  container (you can think of the position as being permanently at
     569             :        *  the front, if you like).  Assigning a value to the %iterator will
     570             :        *  always prepend the value to the front of the container.
     571             :       */
     572             : #if __cplusplus < 201103L
     573             :       front_insert_iterator&
     574             :       operator=(typename _Container::const_reference __value)
     575             :       {
     576             :         container->push_front(__value);
     577             :         return *this;
     578             :       }
     579             : #else
     580             :       front_insert_iterator&
     581             :       operator=(const typename _Container::value_type& __value)
     582             :       {
     583             :         container->push_front(__value);
     584             :         return *this;
     585             :       }
     586             : 
     587             :       front_insert_iterator&
     588             :       operator=(typename _Container::value_type&& __value)
     589             :       {
     590             :         container->push_front(std::move(__value));
     591             :         return *this;
     592             :       }
     593             : #endif
     594             : 
     595             :       /// Simply returns *this.
     596             :       front_insert_iterator&
     597             :       operator*()
     598             :       { return *this; }
     599             : 
     600             :       /// Simply returns *this.  (This %iterator does not @a move.)
     601             :       front_insert_iterator&
     602             :       operator++()
     603             :       { return *this; }
     604             : 
     605             :       /// Simply returns *this.  (This %iterator does not @a move.)
     606             :       front_insert_iterator
     607             :       operator++(int)
     608             :       { return *this; }
     609             :     };
     610             : 
     611             :   /**
     612             :    *  @param  __x  A container of arbitrary type.
     613             :    *  @return  An instance of front_insert_iterator working on @p x.
     614             :    *
     615             :    *  This wrapper function helps in creating front_insert_iterator instances.
     616             :    *  Typing the name of the %iterator requires knowing the precise full
     617             :    *  type of the container, which can be tedious and impedes generic
     618             :    *  programming.  Using this function lets you take advantage of automatic
     619             :    *  template parameter deduction, making the compiler match the correct
     620             :    *  types for you.
     621             :   */
     622             :   template<typename _Container>
     623             :     inline front_insert_iterator<_Container>
     624             :     front_inserter(_Container& __x)
     625             :     { return front_insert_iterator<_Container>(__x); }
     626             : 
     627             :   /**
     628             :    *  @brief  Turns assignment into insertion.
     629             :    *
     630             :    *  These are output iterators, constructed from a container-of-T.
     631             :    *  Assigning a T to the iterator inserts it in the container at the
     632             :    *  %iterator's position, rather than overwriting the value at that
     633             :    *  position.
     634             :    *
     635             :    *  (Sequences will actually insert a @e copy of the value before the
     636             :    *  %iterator's position.)
     637             :    *
     638             :    *  Tip:  Using the inserter function to create these iterators can
     639             :    *  save typing.
     640             :   */
     641             :   template<typename _Container>
     642             :     class insert_iterator
     643             :     : public iterator<output_iterator_tag, void, void, void, void>
     644             :     {
     645             :     protected:
     646             :       _Container* container;
     647             :       typename _Container::iterator iter;
     648             : 
     649             :     public:
     650             :       /// A nested typedef for the type of whatever container you used.
     651             :       typedef _Container          container_type;
     652             : 
     653             :       /**
     654             :        *  The only way to create this %iterator is with a container and an
     655             :        *  initial position (a normal %iterator into the container).
     656             :       */
     657             :       insert_iterator(_Container& __x, typename _Container::iterator __i)
     658             :       : container(std::__addressof(__x)), iter(__i) {}
     659             : 
     660             :       /**
     661             :        *  @param  __value  An instance of whatever type
     662             :        *                 container_type::const_reference is; presumably a
     663             :        *                 reference-to-const T for container<T>.
     664             :        *  @return  This %iterator, for chained operations.
     665             :        *
     666             :        *  This kind of %iterator maintains its own position in the
     667             :        *  container.  Assigning a value to the %iterator will insert the
     668             :        *  value into the container at the place before the %iterator.
     669             :        *
     670             :        *  The position is maintained such that subsequent assignments will
     671             :        *  insert values immediately after one another.  For example,
     672             :        *  @code
     673             :        *     // vector v contains A and Z
     674             :        *
     675             :        *     insert_iterator i (v, ++v.begin());
     676             :        *     i = 1;
     677             :        *     i = 2;
     678             :        *     i = 3;
     679             :        *
     680             :        *     // vector v contains A, 1, 2, 3, and Z
     681             :        *  @endcode
     682             :       */
     683             : #if __cplusplus < 201103L
     684             :       insert_iterator&
     685             :       operator=(typename _Container::const_reference __value)
     686             :       {
     687             :         iter = container->insert(iter, __value);
     688             :         ++iter;
     689             :         return *this;
     690             :       }
     691             : #else
     692             :       insert_iterator&
     693             :       operator=(const typename _Container::value_type& __value)
     694             :       {
     695             :         iter = container->insert(iter, __value);
     696             :         ++iter;
     697             :         return *this;
     698             :       }
     699             : 
     700             :       insert_iterator&
     701             :       operator=(typename _Container::value_type&& __value)
     702             :       {
     703             :         iter = container->insert(iter, std::move(__value));
     704             :         ++iter;
     705             :         return *this;
     706             :       }
     707             : #endif
     708             : 
     709             :       /// Simply returns *this.
     710             :       insert_iterator&
     711             :       operator*()
     712             :       { return *this; }
     713             : 
     714             :       /// Simply returns *this.  (This %iterator does not @a move.)
     715             :       insert_iterator&
     716             :       operator++()
     717             :       { return *this; }
     718             : 
     719             :       /// Simply returns *this.  (This %iterator does not @a move.)
     720             :       insert_iterator&
     721             :       operator++(int)
     722             :       { return *this; }
     723             :     };
     724             : 
     725             :   /**
     726             :    *  @param __x  A container of arbitrary type.
     727             :    *  @param __i  An iterator into the container.
     728             :    *  @return  An instance of insert_iterator working on @p __x.
     729             :    *
     730             :    *  This wrapper function helps in creating insert_iterator instances.
     731             :    *  Typing the name of the %iterator requires knowing the precise full
     732             :    *  type of the container, which can be tedious and impedes generic
     733             :    *  programming.  Using this function lets you take advantage of automatic
     734             :    *  template parameter deduction, making the compiler match the correct
     735             :    *  types for you.
     736             :   */
     737             :   template<typename _Container, typename _Iterator>
     738             :     inline insert_iterator<_Container>
     739             :     inserter(_Container& __x, _Iterator __i)
     740             :     {
     741             :       return insert_iterator<_Container>(__x,
     742             :                                          typename _Container::iterator(__i));
     743             :     }
     744             : 
     745             :   // @} group iterators
     746             : 
     747             : _GLIBCXX_END_NAMESPACE_VERSION
     748             : } // namespace
     749             : 
     750             : namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
     751             : {
     752             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
     753             : 
     754             :   // This iterator adapter is @a normal in the sense that it does not
     755             :   // change the semantics of any of the operators of its iterator
     756             :   // parameter.  Its primary purpose is to convert an iterator that is
     757             :   // not a class, e.g. a pointer, into an iterator that is a class.
     758             :   // The _Container parameter exists solely so that different containers
     759             :   // using this template can instantiate different types, even if the
     760             :   // _Iterator parameter is the same.
     761             :   using std::iterator_traits;
     762             :   using std::iterator;
     763             :   template<typename _Iterator, typename _Container>
     764             :     class __normal_iterator
     765             :     {
     766             :     protected:
     767             :       _Iterator _M_current;
     768             : 
     769             :       typedef iterator_traits<_Iterator>          __traits_type;
     770             : 
     771             :     public:
     772             :       typedef _Iterator                                 iterator_type;
     773             :       typedef typename __traits_type::iterator_category iterator_category;
     774             :       typedef typename __traits_type::value_type        value_type;
     775             :       typedef typename __traits_type::difference_type   difference_type;
     776             :       typedef typename __traits_type::reference         reference;
     777             :       typedef typename __traits_type::pointer           pointer;
     778             : 
     779             :       _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
     780             :       : _M_current(_Iterator()) { }
     781             : 
     782             :       explicit
     783        1602 :       __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
     784        1602 :       : _M_current(__i) { }
     785             : 
     786             :       // Allow iterator to const_iterator conversion
     787             :       template<typename _Iter>
     788          28 :         __normal_iterator(const __normal_iterator<_Iter,
     789             :                           typename __enable_if<
     790             :                (std::__are_same<_Iter, typename _Container::pointer>::__value),
     791             :                       _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
     792          28 :         : _M_current(__i.base()) { }
     793             : 
     794             :       // Forward iterator requirements
     795             :       reference
     796        9193 :       operator*() const _GLIBCXX_NOEXCEPT
     797        9193 :       { return *_M_current; }
     798             : 
     799             :       pointer
     800             :       operator->() const _GLIBCXX_NOEXCEPT
     801             :       { return _M_current; }
     802             : 
     803             :       __normal_iterator&
     804        2035 :       operator++() _GLIBCXX_NOEXCEPT
     805             :       {
     806        2035 :         ++_M_current;
     807        2035 :         return *this;
     808             :       }
     809             : 
     810             :       __normal_iterator
     811             :       operator++(int) _GLIBCXX_NOEXCEPT
     812             :       { return __normal_iterator(_M_current++); }
     813             : 
     814             :       // Bidirectional iterator requirements
     815             :       __normal_iterator&
     816        1532 :       operator--() _GLIBCXX_NOEXCEPT
     817             :       {
     818        1532 :         --_M_current;
     819        1532 :         return *this;
     820             :       }
     821             : 
     822             :       __normal_iterator
     823             :       operator--(int) _GLIBCXX_NOEXCEPT
     824             :       { return __normal_iterator(_M_current--); }
     825             : 
     826             :       // Random access iterator requirements
     827             :       reference
     828             :       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
     829             :       { return _M_current[__n]; }
     830             : 
     831             :       __normal_iterator&
     832             :       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
     833             :       { _M_current += __n; return *this; }
     834             : 
     835             :       __normal_iterator
     836         200 :       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
     837         200 :       { return __normal_iterator(_M_current + __n); }
     838             : 
     839             :       __normal_iterator&
     840             :       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
     841             :       { _M_current -= __n; return *this; }
     842             : 
     843             :       __normal_iterator
     844         645 :       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
     845         645 :       { return __normal_iterator(_M_current - __n); }
     846             : 
     847             :       const _Iterator&
     848        4447 :       base() const _GLIBCXX_NOEXCEPT
     849        4447 :       { return _M_current; }
     850             :     };
     851             : 
     852             :   // Note: In what follows, the left- and right-hand-side iterators are
     853             :   // allowed to vary in types (conceptually in cv-qualification) so that
     854             :   // comparison between cv-qualified and non-cv-qualified iterators be
     855             :   // valid.  However, the greedy and unfriendly operators in std::rel_ops
     856             :   // will make overload resolution ambiguous (when in scope) if we don't
     857             :   // provide overloads whose operands are of the same type.  Can someone
     858             :   // remind me what generic programming is about? -- Gaby
     859             : 
     860             :   // Forward iterator requirements
     861             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     862             :     inline bool
     863             :     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
     864             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     865             :     _GLIBCXX_NOEXCEPT
     866             :     { return __lhs.base() == __rhs.base(); }
     867             : 
     868             :   template<typename _Iterator, typename _Container>
     869             :     inline bool
     870          42 :     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
     871             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     872             :     _GLIBCXX_NOEXCEPT
     873          42 :     { return __lhs.base() == __rhs.base(); }
     874             : 
     875             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     876             :     inline bool
     877             :     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     878             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     879             :     _GLIBCXX_NOEXCEPT
     880             :     { return __lhs.base() != __rhs.base(); }
     881             : 
     882             :   template<typename _Iterator, typename _Container>
     883             :     inline bool
     884        1300 :     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
     885             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     886             :     _GLIBCXX_NOEXCEPT
     887        1300 :     { return __lhs.base() != __rhs.base(); }
     888             : 
     889             :   // Random access iterator requirements
     890             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     891             :     inline bool
     892             :     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
     893             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     894             :     _GLIBCXX_NOEXCEPT
     895             :     { return __lhs.base() < __rhs.base(); }
     896             : 
     897             :   template<typename _Iterator, typename _Container>
     898             :     inline bool
     899         637 :     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
     900             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     901             :     _GLIBCXX_NOEXCEPT
     902         637 :     { return __lhs.base() < __rhs.base(); }
     903             : 
     904             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     905             :     inline bool
     906             :     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
     907             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     908             :     _GLIBCXX_NOEXCEPT
     909             :     { return __lhs.base() > __rhs.base(); }
     910             : 
     911             :   template<typename _Iterator, typename _Container>
     912             :     inline bool
     913             :     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
     914             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     915             :     _GLIBCXX_NOEXCEPT
     916             :     { return __lhs.base() > __rhs.base(); }
     917             : 
     918             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     919             :     inline bool
     920             :     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     921             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     922             :     _GLIBCXX_NOEXCEPT
     923             :     { return __lhs.base() <= __rhs.base(); }
     924             : 
     925             :   template<typename _Iterator, typename _Container>
     926             :     inline bool
     927             :     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
     928             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     929             :     _GLIBCXX_NOEXCEPT
     930             :     { return __lhs.base() <= __rhs.base(); }
     931             : 
     932             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     933             :     inline bool
     934             :     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     935             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     936             :     _GLIBCXX_NOEXCEPT
     937             :     { return __lhs.base() >= __rhs.base(); }
     938             : 
     939             :   template<typename _Iterator, typename _Container>
     940             :     inline bool
     941             :     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
     942             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     943             :     _GLIBCXX_NOEXCEPT
     944             :     { return __lhs.base() >= __rhs.base(); }
     945             : 
     946             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     947             :   // According to the resolution of DR179 not only the various comparison
     948             :   // operators but also operator- must accept mixed iterator/const_iterator
     949             :   // parameters.
     950             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     951             : #if __cplusplus >= 201103L
     952             :     // DR 685.
     953             :     inline auto
     954             :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
     955             :               const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
     956             :     -> decltype(__lhs.base() - __rhs.base())
     957             : #else
     958             :     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
     959             :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
     960             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     961             : #endif
     962             :     { return __lhs.base() - __rhs.base(); }
     963             : 
     964             :   template<typename _Iterator, typename _Container>
     965             :     inline typename __normal_iterator<_Iterator, _Container>::difference_type
     966         221 :     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
     967             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     968             :     _GLIBCXX_NOEXCEPT
     969         221 :     { return __lhs.base() - __rhs.base(); }
     970             : 
     971             :   template<typename _Iterator, typename _Container>
     972             :     inline __normal_iterator<_Iterator, _Container>
     973             :     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
     974             :               __n, const __normal_iterator<_Iterator, _Container>& __i)
     975             :     _GLIBCXX_NOEXCEPT
     976             :     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
     977             : 
     978             : _GLIBCXX_END_NAMESPACE_VERSION
     979             : } // namespace
     980             : 
     981             : namespace std _GLIBCXX_VISIBILITY(default)
     982             : {
     983             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
     984             : 
     985             :   template<typename _Iterator, typename _Container>
     986             :     _Iterator
     987           6 :     __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
     988           6 :     { return __it.base(); }
     989             : 
     990             : #if __cplusplus >= 201103L
     991             : 
     992             :   /**
     993             :    * @addtogroup iterators
     994             :    * @{
     995             :    */
     996             : 
     997             :   // 24.4.3  Move iterators
     998             :   /**
     999             :    *  Class template move_iterator is an iterator adapter with the same
    1000             :    *  behavior as the underlying iterator except that its dereference
    1001             :    *  operator implicitly converts the value returned by the underlying
    1002             :    *  iterator's dereference operator to an rvalue reference.  Some
    1003             :    *  generic algorithms can be called with move iterators to replace
    1004             :    *  copying with moving.
    1005             :    */
    1006             :   template<typename _Iterator>
    1007             :     class move_iterator
    1008             :     {
    1009             :     protected:
    1010             :       _Iterator _M_current;
    1011             : 
    1012             :       typedef iterator_traits<_Iterator>          __traits_type;
    1013             :       typedef typename __traits_type::reference         __base_ref;
    1014             : 
    1015             :     public:
    1016             :       typedef _Iterator                                 iterator_type;
    1017             :       typedef typename __traits_type::iterator_category iterator_category;
    1018             :       typedef typename __traits_type::value_type        value_type;
    1019             :       typedef typename __traits_type::difference_type   difference_type;
    1020             :       // NB: DR 680.
    1021             :       typedef _Iterator                                 pointer;
    1022             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1023             :       // 2106. move_iterator wrapping iterators returning prvalues
    1024             :       typedef typename conditional<is_reference<__base_ref>::value,
    1025             :                          typename remove_reference<__base_ref>::type&&,
    1026             :                          __base_ref>::type           reference;
    1027             : 
    1028             :       _GLIBCXX17_CONSTEXPR
    1029             :       move_iterator()
    1030             :       : _M_current() { }
    1031             : 
    1032             :       explicit _GLIBCXX17_CONSTEXPR
    1033         412 :       move_iterator(iterator_type __i)
    1034         412 :       : _M_current(__i) { }
    1035             : 
    1036             :       template<typename _Iter>
    1037             :         _GLIBCXX17_CONSTEXPR
    1038             :         move_iterator(const move_iterator<_Iter>& __i)
    1039             :         : _M_current(__i.base()) { }
    1040             : 
    1041             :       _GLIBCXX17_CONSTEXPR iterator_type
    1042         864 :       base() const
    1043         864 :       { return _M_current; }
    1044             : 
    1045             :       _GLIBCXX17_CONSTEXPR reference
    1046         223 :       operator*() const
    1047         223 :       { return static_cast<reference>(*_M_current); }
    1048             : 
    1049             :       _GLIBCXX17_CONSTEXPR pointer
    1050             :       operator->() const
    1051             :       { return _M_current; }
    1052             : 
    1053             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1054         222 :       operator++()
    1055             :       {
    1056         222 :         ++_M_current;
    1057         222 :         return *this;
    1058             :       }
    1059             : 
    1060             :       _GLIBCXX17_CONSTEXPR move_iterator
    1061             :       operator++(int)
    1062             :       {
    1063             :         move_iterator __tmp = *this;
    1064             :         ++_M_current;
    1065             :         return __tmp;
    1066             :       }
    1067             : 
    1068             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1069             :       operator--()
    1070             :       {
    1071             :         --_M_current;
    1072             :         return *this;
    1073             :       }
    1074             : 
    1075             :       _GLIBCXX17_CONSTEXPR move_iterator
    1076             :       operator--(int)
    1077             :       {
    1078             :         move_iterator __tmp = *this;
    1079             :         --_M_current;
    1080             :         return __tmp;
    1081             :       }
    1082             : 
    1083             :       _GLIBCXX17_CONSTEXPR move_iterator
    1084             :       operator+(difference_type __n) const
    1085             :       { return move_iterator(_M_current + __n); }
    1086             : 
    1087             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1088             :       operator+=(difference_type __n)
    1089             :       {
    1090             :         _M_current += __n;
    1091             :         return *this;
    1092             :       }
    1093             : 
    1094             :       _GLIBCXX17_CONSTEXPR move_iterator
    1095             :       operator-(difference_type __n) const
    1096             :       { return move_iterator(_M_current - __n); }
    1097             :     
    1098             :       _GLIBCXX17_CONSTEXPR move_iterator&
    1099             :       operator-=(difference_type __n)
    1100             :       { 
    1101             :         _M_current -= __n;
    1102             :         return *this;
    1103             :       }
    1104             : 
    1105             :       _GLIBCXX17_CONSTEXPR reference
    1106             :       operator[](difference_type __n) const
    1107             :       { return std::move(_M_current[__n]); }
    1108             :     };
    1109             : 
    1110             :   // Note: See __normal_iterator operators note from Gaby to understand
    1111             :   // why there are always 2 versions for most of the move_iterator
    1112             :   // operators.
    1113             :   template<typename _IteratorL, typename _IteratorR>
    1114             :     inline _GLIBCXX17_CONSTEXPR bool
    1115             :     operator==(const move_iterator<_IteratorL>& __x,
    1116             :                const move_iterator<_IteratorR>& __y)
    1117             :     { return __x.base() == __y.base(); }
    1118             : 
    1119             :   template<typename _Iterator>
    1120             :     inline _GLIBCXX17_CONSTEXPR bool
    1121         276 :     operator==(const move_iterator<_Iterator>& __x,
    1122             :                const move_iterator<_Iterator>& __y)
    1123         276 :     { return __x.base() == __y.base(); }
    1124             : 
    1125             :   template<typename _IteratorL, typename _IteratorR>
    1126             :     inline _GLIBCXX17_CONSTEXPR bool
    1127             :     operator!=(const move_iterator<_IteratorL>& __x,
    1128             :                const move_iterator<_IteratorR>& __y)
    1129             :     { return !(__x == __y); }
    1130             : 
    1131             :   template<typename _Iterator>
    1132             :     inline _GLIBCXX17_CONSTEXPR bool
    1133         274 :     operator!=(const move_iterator<_Iterator>& __x,
    1134             :                const move_iterator<_Iterator>& __y)
    1135         274 :     { return !(__x == __y); }
    1136             : 
    1137             :   template<typename _IteratorL, typename _IteratorR>
    1138             :     inline _GLIBCXX17_CONSTEXPR bool
    1139             :     operator<(const move_iterator<_IteratorL>& __x,
    1140             :               const move_iterator<_IteratorR>& __y)
    1141             :     { return __x.base() < __y.base(); }
    1142             : 
    1143             :   template<typename _Iterator>
    1144             :     inline _GLIBCXX17_CONSTEXPR bool
    1145             :     operator<(const move_iterator<_Iterator>& __x,
    1146             :               const move_iterator<_Iterator>& __y)
    1147             :     { return __x.base() < __y.base(); }
    1148             : 
    1149             :   template<typename _IteratorL, typename _IteratorR>
    1150             :     inline _GLIBCXX17_CONSTEXPR bool
    1151             :     operator<=(const move_iterator<_IteratorL>& __x,
    1152             :                const move_iterator<_IteratorR>& __y)
    1153             :     { return !(__y < __x); }
    1154             : 
    1155             :   template<typename _Iterator>
    1156             :     inline _GLIBCXX17_CONSTEXPR bool
    1157             :     operator<=(const move_iterator<_Iterator>& __x,
    1158             :                const move_iterator<_Iterator>& __y)
    1159             :     { return !(__y < __x); }
    1160             : 
    1161             :   template<typename _IteratorL, typename _IteratorR>
    1162             :     inline _GLIBCXX17_CONSTEXPR bool
    1163             :     operator>(const move_iterator<_IteratorL>& __x,
    1164             :               const move_iterator<_IteratorR>& __y)
    1165             :     { return __y < __x; }
    1166             : 
    1167             :   template<typename _Iterator>
    1168             :     inline _GLIBCXX17_CONSTEXPR bool
    1169             :     operator>(const move_iterator<_Iterator>& __x,
    1170             :               const move_iterator<_Iterator>& __y)
    1171             :     { return __y < __x; }
    1172             : 
    1173             :   template<typename _IteratorL, typename _IteratorR>
    1174             :     inline _GLIBCXX17_CONSTEXPR bool
    1175             :     operator>=(const move_iterator<_IteratorL>& __x,
    1176             :                const move_iterator<_IteratorR>& __y)
    1177             :     { return !(__x < __y); }
    1178             : 
    1179             :   template<typename _Iterator>
    1180             :     inline _GLIBCXX17_CONSTEXPR bool
    1181             :     operator>=(const move_iterator<_Iterator>& __x,
    1182             :                const move_iterator<_Iterator>& __y)
    1183             :     { return !(__x < __y); }
    1184             : 
    1185             :   // DR 685.
    1186             :   template<typename _IteratorL, typename _IteratorR>
    1187             :     inline _GLIBCXX17_CONSTEXPR auto
    1188           4 :     operator-(const move_iterator<_IteratorL>& __x,
    1189             :               const move_iterator<_IteratorR>& __y)
    1190             :     -> decltype(__x.base() - __y.base())
    1191           4 :     { return __x.base() - __y.base(); }
    1192             : 
    1193             :   template<typename _Iterator>
    1194             :     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
    1195             :     operator+(typename move_iterator<_Iterator>::difference_type __n,
    1196             :               const move_iterator<_Iterator>& __x)
    1197             :     { return __x + __n; }
    1198             : 
    1199             :   template<typename _Iterator>
    1200             :     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
    1201           0 :     make_move_iterator(_Iterator __i)
    1202           0 :     { return move_iterator<_Iterator>(__i); }
    1203             : 
    1204             :   template<typename _Iterator, typename _ReturnType
    1205             :     = typename conditional<__move_if_noexcept_cond
    1206             :       <typename iterator_traits<_Iterator>::value_type>::value,
    1207             :                 _Iterator, move_iterator<_Iterator>>::type>
    1208             :     inline _GLIBCXX17_CONSTEXPR _ReturnType
    1209             :     __make_move_if_noexcept_iterator(_Iterator __i)
    1210             :     { return _ReturnType(__i); }
    1211             : 
    1212             :   // Overload for pointers that matches std::move_if_noexcept more closely,
    1213             :   // returning a constant iterator when we don't want to move.
    1214             :   template<typename _Tp, typename _ReturnType
    1215             :     = typename conditional<__move_if_noexcept_cond<_Tp>::value,
    1216             :                            const _Tp*, move_iterator<_Tp*>>::type>
    1217             :     inline _GLIBCXX17_CONSTEXPR _ReturnType
    1218          28 :     __make_move_if_noexcept_iterator(_Tp* __i)
    1219          28 :     { return _ReturnType(__i); }
    1220             : 
    1221             :   // @} group iterators
    1222             : 
    1223             :   template<typename _Iterator>
    1224             :     auto
    1225             :     __niter_base(move_iterator<_Iterator> __it)
    1226             :     -> decltype(make_move_iterator(__niter_base(__it.base())))
    1227             :     { return make_move_iterator(__niter_base(__it.base())); }
    1228             : 
    1229             :   template<typename _Iterator>
    1230             :     struct __is_move_iterator<move_iterator<_Iterator> >
    1231             :     {
    1232             :       enum { __value = 1 };
    1233             :       typedef __true_type __type;
    1234             :     };
    1235             : 
    1236             :   template<typename _Iterator>
    1237             :     auto
    1238         302 :     __miter_base(move_iterator<_Iterator> __it)
    1239             :     -> decltype(__miter_base(__it.base()))
    1240         302 :     { return __miter_base(__it.base()); }
    1241             : 
    1242             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
    1243             : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
    1244             :   std::__make_move_if_noexcept_iterator(_Iter)
    1245             : #else
    1246             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
    1247             : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
    1248             : #endif // C++11
    1249             : 
    1250             : #if __cpp_deduction_guides >= 201606
    1251             :   // These helper traits are used for deduction guides
    1252             :   // of associative containers.
    1253             :   template<typename _InputIterator>
    1254             :     using __iter_key_t = remove_const_t<
    1255             :     typename iterator_traits<_InputIterator>::value_type::first_type>;
    1256             : 
    1257             :   template<typename _InputIterator>
    1258             :     using __iter_val_t =
    1259             :     typename iterator_traits<_InputIterator>::value_type::second_type;
    1260             : 
    1261             :   template<typename _T1, typename _T2>
    1262             :     struct pair;
    1263             : 
    1264             :   template<typename _InputIterator>
    1265             :     using __iter_to_alloc_t =
    1266             :     pair<add_const_t<__iter_key_t<_InputIterator>>,
    1267             :          __iter_val_t<_InputIterator>>;
    1268             : 
    1269             : #endif
    1270             : 
    1271             : _GLIBCXX_END_NAMESPACE_VERSION
    1272             : } // namespace
    1273             : 
    1274             : #ifdef _GLIBCXX_DEBUG
    1275             : # include <debug/stl_iterator.h>
    1276             : #endif
    1277             : 
    1278             : #endif

Generated by: LCOV version 1.14