LCOV - code coverage report
Current view: top level - usr/include/c++/4.4/bits - stl_iterator.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 22 24 91.7 %
Date: 2015-06-10 18:10:59 Functions: 24 27 88.9 %

          Line data    Source code
       1             : // Iterators -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
       4             : // Free Software Foundation, Inc.
       5             : //
       6             : // This file is part of the GNU ISO C++ Library.  This library is free
       7             : // software; you can redistribute it and/or modify it under the
       8             : // terms of the GNU General Public License as published by the
       9             : // Free Software Foundation; either version 3, or (at your option)
      10             : // any later version.
      11             : 
      12             : // This library is distributed in the hope that it will be useful,
      13             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15             : // GNU General Public License for more details.
      16             : 
      17             : // Under Section 7 of GPL version 3, you are granted additional
      18             : // permissions described in the GCC Runtime Library Exception, version
      19             : // 3.1, as published by the Free Software Foundation.
      20             : 
      21             : // You should have received a copy of the GNU General Public License and
      22             : // a copy of the GCC Runtime Library Exception along with this program;
      23             : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      24             : // <http://www.gnu.org/licenses/>.
      25             : 
      26             : /*
      27             :  *
      28             :  * Copyright (c) 1994
      29             :  * Hewlett-Packard Company
      30             :  *
      31             :  * Permission to use, copy, modify, distribute and sell this software
      32             :  * and its documentation for any purpose is hereby granted without fee,
      33             :  * provided that the above copyright notice appear in all copies and
      34             :  * that both that copyright notice and this permission notice appear
      35             :  * in supporting documentation.  Hewlett-Packard Company makes no
      36             :  * representations about the suitability of this software for any
      37             :  * purpose.  It is provided "as is" without express or implied warranty.
      38             :  *
      39             :  *
      40             :  * Copyright (c) 1996-1998
      41             :  * Silicon Graphics Computer Systems, Inc.
      42             :  *
      43             :  * Permission to use, copy, modify, distribute and sell this software
      44             :  * and its documentation for any purpose is hereby granted without fee,
      45             :  * provided that the above copyright notice appear in all copies and
      46             :  * that both that copyright notice and this permission notice appear
      47             :  * in supporting documentation.  Silicon Graphics makes no
      48             :  * representations about the suitability of this software for any
      49             :  * purpose.  It is provided "as is" without express or implied warranty.
      50             :  */
      51             : 
      52             : /** @file stl_iterator.h
      53             :  *  This is an internal header file, included by other library headers.
      54             :  *  You should not attempt to use it directly.
      55             :  *
      56             :  *  This file implements reverse_iterator, back_insert_iterator,
      57             :  *  front_insert_iterator, insert_iterator, __normal_iterator, and their
      58             :  *  supporting functions and overloaded operators.
      59             :  */
      60             : 
      61             : #ifndef _STL_ITERATOR_H
      62             : #define _STL_ITERATOR_H 1
      63             : 
      64             : #include <bits/cpp_type_traits.h>
      65             : #include <ext/type_traits.h>
      66             : #include <bits/move.h>
      67             : 
      68             : _GLIBCXX_BEGIN_NAMESPACE(std)
      69             : 
      70             :   // 24.4.1 Reverse iterators
      71             :   /**
      72             :    *  "Bidirectional and random access iterators have corresponding reverse
      73             :    *  %iterator adaptors that iterate through the data structure in the
      74             :    *  opposite direction.  They have the same signatures as the corresponding
      75             :    *  iterators.  The fundamental relation between a reverse %iterator and its
      76             :    *  corresponding %iterator @c i is established by the identity:
      77             :    *  @code
      78             :    *      &*(reverse_iterator(i)) == &*(i - 1)
      79             :    *  @endcode
      80             :    *
      81             :    *  This mapping is dictated by the fact that while there is always a
      82             :    *  pointer past the end of an array, there might not be a valid pointer
      83             :    *  before the beginning of an array." [24.4.1]/1,2
      84             :    *
      85             :    *  Reverse iterators can be tricky and surprising at first.  Their
      86             :    *  semantics make sense, however, and the trickiness is a side effect of
      87             :    *  the requirement that the iterators must be safe.
      88             :   */
      89             :   template<typename _Iterator>
      90             :     class reverse_iterator
      91             :     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
      92             :                       typename iterator_traits<_Iterator>::value_type,
      93             :                       typename iterator_traits<_Iterator>::difference_type,
      94             :                       typename iterator_traits<_Iterator>::pointer,
      95             :                       typename iterator_traits<_Iterator>::reference>
      96             :     {
      97             :     protected:
      98             :       _Iterator current;
      99             : 
     100             :     public:
     101             :       typedef _Iterator                                        iterator_type;
     102             :       typedef typename iterator_traits<_Iterator>::difference_type
     103             :                                                                difference_type;
     104             :       typedef typename iterator_traits<_Iterator>::reference   reference;
     105             :       typedef typename iterator_traits<_Iterator>::pointer     pointer;
     106             : 
     107             :     public:
     108             :       /**
     109             :        *  The default constructor default-initializes member @p current.
     110             :        *  If it is a pointer, that means it is zero-initialized.
     111             :       */
     112             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     113             :       // 235 No specification of default ctor for reverse_iterator
     114             :       reverse_iterator() : current() { }
     115             : 
     116             :       /**
     117             :        *  This %iterator will move in the opposite direction that @p x does.
     118             :       */
     119             :       explicit
     120             :       reverse_iterator(iterator_type __x) : current(__x) { }
     121             : 
     122             :       /**
     123             :        *  The copy constructor is normal.
     124             :       */
     125             :       reverse_iterator(const reverse_iterator& __x)
     126             :       : current(__x.current) { }
     127             : 
     128             :       /**
     129             :        *  A reverse_iterator across other types can be copied in the normal
     130             :        *  fashion.
     131             :       */
     132             :       template<typename _Iter>
     133             :         reverse_iterator(const reverse_iterator<_Iter>& __x)
     134             :         : current(__x.base()) { }
     135             : 
     136             :       /**
     137             :        *  @return  @c current, the %iterator used for underlying work.
     138             :       */
     139             :       iterator_type
     140             :       base() const
     141             :       { return current; }
     142             : 
     143             :       /**
     144             :        *  @return  TODO
     145             :        *
     146             :        *  @doctodo
     147             :       */
     148             :       reference
     149             :       operator*() const
     150             :       {
     151             :         _Iterator __tmp = current;
     152             :         return *--__tmp;
     153             :       }
     154             : 
     155             :       /**
     156             :        *  @return  TODO
     157             :        *
     158             :        *  @doctodo
     159             :       */
     160             :       pointer
     161             :       operator->() const
     162             :       { return &(operator*()); }
     163             : 
     164             :       /**
     165             :        *  @return  TODO
     166             :        *
     167             :        *  @doctodo
     168             :       */
     169             :       reverse_iterator&
     170             :       operator++()
     171             :       {
     172             :         --current;
     173             :         return *this;
     174             :       }
     175             : 
     176             :       /**
     177             :        *  @return  TODO
     178             :        *
     179             :        *  @doctodo
     180             :       */
     181             :       reverse_iterator
     182             :       operator++(int)
     183             :       {
     184             :         reverse_iterator __tmp = *this;
     185             :         --current;
     186             :         return __tmp;
     187             :       }
     188             : 
     189             :       /**
     190             :        *  @return  TODO
     191             :        *
     192             :        *  @doctodo
     193             :       */
     194             :       reverse_iterator&
     195             :       operator--()
     196             :       {
     197             :         ++current;
     198             :         return *this;
     199             :       }
     200             : 
     201             :       /**
     202             :        *  @return  TODO
     203             :        *
     204             :        *  @doctodo
     205             :       */
     206             :       reverse_iterator
     207             :       operator--(int)
     208             :       {
     209             :         reverse_iterator __tmp = *this;
     210             :         ++current;
     211             :         return __tmp;
     212             :       }
     213             : 
     214             :       /**
     215             :        *  @return  TODO
     216             :        *
     217             :        *  @doctodo
     218             :       */
     219             :       reverse_iterator
     220             :       operator+(difference_type __n) const
     221             :       { return reverse_iterator(current - __n); }
     222             : 
     223             :       /**
     224             :        *  @return  TODO
     225             :        *
     226             :        *  @doctodo
     227             :       */
     228             :       reverse_iterator&
     229             :       operator+=(difference_type __n)
     230             :       {
     231             :         current -= __n;
     232             :         return *this;
     233             :       }
     234             : 
     235             :       /**
     236             :        *  @return  TODO
     237             :        *
     238             :        *  @doctodo
     239             :       */
     240             :       reverse_iterator
     241             :       operator-(difference_type __n) const
     242             :       { return reverse_iterator(current + __n); }
     243             : 
     244             :       /**
     245             :        *  @return  TODO
     246             :        *
     247             :        *  @doctodo
     248             :       */
     249             :       reverse_iterator&
     250             :       operator-=(difference_type __n)
     251             :       {
     252             :         current += __n;
     253             :         return *this;
     254             :       }
     255             : 
     256             :       /**
     257             :        *  @return  TODO
     258             :        *
     259             :        *  @doctodo
     260             :       */
     261             :       reference
     262             :       operator[](difference_type __n) const
     263             :       { return *(*this + __n); }
     264             :     };
     265             : 
     266             :   //@{
     267             :   /**
     268             :    *  @param  x  A %reverse_iterator.
     269             :    *  @param  y  A %reverse_iterator.
     270             :    *  @return  A simple bool.
     271             :    *
     272             :    *  Reverse iterators forward many operations to their underlying base()
     273             :    *  iterators.  Others are implemented in terms of one another.
     274             :    *
     275             :   */
     276             :   template<typename _Iterator>
     277             :     inline bool
     278             :     operator==(const reverse_iterator<_Iterator>& __x,
     279             :                const reverse_iterator<_Iterator>& __y)
     280             :     { return __x.base() == __y.base(); }
     281             : 
     282             :   template<typename _Iterator>
     283             :     inline bool
     284             :     operator<(const reverse_iterator<_Iterator>& __x,
     285             :               const reverse_iterator<_Iterator>& __y)
     286             :     { return __y.base() < __x.base(); }
     287             : 
     288             :   template<typename _Iterator>
     289             :     inline bool
     290             :     operator!=(const reverse_iterator<_Iterator>& __x,
     291             :                const reverse_iterator<_Iterator>& __y)
     292             :     { return !(__x == __y); }
     293             : 
     294             :   template<typename _Iterator>
     295             :     inline bool
     296             :     operator>(const reverse_iterator<_Iterator>& __x,
     297             :               const reverse_iterator<_Iterator>& __y)
     298             :     { return __y < __x; }
     299             : 
     300             :   template<typename _Iterator>
     301             :     inline bool
     302             :     operator<=(const reverse_iterator<_Iterator>& __x,
     303             :                const reverse_iterator<_Iterator>& __y)
     304             :     { return !(__y < __x); }
     305             : 
     306             :   template<typename _Iterator>
     307             :     inline bool
     308             :     operator>=(const reverse_iterator<_Iterator>& __x,
     309             :                const reverse_iterator<_Iterator>& __y)
     310             :     { return !(__x < __y); }
     311             : 
     312             :   template<typename _Iterator>
     313             :     inline typename reverse_iterator<_Iterator>::difference_type
     314             :     operator-(const reverse_iterator<_Iterator>& __x,
     315             :               const reverse_iterator<_Iterator>& __y)
     316             :     { return __y.base() - __x.base(); }
     317             : 
     318             :   template<typename _Iterator>
     319             :     inline reverse_iterator<_Iterator>
     320             :     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
     321             :               const reverse_iterator<_Iterator>& __x)
     322             :     { return reverse_iterator<_Iterator>(__x.base() - __n); }
     323             : 
     324             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     325             :   // DR 280. Comparison of reverse_iterator to const reverse_iterator.
     326             :   template<typename _IteratorL, typename _IteratorR>
     327             :     inline bool
     328             :     operator==(const reverse_iterator<_IteratorL>& __x,
     329             :                const reverse_iterator<_IteratorR>& __y)
     330             :     { return __x.base() == __y.base(); }
     331             : 
     332             :   template<typename _IteratorL, typename _IteratorR>
     333             :     inline bool
     334             :     operator<(const reverse_iterator<_IteratorL>& __x,
     335             :               const reverse_iterator<_IteratorR>& __y)
     336             :     { return __y.base() < __x.base(); }
     337             : 
     338             :   template<typename _IteratorL, typename _IteratorR>
     339             :     inline bool
     340             :     operator!=(const reverse_iterator<_IteratorL>& __x,
     341             :                const reverse_iterator<_IteratorR>& __y)
     342             :     { return !(__x == __y); }
     343             : 
     344             :   template<typename _IteratorL, typename _IteratorR>
     345             :     inline bool
     346             :     operator>(const reverse_iterator<_IteratorL>& __x,
     347             :               const reverse_iterator<_IteratorR>& __y)
     348             :     { return __y < __x; }
     349             : 
     350             :   template<typename _IteratorL, typename _IteratorR>
     351             :     inline bool
     352             :     operator<=(const reverse_iterator<_IteratorL>& __x,
     353             :                const reverse_iterator<_IteratorR>& __y)
     354             :     { return !(__y < __x); }
     355             : 
     356             :   template<typename _IteratorL, typename _IteratorR>
     357             :     inline bool
     358             :     operator>=(const reverse_iterator<_IteratorL>& __x,
     359             :                const reverse_iterator<_IteratorR>& __y)
     360             :     { return !(__x < __y); }
     361             : 
     362             :   template<typename _IteratorL, typename _IteratorR>
     363             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     364             :     // DR 685.
     365             :     inline auto
     366             :     operator-(const reverse_iterator<_IteratorL>& __x,
     367             :               const reverse_iterator<_IteratorR>& __y)
     368             :     -> decltype(__y.base() - __x.base())
     369             : #else
     370             :     inline typename reverse_iterator<_IteratorL>::difference_type
     371             :     operator-(const reverse_iterator<_IteratorL>& __x,
     372             :               const reverse_iterator<_IteratorR>& __y)
     373             : #endif
     374             :     { return __y.base() - __x.base(); }
     375             :   //@}
     376             : 
     377             :   // 24.4.2.2.1 back_insert_iterator
     378             :   /**
     379             :    *  @brief  Turns assignment into insertion.
     380             :    *
     381             :    *  These are output iterators, constructed from a container-of-T.
     382             :    *  Assigning a T to the iterator appends it to the container using
     383             :    *  push_back.
     384             :    *
     385             :    *  Tip:  Using the back_inserter function to create these iterators can
     386             :    *  save typing.
     387             :   */
     388             :   template<typename _Container>
     389             :     class back_insert_iterator
     390             :     : public iterator<output_iterator_tag, void, void, void, void>
     391             :     {
     392             :     protected:
     393             :       _Container* container;
     394             : 
     395             :     public:
     396             :       /// A nested typedef for the type of whatever container you used.
     397             :       typedef _Container          container_type;
     398             : 
     399             :       /// The only way to create this %iterator is with a container.
     400             :       explicit
     401             :       back_insert_iterator(_Container& __x) : container(&__x) { }
     402             : 
     403             :       /**
     404             :        *  @param  value  An instance of whatever type
     405             :        *                 container_type::const_reference is; presumably a
     406             :        *                 reference-to-const T for container<T>.
     407             :        *  @return  This %iterator, for chained operations.
     408             :        *
     409             :        *  This kind of %iterator doesn't really have a "position" in the
     410             :        *  container (you can think of the position as being permanently at
     411             :        *  the end, if you like).  Assigning a value to the %iterator will
     412             :        *  always append the value to the end of the container.
     413             :       */
     414             :       back_insert_iterator&
     415             :       operator=(typename _Container::const_reference __value)
     416             :       {
     417             :         container->push_back(__value);
     418             :         return *this;
     419             :       }
     420             : 
     421             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     422             :       back_insert_iterator&
     423             :       operator=(typename _Container::value_type&& __value)
     424             :       {
     425             :         container->push_back(std::move(__value));
     426             :         return *this;
     427             :       }
     428             : #endif
     429             : 
     430             :       /// Simply returns *this.
     431             :       back_insert_iterator&
     432             :       operator*()
     433             :       { return *this; }
     434             : 
     435             :       /// Simply returns *this.  (This %iterator does not "move".)
     436             :       back_insert_iterator&
     437             :       operator++()
     438             :       { return *this; }
     439             : 
     440             :       /// Simply returns *this.  (This %iterator does not "move".)
     441             :       back_insert_iterator
     442             :       operator++(int)
     443             :       { return *this; }
     444             :     };
     445             : 
     446             :   /**
     447             :    *  @param  x  A container of arbitrary type.
     448             :    *  @return  An instance of back_insert_iterator working on @p x.
     449             :    *
     450             :    *  This wrapper function helps in creating back_insert_iterator instances.
     451             :    *  Typing the name of the %iterator requires knowing the precise full
     452             :    *  type of the container, which can be tedious and impedes generic
     453             :    *  programming.  Using this function lets you take advantage of automatic
     454             :    *  template parameter deduction, making the compiler match the correct
     455             :    *  types for you.
     456             :   */
     457             :   template<typename _Container>
     458             :     inline back_insert_iterator<_Container>
     459             :     back_inserter(_Container& __x)
     460             :     { return back_insert_iterator<_Container>(__x); }
     461             : 
     462             :   /**
     463             :    *  @brief  Turns assignment into insertion.
     464             :    *
     465             :    *  These are output iterators, constructed from a container-of-T.
     466             :    *  Assigning a T to the iterator prepends it to the container using
     467             :    *  push_front.
     468             :    *
     469             :    *  Tip:  Using the front_inserter function to create these iterators can
     470             :    *  save typing.
     471             :   */
     472             :   template<typename _Container>
     473             :     class front_insert_iterator
     474             :     : public iterator<output_iterator_tag, void, void, void, void>
     475             :     {
     476             :     protected:
     477             :       _Container* container;
     478             : 
     479             :     public:
     480             :       /// A nested typedef for the type of whatever container you used.
     481             :       typedef _Container          container_type;
     482             : 
     483             :       /// The only way to create this %iterator is with a container.
     484             :       explicit front_insert_iterator(_Container& __x) : container(&__x) { }
     485             : 
     486             :       /**
     487             :        *  @param  value  An instance of whatever type
     488             :        *                 container_type::const_reference is; presumably a
     489             :        *                 reference-to-const T for container<T>.
     490             :        *  @return  This %iterator, for chained operations.
     491             :        *
     492             :        *  This kind of %iterator doesn't really have a "position" in the
     493             :        *  container (you can think of the position as being permanently at
     494             :        *  the front, if you like).  Assigning a value to the %iterator will
     495             :        *  always prepend the value to the front of the container.
     496             :       */
     497             :       front_insert_iterator&
     498             :       operator=(typename _Container::const_reference __value)
     499             :       {
     500             :         container->push_front(__value);
     501             :         return *this;
     502             :       }
     503             : 
     504             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     505             :       front_insert_iterator&
     506             :       operator=(typename _Container::value_type&& __value)
     507             :       {
     508             :         container->push_front(std::move(__value));
     509             :         return *this;
     510             :       }
     511             : #endif
     512             : 
     513             :       /// Simply returns *this.
     514             :       front_insert_iterator&
     515             :       operator*()
     516             :       { return *this; }
     517             : 
     518             :       /// Simply returns *this.  (This %iterator does not "move".)
     519             :       front_insert_iterator&
     520             :       operator++()
     521             :       { return *this; }
     522             : 
     523             :       /// Simply returns *this.  (This %iterator does not "move".)
     524             :       front_insert_iterator
     525             :       operator++(int)
     526             :       { return *this; }
     527             :     };
     528             : 
     529             :   /**
     530             :    *  @param  x  A container of arbitrary type.
     531             :    *  @return  An instance of front_insert_iterator working on @p x.
     532             :    *
     533             :    *  This wrapper function helps in creating front_insert_iterator instances.
     534             :    *  Typing the name of the %iterator requires knowing the precise full
     535             :    *  type of the container, which can be tedious and impedes generic
     536             :    *  programming.  Using this function lets you take advantage of automatic
     537             :    *  template parameter deduction, making the compiler match the correct
     538             :    *  types for you.
     539             :   */
     540             :   template<typename _Container>
     541             :     inline front_insert_iterator<_Container>
     542             :     front_inserter(_Container& __x)
     543             :     { return front_insert_iterator<_Container>(__x); }
     544             : 
     545             :   /**
     546             :    *  @brief  Turns assignment into insertion.
     547             :    *
     548             :    *  These are output iterators, constructed from a container-of-T.
     549             :    *  Assigning a T to the iterator inserts it in the container at the
     550             :    *  %iterator's position, rather than overwriting the value at that
     551             :    *  position.
     552             :    *
     553             :    *  (Sequences will actually insert a @e copy of the value before the
     554             :    *  %iterator's position.)
     555             :    *
     556             :    *  Tip:  Using the inserter function to create these iterators can
     557             :    *  save typing.
     558             :   */
     559             :   template<typename _Container>
     560             :     class insert_iterator
     561             :     : public iterator<output_iterator_tag, void, void, void, void>
     562             :     {
     563             :     protected:
     564             :       _Container* container;
     565             :       typename _Container::iterator iter;
     566             : 
     567             :     public:
     568             :       /// A nested typedef for the type of whatever container you used.
     569             :       typedef _Container          container_type;
     570             : 
     571             :       /**
     572             :        *  The only way to create this %iterator is with a container and an
     573             :        *  initial position (a normal %iterator into the container).
     574             :       */
     575             :       insert_iterator(_Container& __x, typename _Container::iterator __i)
     576             :       : container(&__x), iter(__i) {}
     577             : 
     578             :       /**
     579             :        *  @param  value  An instance of whatever type
     580             :        *                 container_type::const_reference is; presumably a
     581             :        *                 reference-to-const T for container<T>.
     582             :        *  @return  This %iterator, for chained operations.
     583             :        *
     584             :        *  This kind of %iterator maintains its own position in the
     585             :        *  container.  Assigning a value to the %iterator will insert the
     586             :        *  value into the container at the place before the %iterator.
     587             :        *
     588             :        *  The position is maintained such that subsequent assignments will
     589             :        *  insert values immediately after one another.  For example,
     590             :        *  @code
     591             :        *     // vector v contains A and Z
     592             :        *
     593             :        *     insert_iterator i (v, ++v.begin());
     594             :        *     i = 1;
     595             :        *     i = 2;
     596             :        *     i = 3;
     597             :        *
     598             :        *     // vector v contains A, 1, 2, 3, and Z
     599             :        *  @endcode
     600             :       */
     601             :       insert_iterator&
     602             :       operator=(typename _Container::const_reference __value)
     603             :       {
     604             :         iter = container->insert(iter, __value);
     605             :         ++iter;
     606             :         return *this;
     607             :       }
     608             : 
     609             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     610             :       insert_iterator&
     611             :       operator=(typename _Container::value_type&& __value)
     612             :       {
     613             :         iter = container->insert(iter, std::move(__value));
     614             :         ++iter;
     615             :         return *this;
     616             :       }
     617             : #endif
     618             : 
     619             :       /// Simply returns *this.
     620             :       insert_iterator&
     621             :       operator*()
     622             :       { return *this; }
     623             : 
     624             :       /// Simply returns *this.  (This %iterator does not "move".)
     625             :       insert_iterator&
     626             :       operator++()
     627             :       { return *this; }
     628             : 
     629             :       /// Simply returns *this.  (This %iterator does not "move".)
     630             :       insert_iterator&
     631             :       operator++(int)
     632             :       { return *this; }
     633             :     };
     634             : 
     635             :   /**
     636             :    *  @param  x  A container of arbitrary type.
     637             :    *  @return  An instance of insert_iterator working on @p x.
     638             :    *
     639             :    *  This wrapper function helps in creating insert_iterator instances.
     640             :    *  Typing the name of the %iterator requires knowing the precise full
     641             :    *  type of the container, which can be tedious and impedes generic
     642             :    *  programming.  Using this function lets you take advantage of automatic
     643             :    *  template parameter deduction, making the compiler match the correct
     644             :    *  types for you.
     645             :   */
     646             :   template<typename _Container, typename _Iterator>
     647             :     inline insert_iterator<_Container>
     648             :     inserter(_Container& __x, _Iterator __i)
     649             :     {
     650             :       return insert_iterator<_Container>(__x,
     651             :                                          typename _Container::iterator(__i));
     652             :     }
     653             : 
     654             : _GLIBCXX_END_NAMESPACE
     655             : 
     656             : _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
     657             : 
     658             :   // This iterator adapter is 'normal' in the sense that it does not
     659             :   // change the semantics of any of the operators of its iterator
     660             :   // parameter.  Its primary purpose is to convert an iterator that is
     661             :   // not a class, e.g. a pointer, into an iterator that is a class.
     662             :   // The _Container parameter exists solely so that different containers
     663             :   // using this template can instantiate different types, even if the
     664             :   // _Iterator parameter is the same.
     665             :   using std::iterator_traits;
     666             :   using std::iterator;
     667             :   template<typename _Iterator, typename _Container>
     668             :     class __normal_iterator
     669             :     {
     670             :     protected:
     671             :       _Iterator _M_current;
     672             : 
     673             :     public:
     674             :       typedef _Iterator                                      iterator_type;
     675             :       typedef typename iterator_traits<_Iterator>::iterator_category
     676             :                                                              iterator_category;
     677             :       typedef typename iterator_traits<_Iterator>::value_type  value_type;
     678             :       typedef typename iterator_traits<_Iterator>::difference_type
     679             :                                                              difference_type;
     680             :       typedef typename iterator_traits<_Iterator>::reference reference;
     681             :       typedef typename iterator_traits<_Iterator>::pointer   pointer;
     682             : 
     683             :       __normal_iterator() : _M_current(_Iterator()) { }
     684             : 
     685             :       explicit
     686    50968025 :       __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
     687             : 
     688             :       // Allow iterator to const_iterator conversion
     689             :       template<typename _Iter>
     690         163 :         __normal_iterator(const __normal_iterator<_Iter,
     691             :                           typename __enable_if<
     692             :                (std::__are_same<_Iter, typename _Container::pointer>::__value),
     693             :                       _Container>::__type>& __i)
     694         163 :         : _M_current(__i.base()) { }
     695             : 
     696             :       // Forward iterator requirements
     697             :       reference
     698    12230552 :       operator*() const
     699    12230552 :       { return *_M_current; }
     700             : 
     701             :       pointer
     702           0 :       operator->() const
     703           0 :       { return _M_current; }
     704             : 
     705             :       __normal_iterator&
     706      831965 :       operator++()
     707             :       {
     708      831965 :         ++_M_current;
     709      831965 :         return *this;
     710             :       }
     711             : 
     712             :       __normal_iterator
     713     1545493 :       operator++(int)
     714     1545493 :       { return __normal_iterator(_M_current++); }
     715             : 
     716             :       // Bidirectional iterator requirements
     717             :       __normal_iterator&
     718             :       operator--()
     719             :       {
     720             :         --_M_current;
     721             :         return *this;
     722             :       }
     723             : 
     724             :       __normal_iterator
     725             :       operator--(int)
     726             :       { return __normal_iterator(_M_current--); }
     727             : 
     728             :       // Random access iterator requirements
     729             :       reference
     730             :       operator[](const difference_type& __n) const
     731             :       { return _M_current[__n]; }
     732             : 
     733             :       __normal_iterator&
     734             :       operator+=(const difference_type& __n)
     735             :       { _M_current += __n; return *this; }
     736             : 
     737             :       __normal_iterator
     738             :       operator+(const difference_type& __n) const
     739             :       { return __normal_iterator(_M_current + __n); }
     740             : 
     741             :       __normal_iterator&
     742             :       operator-=(const difference_type& __n)
     743             :       { _M_current -= __n; return *this; }
     744             : 
     745             :       __normal_iterator
     746     9852869 :       operator-(const difference_type& __n) const
     747     9852869 :       { return __normal_iterator(_M_current - __n); }
     748             : 
     749             :       const _Iterator&
     750    35966231 :       base() const
     751    35966231 :       { return _M_current; }
     752             :     };
     753             : 
     754             :   // Note: In what follows, the left- and right-hand-side iterators are
     755             :   // allowed to vary in types (conceptually in cv-qualification) so that
     756             :   // comparison between cv-qualified and non-cv-qualified iterators be
     757             :   // valid.  However, the greedy and unfriendly operators in std::rel_ops
     758             :   // will make overload resolution ambiguous (when in scope) if we don't
     759             :   // provide overloads whose operands are of the same type.  Can someone
     760             :   // remind me what generic programming is about? -- Gaby
     761             : 
     762             :   // Forward iterator requirements
     763             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     764             :     inline bool
     765             :     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
     766             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     767             :     { return __lhs.base() == __rhs.base(); }
     768             : 
     769             :   template<typename _Iterator, typename _Container>
     770             :     inline bool
     771    11158048 :     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
     772             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     773    11158048 :     { return __lhs.base() == __rhs.base(); }
     774             : 
     775             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     776             :     inline bool
     777         163 :     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     778             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     779         163 :     { return __lhs.base() != __rhs.base(); }
     780             : 
     781             :   template<typename _Iterator, typename _Container>
     782             :     inline bool
     783     3778798 :     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
     784             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     785     3778798 :     { return __lhs.base() != __rhs.base(); }
     786             : 
     787             :   // Random access iterator requirements
     788             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     789             :     inline bool
     790             :     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
     791             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     792             :     { return __lhs.base() < __rhs.base(); }
     793             : 
     794             :   template<typename _Iterator, typename _Container>
     795             :     inline bool
     796             :     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
     797             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     798             :     { return __lhs.base() < __rhs.base(); }
     799             : 
     800             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     801             :     inline bool
     802             :     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
     803             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     804             :     { return __lhs.base() > __rhs.base(); }
     805             : 
     806             :   template<typename _Iterator, typename _Container>
     807             :     inline bool
     808             :     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
     809             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     810             :     { return __lhs.base() > __rhs.base(); }
     811             : 
     812             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     813             :     inline bool
     814             :     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     815             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     816             :     { return __lhs.base() <= __rhs.base(); }
     817             : 
     818             :   template<typename _Iterator, typename _Container>
     819             :     inline bool
     820             :     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
     821             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     822             :     { return __lhs.base() <= __rhs.base(); }
     823             : 
     824             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     825             :     inline bool
     826             :     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
     827             :                const __normal_iterator<_IteratorR, _Container>& __rhs)
     828             :     { return __lhs.base() >= __rhs.base(); }
     829             : 
     830             :   template<typename _Iterator, typename _Container>
     831             :     inline bool
     832             :     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
     833             :                const __normal_iterator<_Iterator, _Container>& __rhs)
     834             :     { return __lhs.base() >= __rhs.base(); }
     835             : 
     836             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     837             :   // According to the resolution of DR179 not only the various comparison
     838             :   // operators but also operator- must accept mixed iterator/const_iterator
     839             :   // parameters.
     840             :   template<typename _IteratorL, typename _IteratorR, typename _Container>
     841             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     842             :     // DR 685.
     843             :     inline auto
     844             :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
     845             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     846             :     -> decltype(__lhs.base() - __rhs.base())
     847             : #else
     848             :     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
     849             :     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
     850             :               const __normal_iterator<_IteratorR, _Container>& __rhs)
     851             : #endif
     852             :     { return __lhs.base() - __rhs.base(); }
     853             : 
     854             :   template<typename _Iterator, typename _Container>
     855             :     inline typename __normal_iterator<_Iterator, _Container>::difference_type
     856     1523277 :     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
     857             :               const __normal_iterator<_Iterator, _Container>& __rhs)
     858     1523277 :     { return __lhs.base() - __rhs.base(); }
     859             : 
     860             :   template<typename _Iterator, typename _Container>
     861             :     inline __normal_iterator<_Iterator, _Container>
     862             :     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
     863             :               __n, const __normal_iterator<_Iterator, _Container>& __i)
     864             :     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
     865             : 
     866             : _GLIBCXX_END_NAMESPACE
     867             : 
     868             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     869             : 
     870             : _GLIBCXX_BEGIN_NAMESPACE(std)
     871             : 
     872             :   // 24.4.3  Move iterators
     873             :   /**
     874             :    *  Class template move_iterator is an iterator adapter with the same
     875             :    *  behavior as the underlying iterator except that its dereference
     876             :    *  operator implicitly converts the value returned by the underlying
     877             :    *  iterator's dereference operator to an rvalue reference.  Some
     878             :    *  generic algorithms can be called with move iterators to replace
     879             :    *  copying with moving.
     880             :    */
     881             :   template<typename _Iterator>
     882             :     class move_iterator
     883             :     {
     884             :     protected:
     885             :       _Iterator _M_current;
     886             : 
     887             :     public:
     888             :       typedef _Iterator                                        iterator_type;
     889             :       typedef typename iterator_traits<_Iterator>::difference_type
     890             :                                                                difference_type;
     891             :       // NB: DR 680.
     892             :       typedef _Iterator                                        pointer;
     893             :       typedef typename iterator_traits<_Iterator>::value_type  value_type;
     894             :       typedef typename iterator_traits<_Iterator>::iterator_category
     895             :                                                                iterator_category;
     896             :       typedef value_type&&                                     reference;
     897             : 
     898             :     public:
     899             :       move_iterator()
     900             :       : _M_current() { }
     901             : 
     902             :       explicit
     903             :       move_iterator(iterator_type __i)
     904             :       : _M_current(__i) { }
     905             : 
     906             :       template<typename _Iter>
     907             :         move_iterator(const move_iterator<_Iter>& __i)
     908             :         : _M_current(__i.base()) { }
     909             : 
     910             :       iterator_type
     911             :       base() const
     912             :       { return _M_current; }
     913             : 
     914             :       reference
     915             :       operator*() const
     916             :       { return *_M_current; }
     917             : 
     918             :       pointer
     919             :       operator->() const
     920             :       { return _M_current; }
     921             : 
     922             :       move_iterator&
     923             :       operator++()
     924             :       {
     925             :         ++_M_current;
     926             :         return *this;
     927             :       }
     928             : 
     929             :       move_iterator
     930             :       operator++(int)
     931             :       {
     932             :         move_iterator __tmp = *this;
     933             :         ++_M_current;
     934             :         return __tmp;
     935             :       }
     936             : 
     937             :       move_iterator&
     938             :       operator--()
     939             :       {
     940             :         --_M_current;
     941             :         return *this;
     942             :       }
     943             : 
     944             :       move_iterator
     945             :       operator--(int)
     946             :       {
     947             :         move_iterator __tmp = *this;
     948             :         --_M_current;
     949             :         return __tmp;
     950             :       }
     951             : 
     952             :       move_iterator
     953             :       operator+(difference_type __n) const
     954             :       { return move_iterator(_M_current + __n); }
     955             : 
     956             :       move_iterator&
     957             :       operator+=(difference_type __n)
     958             :       {
     959             :         _M_current += __n;
     960             :         return *this;
     961             :       }
     962             : 
     963             :       move_iterator
     964             :       operator-(difference_type __n) const
     965             :       { return move_iterator(_M_current - __n); }
     966             :     
     967             :       move_iterator&
     968             :       operator-=(difference_type __n)
     969             :       { 
     970             :         _M_current -= __n;
     971             :         return *this;
     972             :       }
     973             : 
     974             :       reference
     975             :       operator[](difference_type __n) const
     976             :       { return _M_current[__n]; }
     977             :     };
     978             : 
     979             :   template<typename _IteratorL, typename _IteratorR>
     980             :     inline bool
     981             :     operator==(const move_iterator<_IteratorL>& __x,
     982             :                const move_iterator<_IteratorR>& __y)
     983             :     { return __x.base() == __y.base(); }
     984             : 
     985             :   template<typename _IteratorL, typename _IteratorR>
     986             :     inline bool
     987             :     operator!=(const move_iterator<_IteratorL>& __x,
     988             :                const move_iterator<_IteratorR>& __y)
     989             :     { return !(__x == __y); }
     990             : 
     991             :   template<typename _IteratorL, typename _IteratorR>
     992             :     inline bool
     993             :     operator<(const move_iterator<_IteratorL>& __x,
     994             :               const move_iterator<_IteratorR>& __y)
     995             :     { return __x.base() < __y.base(); }
     996             : 
     997             :   template<typename _IteratorL, typename _IteratorR>
     998             :     inline bool
     999             :     operator<=(const move_iterator<_IteratorL>& __x,
    1000             :                const move_iterator<_IteratorR>& __y)
    1001             :     { return !(__y < __x); }
    1002             : 
    1003             :   template<typename _IteratorL, typename _IteratorR>
    1004             :     inline bool
    1005             :     operator>(const move_iterator<_IteratorL>& __x,
    1006             :               const move_iterator<_IteratorR>& __y)
    1007             :     { return __y < __x; }
    1008             : 
    1009             :   template<typename _IteratorL, typename _IteratorR>
    1010             :     inline bool
    1011             :     operator>=(const move_iterator<_IteratorL>& __x,
    1012             :                const move_iterator<_IteratorR>& __y)
    1013             :     { return !(__x < __y); }
    1014             : 
    1015             :   // DR 685.
    1016             :   template<typename _IteratorL, typename _IteratorR>
    1017             :     inline auto
    1018             :     operator-(const move_iterator<_IteratorL>& __x,
    1019             :               const move_iterator<_IteratorR>& __y)
    1020             :     -> decltype(__x.base() - __y.base())
    1021             :     { return __x.base() - __y.base(); }
    1022             : 
    1023             :   template<typename _Iterator>
    1024             :     inline move_iterator<_Iterator>
    1025             :     operator+(typename move_iterator<_Iterator>::difference_type __n,
    1026             :               const move_iterator<_Iterator>& __x)
    1027             :     { return __x + __n; }
    1028             : 
    1029             :   template<typename _Iterator>
    1030             :     inline move_iterator<_Iterator>
    1031             :     make_move_iterator(const _Iterator& __i)
    1032             :     { return move_iterator<_Iterator>(__i); }
    1033             : 
    1034             : _GLIBCXX_END_NAMESPACE
    1035             : 
    1036             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
    1037             : #else
    1038             : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
    1039             : #endif // __GXX_EXPERIMENTAL_CXX0X__
    1040             : 
    1041             : #endif

Generated by: LCOV version 1.11