Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.