LCOV - code coverage report
Current view: top level - usr/include/c++/9/bits - stl_iterator.h (source / functions) Hit Total Coverage
Test: ROSE Lines: 91 132 68.9 %
Date: 2022-12-08 13:48:47 Functions: 1 5 20.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14