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