xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/bits/stl_iterator.h (revision 95059079af47f9a66a175f374f2da1a5020e3255)
138fd1498Szrj // Iterators -*- C++ -*-
238fd1498Szrj 
338fd1498Szrj // Copyright (C) 2001-2018 Free Software Foundation, Inc.
438fd1498Szrj //
538fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
638fd1498Szrj // software; you can redistribute it and/or modify it under the
738fd1498Szrj // terms of the GNU General Public License as published by the
838fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
938fd1498Szrj // any later version.
1038fd1498Szrj 
1138fd1498Szrj // This library is distributed in the hope that it will be useful,
1238fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
1338fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1438fd1498Szrj // GNU General Public License for more details.
1538fd1498Szrj 
1638fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
1738fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
1838fd1498Szrj // 3.1, as published by the Free Software Foundation.
1938fd1498Szrj 
2038fd1498Szrj // You should have received a copy of the GNU General Public License and
2138fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
2238fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2338fd1498Szrj // <http://www.gnu.org/licenses/>.
2438fd1498Szrj 
2538fd1498Szrj /*
2638fd1498Szrj  *
2738fd1498Szrj  * Copyright (c) 1994
2838fd1498Szrj  * Hewlett-Packard Company
2938fd1498Szrj  *
3038fd1498Szrj  * Permission to use, copy, modify, distribute and sell this software
3138fd1498Szrj  * and its documentation for any purpose is hereby granted without fee,
3238fd1498Szrj  * provided that the above copyright notice appear in all copies and
3338fd1498Szrj  * that both that copyright notice and this permission notice appear
3438fd1498Szrj  * in supporting documentation.  Hewlett-Packard Company makes no
3538fd1498Szrj  * representations about the suitability of this software for any
3638fd1498Szrj  * purpose.  It is provided "as is" without express or implied warranty.
3738fd1498Szrj  *
3838fd1498Szrj  *
3938fd1498Szrj  * Copyright (c) 1996-1998
4038fd1498Szrj  * Silicon Graphics Computer Systems, Inc.
4138fd1498Szrj  *
4238fd1498Szrj  * Permission to use, copy, modify, distribute and sell this software
4338fd1498Szrj  * and its documentation for any purpose is hereby granted without fee,
4438fd1498Szrj  * provided that the above copyright notice appear in all copies and
4538fd1498Szrj  * that both that copyright notice and this permission notice appear
4638fd1498Szrj  * in supporting documentation.  Silicon Graphics makes no
4738fd1498Szrj  * representations about the suitability of this software for any
4838fd1498Szrj  * purpose.  It is provided "as is" without express or implied warranty.
4938fd1498Szrj  */
5038fd1498Szrj 
5138fd1498Szrj /** @file bits/stl_iterator.h
5238fd1498Szrj  *  This is an internal header file, included by other library headers.
5338fd1498Szrj  *  Do not attempt to use it directly. @headername{iterator}
5438fd1498Szrj  *
5538fd1498Szrj  *  This file implements reverse_iterator, back_insert_iterator,
5638fd1498Szrj  *  front_insert_iterator, insert_iterator, __normal_iterator, and their
5738fd1498Szrj  *  supporting functions and overloaded operators.
5838fd1498Szrj  */
5938fd1498Szrj 
6038fd1498Szrj #ifndef _STL_ITERATOR_H
6138fd1498Szrj #define _STL_ITERATOR_H 1
6238fd1498Szrj 
6338fd1498Szrj #include <bits/cpp_type_traits.h>
6438fd1498Szrj #include <ext/type_traits.h>
6538fd1498Szrj #include <bits/move.h>
6638fd1498Szrj #include <bits/ptr_traits.h>
6738fd1498Szrj 
6838fd1498Szrj #if __cplusplus > 201402L
6938fd1498Szrj # define __cpp_lib_array_constexpr 201603
7038fd1498Szrj #endif
7138fd1498Szrj 
_GLIBCXX_VISIBILITY(default)7238fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
7338fd1498Szrj {
7438fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
7538fd1498Szrj 
7638fd1498Szrj   /**
7738fd1498Szrj    * @addtogroup iterators
7838fd1498Szrj    * @{
7938fd1498Szrj    */
8038fd1498Szrj 
8138fd1498Szrj   // 24.4.1 Reverse iterators
8238fd1498Szrj   /**
8338fd1498Szrj    *  Bidirectional and random access iterators have corresponding reverse
8438fd1498Szrj    *  %iterator adaptors that iterate through the data structure in the
8538fd1498Szrj    *  opposite direction.  They have the same signatures as the corresponding
8638fd1498Szrj    *  iterators.  The fundamental relation between a reverse %iterator and its
8738fd1498Szrj    *  corresponding %iterator @c i is established by the identity:
8838fd1498Szrj    *  @code
8938fd1498Szrj    *      &*(reverse_iterator(i)) == &*(i - 1)
9038fd1498Szrj    *  @endcode
9138fd1498Szrj    *
9238fd1498Szrj    *  <em>This mapping is dictated by the fact that while there is always a
9338fd1498Szrj    *  pointer past the end of an array, there might not be a valid pointer
9438fd1498Szrj    *  before the beginning of an array.</em> [24.4.1]/1,2
9538fd1498Szrj    *
9638fd1498Szrj    *  Reverse iterators can be tricky and surprising at first.  Their
9738fd1498Szrj    *  semantics make sense, however, and the trickiness is a side effect of
9838fd1498Szrj    *  the requirement that the iterators must be safe.
9938fd1498Szrj   */
10038fd1498Szrj   template<typename _Iterator>
10138fd1498Szrj     class reverse_iterator
10238fd1498Szrj     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
10338fd1498Szrj 		      typename iterator_traits<_Iterator>::value_type,
10438fd1498Szrj 		      typename iterator_traits<_Iterator>::difference_type,
10538fd1498Szrj 		      typename iterator_traits<_Iterator>::pointer,
10638fd1498Szrj                       typename iterator_traits<_Iterator>::reference>
10738fd1498Szrj     {
10838fd1498Szrj     protected:
10938fd1498Szrj       _Iterator current;
11038fd1498Szrj 
11138fd1498Szrj       typedef iterator_traits<_Iterator>		__traits_type;
11238fd1498Szrj 
11338fd1498Szrj     public:
11438fd1498Szrj       typedef _Iterator					iterator_type;
11538fd1498Szrj       typedef typename __traits_type::difference_type	difference_type;
11638fd1498Szrj       typedef typename __traits_type::pointer		pointer;
11738fd1498Szrj       typedef typename __traits_type::reference		reference;
11838fd1498Szrj 
11938fd1498Szrj       /**
12038fd1498Szrj        *  The default constructor value-initializes member @p current.
12138fd1498Szrj        *  If it is a pointer, that means it is zero-initialized.
12238fd1498Szrj       */
12338fd1498Szrj       // _GLIBCXX_RESOLVE_LIB_DEFECTS
12438fd1498Szrj       // 235 No specification of default ctor for reverse_iterator
125*58e805e6Szrj       // 1012. reverse_iterator default ctor should value initialize
12638fd1498Szrj       _GLIBCXX17_CONSTEXPR
12738fd1498Szrj       reverse_iterator() : current() { }
12838fd1498Szrj 
12938fd1498Szrj       /**
13038fd1498Szrj        *  This %iterator will move in the opposite direction that @p x does.
13138fd1498Szrj       */
13238fd1498Szrj       explicit _GLIBCXX17_CONSTEXPR
13338fd1498Szrj       reverse_iterator(iterator_type __x) : current(__x) { }
13438fd1498Szrj 
13538fd1498Szrj       /**
13638fd1498Szrj        *  The copy constructor is normal.
13738fd1498Szrj       */
13838fd1498Szrj       _GLIBCXX17_CONSTEXPR
13938fd1498Szrj       reverse_iterator(const reverse_iterator& __x)
14038fd1498Szrj       : current(__x.current) { }
14138fd1498Szrj 
14238fd1498Szrj       /**
14338fd1498Szrj        *  A %reverse_iterator across other types can be copied if the
14438fd1498Szrj        *  underlying %iterator can be converted to the type of @c current.
14538fd1498Szrj       */
14638fd1498Szrj       template<typename _Iter>
14738fd1498Szrj 	_GLIBCXX17_CONSTEXPR
14838fd1498Szrj         reverse_iterator(const reverse_iterator<_Iter>& __x)
14938fd1498Szrj 	: current(__x.base()) { }
15038fd1498Szrj 
15138fd1498Szrj       /**
15238fd1498Szrj        *  @return  @c current, the %iterator used for underlying work.
15338fd1498Szrj       */
15438fd1498Szrj       _GLIBCXX17_CONSTEXPR iterator_type
15538fd1498Szrj       base() const
15638fd1498Szrj       { return current; }
15738fd1498Szrj 
15838fd1498Szrj       /**
15938fd1498Szrj        *  @return  A reference to the value at @c --current
16038fd1498Szrj        *
16138fd1498Szrj        *  This requires that @c --current is dereferenceable.
16238fd1498Szrj        *
16338fd1498Szrj        *  @warning This implementation requires that for an iterator of the
16438fd1498Szrj        *           underlying iterator type, @c x, a reference obtained by
16538fd1498Szrj        *           @c *x remains valid after @c x has been modified or
16638fd1498Szrj        *           destroyed. This is a bug: http://gcc.gnu.org/PR51823
16738fd1498Szrj       */
16838fd1498Szrj       _GLIBCXX17_CONSTEXPR reference
16938fd1498Szrj       operator*() const
17038fd1498Szrj       {
17138fd1498Szrj 	_Iterator __tmp = current;
17238fd1498Szrj 	return *--__tmp;
17338fd1498Szrj       }
17438fd1498Szrj 
17538fd1498Szrj       /**
17638fd1498Szrj        *  @return  A pointer to the value at @c --current
17738fd1498Szrj        *
17838fd1498Szrj        *  This requires that @c --current is dereferenceable.
17938fd1498Szrj       */
180*58e805e6Szrj       // _GLIBCXX_RESOLVE_LIB_DEFECTS
181*58e805e6Szrj       // 2188. Reverse iterator does not fully support targets that overload &
18238fd1498Szrj       _GLIBCXX17_CONSTEXPR pointer
18338fd1498Szrj       operator->() const
184*58e805e6Szrj       { return std::__addressof(operator*()); }
18538fd1498Szrj 
18638fd1498Szrj       /**
18738fd1498Szrj        *  @return  @c *this
18838fd1498Szrj        *
18938fd1498Szrj        *  Decrements the underlying iterator.
19038fd1498Szrj       */
19138fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator&
19238fd1498Szrj       operator++()
19338fd1498Szrj       {
19438fd1498Szrj 	--current;
19538fd1498Szrj 	return *this;
19638fd1498Szrj       }
19738fd1498Szrj 
19838fd1498Szrj       /**
19938fd1498Szrj        *  @return  The original value of @c *this
20038fd1498Szrj        *
20138fd1498Szrj        *  Decrements the underlying iterator.
20238fd1498Szrj       */
20338fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator
20438fd1498Szrj       operator++(int)
20538fd1498Szrj       {
20638fd1498Szrj 	reverse_iterator __tmp = *this;
20738fd1498Szrj 	--current;
20838fd1498Szrj 	return __tmp;
20938fd1498Szrj       }
21038fd1498Szrj 
21138fd1498Szrj       /**
21238fd1498Szrj        *  @return  @c *this
21338fd1498Szrj        *
21438fd1498Szrj        *  Increments the underlying iterator.
21538fd1498Szrj       */
21638fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator&
21738fd1498Szrj       operator--()
21838fd1498Szrj       {
21938fd1498Szrj 	++current;
22038fd1498Szrj 	return *this;
22138fd1498Szrj       }
22238fd1498Szrj 
22338fd1498Szrj       /**
22438fd1498Szrj        *  @return  A reverse_iterator with the previous value of @c *this
22538fd1498Szrj        *
22638fd1498Szrj        *  Increments the underlying iterator.
22738fd1498Szrj       */
22838fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator
22938fd1498Szrj       operator--(int)
23038fd1498Szrj       {
23138fd1498Szrj 	reverse_iterator __tmp = *this;
23238fd1498Szrj 	++current;
23338fd1498Szrj 	return __tmp;
23438fd1498Szrj       }
23538fd1498Szrj 
23638fd1498Szrj       /**
23738fd1498Szrj        *  @return  A reverse_iterator that refers to @c current - @a __n
23838fd1498Szrj        *
23938fd1498Szrj        *  The underlying iterator must be a Random Access Iterator.
24038fd1498Szrj       */
24138fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator
24238fd1498Szrj       operator+(difference_type __n) const
24338fd1498Szrj       { return reverse_iterator(current - __n); }
24438fd1498Szrj 
24538fd1498Szrj       /**
24638fd1498Szrj        *  @return  *this
24738fd1498Szrj        *
24838fd1498Szrj        *  Moves the underlying iterator backwards @a __n steps.
24938fd1498Szrj        *  The underlying iterator must be a Random Access Iterator.
25038fd1498Szrj       */
25138fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator&
25238fd1498Szrj       operator+=(difference_type __n)
25338fd1498Szrj       {
25438fd1498Szrj 	current -= __n;
25538fd1498Szrj 	return *this;
25638fd1498Szrj       }
25738fd1498Szrj 
25838fd1498Szrj       /**
25938fd1498Szrj        *  @return  A reverse_iterator that refers to @c current - @a __n
26038fd1498Szrj        *
26138fd1498Szrj        *  The underlying iterator must be a Random Access Iterator.
26238fd1498Szrj       */
26338fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator
26438fd1498Szrj       operator-(difference_type __n) const
26538fd1498Szrj       { return reverse_iterator(current + __n); }
26638fd1498Szrj 
26738fd1498Szrj       /**
26838fd1498Szrj        *  @return  *this
26938fd1498Szrj        *
27038fd1498Szrj        *  Moves the underlying iterator forwards @a __n steps.
27138fd1498Szrj        *  The underlying iterator must be a Random Access Iterator.
27238fd1498Szrj       */
27338fd1498Szrj       _GLIBCXX17_CONSTEXPR reverse_iterator&
27438fd1498Szrj       operator-=(difference_type __n)
27538fd1498Szrj       {
27638fd1498Szrj 	current += __n;
27738fd1498Szrj 	return *this;
27838fd1498Szrj       }
27938fd1498Szrj 
28038fd1498Szrj       /**
28138fd1498Szrj        *  @return  The value at @c current - @a __n - 1
28238fd1498Szrj        *
28338fd1498Szrj        *  The underlying iterator must be a Random Access Iterator.
28438fd1498Szrj       */
28538fd1498Szrj       _GLIBCXX17_CONSTEXPR reference
28638fd1498Szrj       operator[](difference_type __n) const
28738fd1498Szrj       { return *(*this + __n); }
28838fd1498Szrj     };
28938fd1498Szrj 
29038fd1498Szrj   //@{
29138fd1498Szrj   /**
29238fd1498Szrj    *  @param  __x  A %reverse_iterator.
29338fd1498Szrj    *  @param  __y  A %reverse_iterator.
29438fd1498Szrj    *  @return  A simple bool.
29538fd1498Szrj    *
29638fd1498Szrj    *  Reverse iterators forward many operations to their underlying base()
29738fd1498Szrj    *  iterators.  Others are implemented in terms of one another.
29838fd1498Szrj    *
29938fd1498Szrj   */
30038fd1498Szrj   template<typename _Iterator>
30138fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
30238fd1498Szrj     operator==(const reverse_iterator<_Iterator>& __x,
30338fd1498Szrj 	       const reverse_iterator<_Iterator>& __y)
30438fd1498Szrj     { return __x.base() == __y.base(); }
30538fd1498Szrj 
30638fd1498Szrj   template<typename _Iterator>
30738fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
30838fd1498Szrj     operator<(const reverse_iterator<_Iterator>& __x,
30938fd1498Szrj 	      const reverse_iterator<_Iterator>& __y)
31038fd1498Szrj     { return __y.base() < __x.base(); }
31138fd1498Szrj 
31238fd1498Szrj   template<typename _Iterator>
31338fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
31438fd1498Szrj     operator!=(const reverse_iterator<_Iterator>& __x,
31538fd1498Szrj 	       const reverse_iterator<_Iterator>& __y)
31638fd1498Szrj     { return !(__x == __y); }
31738fd1498Szrj 
31838fd1498Szrj   template<typename _Iterator>
31938fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
32038fd1498Szrj     operator>(const reverse_iterator<_Iterator>& __x,
32138fd1498Szrj 	      const reverse_iterator<_Iterator>& __y)
32238fd1498Szrj     { return __y < __x; }
32338fd1498Szrj 
32438fd1498Szrj   template<typename _Iterator>
32538fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
32638fd1498Szrj     operator<=(const reverse_iterator<_Iterator>& __x,
32738fd1498Szrj 	       const reverse_iterator<_Iterator>& __y)
32838fd1498Szrj     { return !(__y < __x); }
32938fd1498Szrj 
33038fd1498Szrj   template<typename _Iterator>
33138fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
33238fd1498Szrj     operator>=(const reverse_iterator<_Iterator>& __x,
33338fd1498Szrj 	       const reverse_iterator<_Iterator>& __y)
33438fd1498Szrj     { return !(__x < __y); }
33538fd1498Szrj 
33638fd1498Szrj   // _GLIBCXX_RESOLVE_LIB_DEFECTS
33738fd1498Szrj   // DR 280. Comparison of reverse_iterator to const reverse_iterator.
33838fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
33938fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
34038fd1498Szrj     operator==(const reverse_iterator<_IteratorL>& __x,
34138fd1498Szrj 	       const reverse_iterator<_IteratorR>& __y)
34238fd1498Szrj     { return __x.base() == __y.base(); }
34338fd1498Szrj 
34438fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
34538fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
34638fd1498Szrj     operator<(const reverse_iterator<_IteratorL>& __x,
34738fd1498Szrj 	      const reverse_iterator<_IteratorR>& __y)
34838fd1498Szrj     { return __y.base() < __x.base(); }
34938fd1498Szrj 
35038fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
35138fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
35238fd1498Szrj     operator!=(const reverse_iterator<_IteratorL>& __x,
35338fd1498Szrj 	       const reverse_iterator<_IteratorR>& __y)
35438fd1498Szrj     { return !(__x == __y); }
35538fd1498Szrj 
35638fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
35738fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
35838fd1498Szrj     operator>(const reverse_iterator<_IteratorL>& __x,
35938fd1498Szrj 	      const reverse_iterator<_IteratorR>& __y)
36038fd1498Szrj     { return __y < __x; }
36138fd1498Szrj 
36238fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
36338fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
36438fd1498Szrj     operator<=(const reverse_iterator<_IteratorL>& __x,
36538fd1498Szrj 	       const reverse_iterator<_IteratorR>& __y)
36638fd1498Szrj     { return !(__y < __x); }
36738fd1498Szrj 
36838fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
36938fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
37038fd1498Szrj     operator>=(const reverse_iterator<_IteratorL>& __x,
37138fd1498Szrj 	       const reverse_iterator<_IteratorR>& __y)
37238fd1498Szrj     { return !(__x < __y); }
37338fd1498Szrj   //@}
37438fd1498Szrj 
37538fd1498Szrj #if __cplusplus < 201103L
37638fd1498Szrj   template<typename _Iterator>
37738fd1498Szrj     inline typename reverse_iterator<_Iterator>::difference_type
37838fd1498Szrj     operator-(const reverse_iterator<_Iterator>& __x,
37938fd1498Szrj 	      const reverse_iterator<_Iterator>& __y)
38038fd1498Szrj     { return __y.base() - __x.base(); }
38138fd1498Szrj 
38238fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
38338fd1498Szrj     inline typename reverse_iterator<_IteratorL>::difference_type
38438fd1498Szrj     operator-(const reverse_iterator<_IteratorL>& __x,
38538fd1498Szrj 	      const reverse_iterator<_IteratorR>& __y)
38638fd1498Szrj     { return __y.base() - __x.base(); }
38738fd1498Szrj #else
38838fd1498Szrj   // _GLIBCXX_RESOLVE_LIB_DEFECTS
38938fd1498Szrj   // DR 685. reverse_iterator/move_iterator difference has invalid signatures
39038fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
39138fd1498Szrj     inline _GLIBCXX17_CONSTEXPR auto
39238fd1498Szrj     operator-(const reverse_iterator<_IteratorL>& __x,
39338fd1498Szrj 	      const reverse_iterator<_IteratorR>& __y)
39438fd1498Szrj     -> decltype(__y.base() - __x.base())
39538fd1498Szrj     { return __y.base() - __x.base(); }
39638fd1498Szrj #endif
39738fd1498Szrj 
39838fd1498Szrj   template<typename _Iterator>
39938fd1498Szrj     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
40038fd1498Szrj     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
40138fd1498Szrj 	      const reverse_iterator<_Iterator>& __x)
40238fd1498Szrj     { return reverse_iterator<_Iterator>(__x.base() - __n); }
40338fd1498Szrj 
40438fd1498Szrj #if __cplusplus >= 201103L
40538fd1498Szrj   // Same as C++14 make_reverse_iterator but used in C++03 mode too.
40638fd1498Szrj   template<typename _Iterator>
40738fd1498Szrj     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
40838fd1498Szrj     __make_reverse_iterator(_Iterator __i)
40938fd1498Szrj     { return reverse_iterator<_Iterator>(__i); }
41038fd1498Szrj 
41138fd1498Szrj # if __cplusplus > 201103L
41238fd1498Szrj #  define __cpp_lib_make_reverse_iterator 201402
41338fd1498Szrj 
41438fd1498Szrj   // _GLIBCXX_RESOLVE_LIB_DEFECTS
41538fd1498Szrj   // DR 2285. make_reverse_iterator
41638fd1498Szrj   /// Generator function for reverse_iterator.
41738fd1498Szrj   template<typename _Iterator>
41838fd1498Szrj     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
41938fd1498Szrj     make_reverse_iterator(_Iterator __i)
42038fd1498Szrj     { return reverse_iterator<_Iterator>(__i); }
42138fd1498Szrj # endif
42238fd1498Szrj #endif
42338fd1498Szrj 
42438fd1498Szrj #if __cplusplus >= 201103L
42538fd1498Szrj   template<typename _Iterator>
42638fd1498Szrj     auto
42738fd1498Szrj     __niter_base(reverse_iterator<_Iterator> __it)
42838fd1498Szrj     -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
42938fd1498Szrj     { return __make_reverse_iterator(__niter_base(__it.base())); }
43038fd1498Szrj 
43138fd1498Szrj   template<typename _Iterator>
43238fd1498Szrj     struct __is_move_iterator<reverse_iterator<_Iterator> >
43338fd1498Szrj       : __is_move_iterator<_Iterator>
43438fd1498Szrj     { };
43538fd1498Szrj 
43638fd1498Szrj   template<typename _Iterator>
43738fd1498Szrj     auto
43838fd1498Szrj     __miter_base(reverse_iterator<_Iterator> __it)
43938fd1498Szrj     -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
44038fd1498Szrj     { return __make_reverse_iterator(__miter_base(__it.base())); }
44138fd1498Szrj #endif
44238fd1498Szrj 
44338fd1498Szrj   // 24.4.2.2.1 back_insert_iterator
44438fd1498Szrj   /**
44538fd1498Szrj    *  @brief  Turns assignment into insertion.
44638fd1498Szrj    *
44738fd1498Szrj    *  These are output iterators, constructed from a container-of-T.
44838fd1498Szrj    *  Assigning a T to the iterator appends it to the container using
44938fd1498Szrj    *  push_back.
45038fd1498Szrj    *
45138fd1498Szrj    *  Tip:  Using the back_inserter function to create these iterators can
45238fd1498Szrj    *  save typing.
45338fd1498Szrj   */
45438fd1498Szrj   template<typename _Container>
45538fd1498Szrj     class back_insert_iterator
45638fd1498Szrj     : public iterator<output_iterator_tag, void, void, void, void>
45738fd1498Szrj     {
45838fd1498Szrj     protected:
45938fd1498Szrj       _Container* container;
46038fd1498Szrj 
46138fd1498Szrj     public:
46238fd1498Szrj       /// A nested typedef for the type of whatever container you used.
46338fd1498Szrj       typedef _Container          container_type;
46438fd1498Szrj 
46538fd1498Szrj       /// The only way to create this %iterator is with a container.
46638fd1498Szrj       explicit
46738fd1498Szrj       back_insert_iterator(_Container& __x)
46838fd1498Szrj       : container(std::__addressof(__x)) { }
46938fd1498Szrj 
47038fd1498Szrj       /**
47138fd1498Szrj        *  @param  __value  An instance of whatever type
47238fd1498Szrj        *                 container_type::const_reference is; presumably a
47338fd1498Szrj        *                 reference-to-const T for container<T>.
47438fd1498Szrj        *  @return  This %iterator, for chained operations.
47538fd1498Szrj        *
47638fd1498Szrj        *  This kind of %iterator doesn't really have a @a position in the
47738fd1498Szrj        *  container (you can think of the position as being permanently at
47838fd1498Szrj        *  the end, if you like).  Assigning a value to the %iterator will
47938fd1498Szrj        *  always append the value to the end of the container.
48038fd1498Szrj       */
48138fd1498Szrj #if __cplusplus < 201103L
48238fd1498Szrj       back_insert_iterator&
48338fd1498Szrj       operator=(typename _Container::const_reference __value)
48438fd1498Szrj       {
48538fd1498Szrj 	container->push_back(__value);
48638fd1498Szrj 	return *this;
48738fd1498Szrj       }
48838fd1498Szrj #else
48938fd1498Szrj       back_insert_iterator&
49038fd1498Szrj       operator=(const typename _Container::value_type& __value)
49138fd1498Szrj       {
49238fd1498Szrj 	container->push_back(__value);
49338fd1498Szrj 	return *this;
49438fd1498Szrj       }
49538fd1498Szrj 
49638fd1498Szrj       back_insert_iterator&
49738fd1498Szrj       operator=(typename _Container::value_type&& __value)
49838fd1498Szrj       {
49938fd1498Szrj 	container->push_back(std::move(__value));
50038fd1498Szrj 	return *this;
50138fd1498Szrj       }
50238fd1498Szrj #endif
50338fd1498Szrj 
50438fd1498Szrj       /// Simply returns *this.
50538fd1498Szrj       back_insert_iterator&
50638fd1498Szrj       operator*()
50738fd1498Szrj       { return *this; }
50838fd1498Szrj 
50938fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
51038fd1498Szrj       back_insert_iterator&
51138fd1498Szrj       operator++()
51238fd1498Szrj       { return *this; }
51338fd1498Szrj 
51438fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
51538fd1498Szrj       back_insert_iterator
51638fd1498Szrj       operator++(int)
51738fd1498Szrj       { return *this; }
51838fd1498Szrj     };
51938fd1498Szrj 
52038fd1498Szrj   /**
52138fd1498Szrj    *  @param  __x  A container of arbitrary type.
52238fd1498Szrj    *  @return  An instance of back_insert_iterator working on @p __x.
52338fd1498Szrj    *
52438fd1498Szrj    *  This wrapper function helps in creating back_insert_iterator instances.
52538fd1498Szrj    *  Typing the name of the %iterator requires knowing the precise full
52638fd1498Szrj    *  type of the container, which can be tedious and impedes generic
52738fd1498Szrj    *  programming.  Using this function lets you take advantage of automatic
52838fd1498Szrj    *  template parameter deduction, making the compiler match the correct
52938fd1498Szrj    *  types for you.
53038fd1498Szrj   */
53138fd1498Szrj   template<typename _Container>
53238fd1498Szrj     inline back_insert_iterator<_Container>
53338fd1498Szrj     back_inserter(_Container& __x)
53438fd1498Szrj     { return back_insert_iterator<_Container>(__x); }
53538fd1498Szrj 
53638fd1498Szrj   /**
53738fd1498Szrj    *  @brief  Turns assignment into insertion.
53838fd1498Szrj    *
53938fd1498Szrj    *  These are output iterators, constructed from a container-of-T.
54038fd1498Szrj    *  Assigning a T to the iterator prepends it to the container using
54138fd1498Szrj    *  push_front.
54238fd1498Szrj    *
54338fd1498Szrj    *  Tip:  Using the front_inserter function to create these iterators can
54438fd1498Szrj    *  save typing.
54538fd1498Szrj   */
54638fd1498Szrj   template<typename _Container>
54738fd1498Szrj     class front_insert_iterator
54838fd1498Szrj     : public iterator<output_iterator_tag, void, void, void, void>
54938fd1498Szrj     {
55038fd1498Szrj     protected:
55138fd1498Szrj       _Container* container;
55238fd1498Szrj 
55338fd1498Szrj     public:
55438fd1498Szrj       /// A nested typedef for the type of whatever container you used.
55538fd1498Szrj       typedef _Container          container_type;
55638fd1498Szrj 
55738fd1498Szrj       /// The only way to create this %iterator is with a container.
55838fd1498Szrj       explicit front_insert_iterator(_Container& __x)
55938fd1498Szrj       : container(std::__addressof(__x)) { }
56038fd1498Szrj 
56138fd1498Szrj       /**
56238fd1498Szrj        *  @param  __value  An instance of whatever type
56338fd1498Szrj        *                 container_type::const_reference is; presumably a
56438fd1498Szrj        *                 reference-to-const T for container<T>.
56538fd1498Szrj        *  @return  This %iterator, for chained operations.
56638fd1498Szrj        *
56738fd1498Szrj        *  This kind of %iterator doesn't really have a @a position in the
56838fd1498Szrj        *  container (you can think of the position as being permanently at
56938fd1498Szrj        *  the front, if you like).  Assigning a value to the %iterator will
57038fd1498Szrj        *  always prepend the value to the front of the container.
57138fd1498Szrj       */
57238fd1498Szrj #if __cplusplus < 201103L
57338fd1498Szrj       front_insert_iterator&
57438fd1498Szrj       operator=(typename _Container::const_reference __value)
57538fd1498Szrj       {
57638fd1498Szrj 	container->push_front(__value);
57738fd1498Szrj 	return *this;
57838fd1498Szrj       }
57938fd1498Szrj #else
58038fd1498Szrj       front_insert_iterator&
58138fd1498Szrj       operator=(const typename _Container::value_type& __value)
58238fd1498Szrj       {
58338fd1498Szrj 	container->push_front(__value);
58438fd1498Szrj 	return *this;
58538fd1498Szrj       }
58638fd1498Szrj 
58738fd1498Szrj       front_insert_iterator&
58838fd1498Szrj       operator=(typename _Container::value_type&& __value)
58938fd1498Szrj       {
59038fd1498Szrj 	container->push_front(std::move(__value));
59138fd1498Szrj 	return *this;
59238fd1498Szrj       }
59338fd1498Szrj #endif
59438fd1498Szrj 
59538fd1498Szrj       /// Simply returns *this.
59638fd1498Szrj       front_insert_iterator&
59738fd1498Szrj       operator*()
59838fd1498Szrj       { return *this; }
59938fd1498Szrj 
60038fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
60138fd1498Szrj       front_insert_iterator&
60238fd1498Szrj       operator++()
60338fd1498Szrj       { return *this; }
60438fd1498Szrj 
60538fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
60638fd1498Szrj       front_insert_iterator
60738fd1498Szrj       operator++(int)
60838fd1498Szrj       { return *this; }
60938fd1498Szrj     };
61038fd1498Szrj 
61138fd1498Szrj   /**
61238fd1498Szrj    *  @param  __x  A container of arbitrary type.
61338fd1498Szrj    *  @return  An instance of front_insert_iterator working on @p x.
61438fd1498Szrj    *
61538fd1498Szrj    *  This wrapper function helps in creating front_insert_iterator instances.
61638fd1498Szrj    *  Typing the name of the %iterator requires knowing the precise full
61738fd1498Szrj    *  type of the container, which can be tedious and impedes generic
61838fd1498Szrj    *  programming.  Using this function lets you take advantage of automatic
61938fd1498Szrj    *  template parameter deduction, making the compiler match the correct
62038fd1498Szrj    *  types for you.
62138fd1498Szrj   */
62238fd1498Szrj   template<typename _Container>
62338fd1498Szrj     inline front_insert_iterator<_Container>
62438fd1498Szrj     front_inserter(_Container& __x)
62538fd1498Szrj     { return front_insert_iterator<_Container>(__x); }
62638fd1498Szrj 
62738fd1498Szrj   /**
62838fd1498Szrj    *  @brief  Turns assignment into insertion.
62938fd1498Szrj    *
63038fd1498Szrj    *  These are output iterators, constructed from a container-of-T.
63138fd1498Szrj    *  Assigning a T to the iterator inserts it in the container at the
63238fd1498Szrj    *  %iterator's position, rather than overwriting the value at that
63338fd1498Szrj    *  position.
63438fd1498Szrj    *
63538fd1498Szrj    *  (Sequences will actually insert a @e copy of the value before the
63638fd1498Szrj    *  %iterator's position.)
63738fd1498Szrj    *
63838fd1498Szrj    *  Tip:  Using the inserter function to create these iterators can
63938fd1498Szrj    *  save typing.
64038fd1498Szrj   */
64138fd1498Szrj   template<typename _Container>
64238fd1498Szrj     class insert_iterator
64338fd1498Szrj     : public iterator<output_iterator_tag, void, void, void, void>
64438fd1498Szrj     {
64538fd1498Szrj     protected:
64638fd1498Szrj       _Container* container;
64738fd1498Szrj       typename _Container::iterator iter;
64838fd1498Szrj 
64938fd1498Szrj     public:
65038fd1498Szrj       /// A nested typedef for the type of whatever container you used.
65138fd1498Szrj       typedef _Container          container_type;
65238fd1498Szrj 
65338fd1498Szrj       /**
65438fd1498Szrj        *  The only way to create this %iterator is with a container and an
65538fd1498Szrj        *  initial position (a normal %iterator into the container).
65638fd1498Szrj       */
65738fd1498Szrj       insert_iterator(_Container& __x, typename _Container::iterator __i)
65838fd1498Szrj       : container(std::__addressof(__x)), iter(__i) {}
65938fd1498Szrj 
66038fd1498Szrj       /**
66138fd1498Szrj        *  @param  __value  An instance of whatever type
66238fd1498Szrj        *                 container_type::const_reference is; presumably a
66338fd1498Szrj        *                 reference-to-const T for container<T>.
66438fd1498Szrj        *  @return  This %iterator, for chained operations.
66538fd1498Szrj        *
66638fd1498Szrj        *  This kind of %iterator maintains its own position in the
66738fd1498Szrj        *  container.  Assigning a value to the %iterator will insert the
66838fd1498Szrj        *  value into the container at the place before the %iterator.
66938fd1498Szrj        *
67038fd1498Szrj        *  The position is maintained such that subsequent assignments will
67138fd1498Szrj        *  insert values immediately after one another.  For example,
67238fd1498Szrj        *  @code
67338fd1498Szrj        *     // vector v contains A and Z
67438fd1498Szrj        *
67538fd1498Szrj        *     insert_iterator i (v, ++v.begin());
67638fd1498Szrj        *     i = 1;
67738fd1498Szrj        *     i = 2;
67838fd1498Szrj        *     i = 3;
67938fd1498Szrj        *
68038fd1498Szrj        *     // vector v contains A, 1, 2, 3, and Z
68138fd1498Szrj        *  @endcode
68238fd1498Szrj       */
68338fd1498Szrj #if __cplusplus < 201103L
68438fd1498Szrj       insert_iterator&
68538fd1498Szrj       operator=(typename _Container::const_reference __value)
68638fd1498Szrj       {
68738fd1498Szrj 	iter = container->insert(iter, __value);
68838fd1498Szrj 	++iter;
68938fd1498Szrj 	return *this;
69038fd1498Szrj       }
69138fd1498Szrj #else
69238fd1498Szrj       insert_iterator&
69338fd1498Szrj       operator=(const typename _Container::value_type& __value)
69438fd1498Szrj       {
69538fd1498Szrj 	iter = container->insert(iter, __value);
69638fd1498Szrj 	++iter;
69738fd1498Szrj 	return *this;
69838fd1498Szrj       }
69938fd1498Szrj 
70038fd1498Szrj       insert_iterator&
70138fd1498Szrj       operator=(typename _Container::value_type&& __value)
70238fd1498Szrj       {
70338fd1498Szrj 	iter = container->insert(iter, std::move(__value));
70438fd1498Szrj 	++iter;
70538fd1498Szrj 	return *this;
70638fd1498Szrj       }
70738fd1498Szrj #endif
70838fd1498Szrj 
70938fd1498Szrj       /// Simply returns *this.
71038fd1498Szrj       insert_iterator&
71138fd1498Szrj       operator*()
71238fd1498Szrj       { return *this; }
71338fd1498Szrj 
71438fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
71538fd1498Szrj       insert_iterator&
71638fd1498Szrj       operator++()
71738fd1498Szrj       { return *this; }
71838fd1498Szrj 
71938fd1498Szrj       /// Simply returns *this.  (This %iterator does not @a move.)
72038fd1498Szrj       insert_iterator&
72138fd1498Szrj       operator++(int)
72238fd1498Szrj       { return *this; }
72338fd1498Szrj     };
72438fd1498Szrj 
72538fd1498Szrj   /**
72638fd1498Szrj    *  @param __x  A container of arbitrary type.
72738fd1498Szrj    *  @param __i  An iterator into the container.
72838fd1498Szrj    *  @return  An instance of insert_iterator working on @p __x.
72938fd1498Szrj    *
73038fd1498Szrj    *  This wrapper function helps in creating insert_iterator instances.
73138fd1498Szrj    *  Typing the name of the %iterator requires knowing the precise full
73238fd1498Szrj    *  type of the container, which can be tedious and impedes generic
73338fd1498Szrj    *  programming.  Using this function lets you take advantage of automatic
73438fd1498Szrj    *  template parameter deduction, making the compiler match the correct
73538fd1498Szrj    *  types for you.
73638fd1498Szrj   */
73738fd1498Szrj   template<typename _Container, typename _Iterator>
73838fd1498Szrj     inline insert_iterator<_Container>
73938fd1498Szrj     inserter(_Container& __x, _Iterator __i)
74038fd1498Szrj     {
74138fd1498Szrj       return insert_iterator<_Container>(__x,
74238fd1498Szrj 					 typename _Container::iterator(__i));
74338fd1498Szrj     }
74438fd1498Szrj 
74538fd1498Szrj   // @} group iterators
74638fd1498Szrj 
74738fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
74838fd1498Szrj } // namespace
74938fd1498Szrj 
75038fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
75138fd1498Szrj {
75238fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
75338fd1498Szrj 
75438fd1498Szrj   // This iterator adapter is @a normal in the sense that it does not
75538fd1498Szrj   // change the semantics of any of the operators of its iterator
75638fd1498Szrj   // parameter.  Its primary purpose is to convert an iterator that is
75738fd1498Szrj   // not a class, e.g. a pointer, into an iterator that is a class.
75838fd1498Szrj   // The _Container parameter exists solely so that different containers
75938fd1498Szrj   // using this template can instantiate different types, even if the
76038fd1498Szrj   // _Iterator parameter is the same.
76138fd1498Szrj   using std::iterator_traits;
76238fd1498Szrj   using std::iterator;
76338fd1498Szrj   template<typename _Iterator, typename _Container>
76438fd1498Szrj     class __normal_iterator
76538fd1498Szrj     {
76638fd1498Szrj     protected:
76738fd1498Szrj       _Iterator _M_current;
76838fd1498Szrj 
76938fd1498Szrj       typedef iterator_traits<_Iterator>		__traits_type;
77038fd1498Szrj 
77138fd1498Szrj     public:
77238fd1498Szrj       typedef _Iterator					iterator_type;
77338fd1498Szrj       typedef typename __traits_type::iterator_category iterator_category;
77438fd1498Szrj       typedef typename __traits_type::value_type  	value_type;
77538fd1498Szrj       typedef typename __traits_type::difference_type 	difference_type;
77638fd1498Szrj       typedef typename __traits_type::reference 	reference;
77738fd1498Szrj       typedef typename __traits_type::pointer   	pointer;
77838fd1498Szrj 
77938fd1498Szrj       _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
78038fd1498Szrj       : _M_current(_Iterator()) { }
78138fd1498Szrj 
78238fd1498Szrj       explicit
78338fd1498Szrj       __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
78438fd1498Szrj       : _M_current(__i) { }
78538fd1498Szrj 
78638fd1498Szrj       // Allow iterator to const_iterator conversion
78738fd1498Szrj       template<typename _Iter>
78838fd1498Szrj         __normal_iterator(const __normal_iterator<_Iter,
78938fd1498Szrj 			  typename __enable_if<
79038fd1498Szrj       	       (std::__are_same<_Iter, typename _Container::pointer>::__value),
79138fd1498Szrj 		      _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
79238fd1498Szrj         : _M_current(__i.base()) { }
79338fd1498Szrj 
79438fd1498Szrj       // Forward iterator requirements
79538fd1498Szrj       reference
79638fd1498Szrj       operator*() const _GLIBCXX_NOEXCEPT
79738fd1498Szrj       { return *_M_current; }
79838fd1498Szrj 
79938fd1498Szrj       pointer
80038fd1498Szrj       operator->() const _GLIBCXX_NOEXCEPT
80138fd1498Szrj       { return _M_current; }
80238fd1498Szrj 
80338fd1498Szrj       __normal_iterator&
80438fd1498Szrj       operator++() _GLIBCXX_NOEXCEPT
80538fd1498Szrj       {
80638fd1498Szrj 	++_M_current;
80738fd1498Szrj 	return *this;
80838fd1498Szrj       }
80938fd1498Szrj 
81038fd1498Szrj       __normal_iterator
81138fd1498Szrj       operator++(int) _GLIBCXX_NOEXCEPT
81238fd1498Szrj       { return __normal_iterator(_M_current++); }
81338fd1498Szrj 
81438fd1498Szrj       // Bidirectional iterator requirements
81538fd1498Szrj       __normal_iterator&
81638fd1498Szrj       operator--() _GLIBCXX_NOEXCEPT
81738fd1498Szrj       {
81838fd1498Szrj 	--_M_current;
81938fd1498Szrj 	return *this;
82038fd1498Szrj       }
82138fd1498Szrj 
82238fd1498Szrj       __normal_iterator
82338fd1498Szrj       operator--(int) _GLIBCXX_NOEXCEPT
82438fd1498Szrj       { return __normal_iterator(_M_current--); }
82538fd1498Szrj 
82638fd1498Szrj       // Random access iterator requirements
82738fd1498Szrj       reference
82838fd1498Szrj       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
82938fd1498Szrj       { return _M_current[__n]; }
83038fd1498Szrj 
83138fd1498Szrj       __normal_iterator&
83238fd1498Szrj       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
83338fd1498Szrj       { _M_current += __n; return *this; }
83438fd1498Szrj 
83538fd1498Szrj       __normal_iterator
83638fd1498Szrj       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
83738fd1498Szrj       { return __normal_iterator(_M_current + __n); }
83838fd1498Szrj 
83938fd1498Szrj       __normal_iterator&
84038fd1498Szrj       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
84138fd1498Szrj       { _M_current -= __n; return *this; }
84238fd1498Szrj 
84338fd1498Szrj       __normal_iterator
84438fd1498Szrj       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
84538fd1498Szrj       { return __normal_iterator(_M_current - __n); }
84638fd1498Szrj 
84738fd1498Szrj       const _Iterator&
84838fd1498Szrj       base() const _GLIBCXX_NOEXCEPT
84938fd1498Szrj       { return _M_current; }
85038fd1498Szrj     };
85138fd1498Szrj 
85238fd1498Szrj   // Note: In what follows, the left- and right-hand-side iterators are
85338fd1498Szrj   // allowed to vary in types (conceptually in cv-qualification) so that
85438fd1498Szrj   // comparison between cv-qualified and non-cv-qualified iterators be
85538fd1498Szrj   // valid.  However, the greedy and unfriendly operators in std::rel_ops
85638fd1498Szrj   // will make overload resolution ambiguous (when in scope) if we don't
85738fd1498Szrj   // provide overloads whose operands are of the same type.  Can someone
85838fd1498Szrj   // remind me what generic programming is about? -- Gaby
85938fd1498Szrj 
86038fd1498Szrj   // Forward iterator requirements
86138fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
86238fd1498Szrj     inline bool
86338fd1498Szrj     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
86438fd1498Szrj 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
86538fd1498Szrj     _GLIBCXX_NOEXCEPT
86638fd1498Szrj     { return __lhs.base() == __rhs.base(); }
86738fd1498Szrj 
86838fd1498Szrj   template<typename _Iterator, typename _Container>
86938fd1498Szrj     inline bool
87038fd1498Szrj     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
87138fd1498Szrj 	       const __normal_iterator<_Iterator, _Container>& __rhs)
87238fd1498Szrj     _GLIBCXX_NOEXCEPT
87338fd1498Szrj     { return __lhs.base() == __rhs.base(); }
87438fd1498Szrj 
87538fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
87638fd1498Szrj     inline bool
87738fd1498Szrj     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
87838fd1498Szrj 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
87938fd1498Szrj     _GLIBCXX_NOEXCEPT
88038fd1498Szrj     { return __lhs.base() != __rhs.base(); }
88138fd1498Szrj 
88238fd1498Szrj   template<typename _Iterator, typename _Container>
88338fd1498Szrj     inline bool
88438fd1498Szrj     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
88538fd1498Szrj 	       const __normal_iterator<_Iterator, _Container>& __rhs)
88638fd1498Szrj     _GLIBCXX_NOEXCEPT
88738fd1498Szrj     { return __lhs.base() != __rhs.base(); }
88838fd1498Szrj 
88938fd1498Szrj   // Random access iterator requirements
89038fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
89138fd1498Szrj     inline bool
89238fd1498Szrj     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
89338fd1498Szrj 	      const __normal_iterator<_IteratorR, _Container>& __rhs)
89438fd1498Szrj     _GLIBCXX_NOEXCEPT
89538fd1498Szrj     { return __lhs.base() < __rhs.base(); }
89638fd1498Szrj 
89738fd1498Szrj   template<typename _Iterator, typename _Container>
89838fd1498Szrj     inline bool
89938fd1498Szrj     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
90038fd1498Szrj 	      const __normal_iterator<_Iterator, _Container>& __rhs)
90138fd1498Szrj     _GLIBCXX_NOEXCEPT
90238fd1498Szrj     { return __lhs.base() < __rhs.base(); }
90338fd1498Szrj 
90438fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
90538fd1498Szrj     inline bool
90638fd1498Szrj     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
90738fd1498Szrj 	      const __normal_iterator<_IteratorR, _Container>& __rhs)
90838fd1498Szrj     _GLIBCXX_NOEXCEPT
90938fd1498Szrj     { return __lhs.base() > __rhs.base(); }
91038fd1498Szrj 
91138fd1498Szrj   template<typename _Iterator, typename _Container>
91238fd1498Szrj     inline bool
91338fd1498Szrj     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
91438fd1498Szrj 	      const __normal_iterator<_Iterator, _Container>& __rhs)
91538fd1498Szrj     _GLIBCXX_NOEXCEPT
91638fd1498Szrj     { return __lhs.base() > __rhs.base(); }
91738fd1498Szrj 
91838fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
91938fd1498Szrj     inline bool
92038fd1498Szrj     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
92138fd1498Szrj 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
92238fd1498Szrj     _GLIBCXX_NOEXCEPT
92338fd1498Szrj     { return __lhs.base() <= __rhs.base(); }
92438fd1498Szrj 
92538fd1498Szrj   template<typename _Iterator, typename _Container>
92638fd1498Szrj     inline bool
92738fd1498Szrj     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
92838fd1498Szrj 	       const __normal_iterator<_Iterator, _Container>& __rhs)
92938fd1498Szrj     _GLIBCXX_NOEXCEPT
93038fd1498Szrj     { return __lhs.base() <= __rhs.base(); }
93138fd1498Szrj 
93238fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
93338fd1498Szrj     inline bool
93438fd1498Szrj     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
93538fd1498Szrj 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
93638fd1498Szrj     _GLIBCXX_NOEXCEPT
93738fd1498Szrj     { return __lhs.base() >= __rhs.base(); }
93838fd1498Szrj 
93938fd1498Szrj   template<typename _Iterator, typename _Container>
94038fd1498Szrj     inline bool
94138fd1498Szrj     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
94238fd1498Szrj 	       const __normal_iterator<_Iterator, _Container>& __rhs)
94338fd1498Szrj     _GLIBCXX_NOEXCEPT
94438fd1498Szrj     { return __lhs.base() >= __rhs.base(); }
94538fd1498Szrj 
94638fd1498Szrj   // _GLIBCXX_RESOLVE_LIB_DEFECTS
94738fd1498Szrj   // According to the resolution of DR179 not only the various comparison
94838fd1498Szrj   // operators but also operator- must accept mixed iterator/const_iterator
94938fd1498Szrj   // parameters.
95038fd1498Szrj   template<typename _IteratorL, typename _IteratorR, typename _Container>
95138fd1498Szrj #if __cplusplus >= 201103L
95238fd1498Szrj     // DR 685.
95338fd1498Szrj     inline auto
95438fd1498Szrj     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
95538fd1498Szrj 	      const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
95638fd1498Szrj     -> decltype(__lhs.base() - __rhs.base())
95738fd1498Szrj #else
95838fd1498Szrj     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
95938fd1498Szrj     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
96038fd1498Szrj 	      const __normal_iterator<_IteratorR, _Container>& __rhs)
96138fd1498Szrj #endif
96238fd1498Szrj     { return __lhs.base() - __rhs.base(); }
96338fd1498Szrj 
96438fd1498Szrj   template<typename _Iterator, typename _Container>
96538fd1498Szrj     inline typename __normal_iterator<_Iterator, _Container>::difference_type
96638fd1498Szrj     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
96738fd1498Szrj 	      const __normal_iterator<_Iterator, _Container>& __rhs)
96838fd1498Szrj     _GLIBCXX_NOEXCEPT
96938fd1498Szrj     { return __lhs.base() - __rhs.base(); }
97038fd1498Szrj 
97138fd1498Szrj   template<typename _Iterator, typename _Container>
97238fd1498Szrj     inline __normal_iterator<_Iterator, _Container>
97338fd1498Szrj     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
97438fd1498Szrj 	      __n, const __normal_iterator<_Iterator, _Container>& __i)
97538fd1498Szrj     _GLIBCXX_NOEXCEPT
97638fd1498Szrj     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
97738fd1498Szrj 
97838fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
97938fd1498Szrj } // namespace
98038fd1498Szrj 
98138fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
98238fd1498Szrj {
98338fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
98438fd1498Szrj 
98538fd1498Szrj   template<typename _Iterator, typename _Container>
98638fd1498Szrj     _Iterator
98738fd1498Szrj     __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
98838fd1498Szrj     { return __it.base(); }
98938fd1498Szrj 
99038fd1498Szrj #if __cplusplus >= 201103L
99138fd1498Szrj 
99238fd1498Szrj   /**
99338fd1498Szrj    * @addtogroup iterators
99438fd1498Szrj    * @{
99538fd1498Szrj    */
99638fd1498Szrj 
99738fd1498Szrj   // 24.4.3  Move iterators
99838fd1498Szrj   /**
99938fd1498Szrj    *  Class template move_iterator is an iterator adapter with the same
100038fd1498Szrj    *  behavior as the underlying iterator except that its dereference
100138fd1498Szrj    *  operator implicitly converts the value returned by the underlying
100238fd1498Szrj    *  iterator's dereference operator to an rvalue reference.  Some
100338fd1498Szrj    *  generic algorithms can be called with move iterators to replace
100438fd1498Szrj    *  copying with moving.
100538fd1498Szrj    */
100638fd1498Szrj   template<typename _Iterator>
100738fd1498Szrj     class move_iterator
100838fd1498Szrj     {
100938fd1498Szrj     protected:
101038fd1498Szrj       _Iterator _M_current;
101138fd1498Szrj 
101238fd1498Szrj       typedef iterator_traits<_Iterator>		__traits_type;
101338fd1498Szrj       typedef typename __traits_type::reference		__base_ref;
101438fd1498Szrj 
101538fd1498Szrj     public:
101638fd1498Szrj       typedef _Iterator					iterator_type;
101738fd1498Szrj       typedef typename __traits_type::iterator_category iterator_category;
101838fd1498Szrj       typedef typename __traits_type::value_type  	value_type;
101938fd1498Szrj       typedef typename __traits_type::difference_type	difference_type;
102038fd1498Szrj       // NB: DR 680.
102138fd1498Szrj       typedef _Iterator					pointer;
102238fd1498Szrj       // _GLIBCXX_RESOLVE_LIB_DEFECTS
102338fd1498Szrj       // 2106. move_iterator wrapping iterators returning prvalues
102438fd1498Szrj       typedef typename conditional<is_reference<__base_ref>::value,
102538fd1498Szrj 			 typename remove_reference<__base_ref>::type&&,
102638fd1498Szrj 			 __base_ref>::type		reference;
102738fd1498Szrj 
102838fd1498Szrj       _GLIBCXX17_CONSTEXPR
102938fd1498Szrj       move_iterator()
103038fd1498Szrj       : _M_current() { }
103138fd1498Szrj 
103238fd1498Szrj       explicit _GLIBCXX17_CONSTEXPR
103338fd1498Szrj       move_iterator(iterator_type __i)
103438fd1498Szrj       : _M_current(__i) { }
103538fd1498Szrj 
103638fd1498Szrj       template<typename _Iter>
103738fd1498Szrj 	_GLIBCXX17_CONSTEXPR
103838fd1498Szrj 	move_iterator(const move_iterator<_Iter>& __i)
103938fd1498Szrj 	: _M_current(__i.base()) { }
104038fd1498Szrj 
104138fd1498Szrj       _GLIBCXX17_CONSTEXPR iterator_type
104238fd1498Szrj       base() const
104338fd1498Szrj       { return _M_current; }
104438fd1498Szrj 
104538fd1498Szrj       _GLIBCXX17_CONSTEXPR reference
104638fd1498Szrj       operator*() const
104738fd1498Szrj       { return static_cast<reference>(*_M_current); }
104838fd1498Szrj 
104938fd1498Szrj       _GLIBCXX17_CONSTEXPR pointer
105038fd1498Szrj       operator->() const
105138fd1498Szrj       { return _M_current; }
105238fd1498Szrj 
105338fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator&
105438fd1498Szrj       operator++()
105538fd1498Szrj       {
105638fd1498Szrj 	++_M_current;
105738fd1498Szrj 	return *this;
105838fd1498Szrj       }
105938fd1498Szrj 
106038fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator
106138fd1498Szrj       operator++(int)
106238fd1498Szrj       {
106338fd1498Szrj 	move_iterator __tmp = *this;
106438fd1498Szrj 	++_M_current;
106538fd1498Szrj 	return __tmp;
106638fd1498Szrj       }
106738fd1498Szrj 
106838fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator&
106938fd1498Szrj       operator--()
107038fd1498Szrj       {
107138fd1498Szrj 	--_M_current;
107238fd1498Szrj 	return *this;
107338fd1498Szrj       }
107438fd1498Szrj 
107538fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator
107638fd1498Szrj       operator--(int)
107738fd1498Szrj       {
107838fd1498Szrj 	move_iterator __tmp = *this;
107938fd1498Szrj 	--_M_current;
108038fd1498Szrj 	return __tmp;
108138fd1498Szrj       }
108238fd1498Szrj 
108338fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator
108438fd1498Szrj       operator+(difference_type __n) const
108538fd1498Szrj       { return move_iterator(_M_current + __n); }
108638fd1498Szrj 
108738fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator&
108838fd1498Szrj       operator+=(difference_type __n)
108938fd1498Szrj       {
109038fd1498Szrj 	_M_current += __n;
109138fd1498Szrj 	return *this;
109238fd1498Szrj       }
109338fd1498Szrj 
109438fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator
109538fd1498Szrj       operator-(difference_type __n) const
109638fd1498Szrj       { return move_iterator(_M_current - __n); }
109738fd1498Szrj 
109838fd1498Szrj       _GLIBCXX17_CONSTEXPR move_iterator&
109938fd1498Szrj       operator-=(difference_type __n)
110038fd1498Szrj       {
110138fd1498Szrj 	_M_current -= __n;
110238fd1498Szrj 	return *this;
110338fd1498Szrj       }
110438fd1498Szrj 
110538fd1498Szrj       _GLIBCXX17_CONSTEXPR reference
110638fd1498Szrj       operator[](difference_type __n) const
110738fd1498Szrj       { return std::move(_M_current[__n]); }
110838fd1498Szrj     };
110938fd1498Szrj 
111038fd1498Szrj   // Note: See __normal_iterator operators note from Gaby to understand
111138fd1498Szrj   // why there are always 2 versions for most of the move_iterator
111238fd1498Szrj   // operators.
111338fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
111438fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
111538fd1498Szrj     operator==(const move_iterator<_IteratorL>& __x,
111638fd1498Szrj 	       const move_iterator<_IteratorR>& __y)
111738fd1498Szrj     { return __x.base() == __y.base(); }
111838fd1498Szrj 
111938fd1498Szrj   template<typename _Iterator>
112038fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
112138fd1498Szrj     operator==(const move_iterator<_Iterator>& __x,
112238fd1498Szrj 	       const move_iterator<_Iterator>& __y)
112338fd1498Szrj     { return __x.base() == __y.base(); }
112438fd1498Szrj 
112538fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
112638fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
112738fd1498Szrj     operator!=(const move_iterator<_IteratorL>& __x,
112838fd1498Szrj 	       const move_iterator<_IteratorR>& __y)
112938fd1498Szrj     { return !(__x == __y); }
113038fd1498Szrj 
113138fd1498Szrj   template<typename _Iterator>
113238fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
113338fd1498Szrj     operator!=(const move_iterator<_Iterator>& __x,
113438fd1498Szrj 	       const move_iterator<_Iterator>& __y)
113538fd1498Szrj     { return !(__x == __y); }
113638fd1498Szrj 
113738fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
113838fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
113938fd1498Szrj     operator<(const move_iterator<_IteratorL>& __x,
114038fd1498Szrj 	      const move_iterator<_IteratorR>& __y)
114138fd1498Szrj     { return __x.base() < __y.base(); }
114238fd1498Szrj 
114338fd1498Szrj   template<typename _Iterator>
114438fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
114538fd1498Szrj     operator<(const move_iterator<_Iterator>& __x,
114638fd1498Szrj 	      const move_iterator<_Iterator>& __y)
114738fd1498Szrj     { return __x.base() < __y.base(); }
114838fd1498Szrj 
114938fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
115038fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
115138fd1498Szrj     operator<=(const move_iterator<_IteratorL>& __x,
115238fd1498Szrj 	       const move_iterator<_IteratorR>& __y)
115338fd1498Szrj     { return !(__y < __x); }
115438fd1498Szrj 
115538fd1498Szrj   template<typename _Iterator>
115638fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
115738fd1498Szrj     operator<=(const move_iterator<_Iterator>& __x,
115838fd1498Szrj 	       const move_iterator<_Iterator>& __y)
115938fd1498Szrj     { return !(__y < __x); }
116038fd1498Szrj 
116138fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
116238fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
116338fd1498Szrj     operator>(const move_iterator<_IteratorL>& __x,
116438fd1498Szrj 	      const move_iterator<_IteratorR>& __y)
116538fd1498Szrj     { return __y < __x; }
116638fd1498Szrj 
116738fd1498Szrj   template<typename _Iterator>
116838fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
116938fd1498Szrj     operator>(const move_iterator<_Iterator>& __x,
117038fd1498Szrj 	      const move_iterator<_Iterator>& __y)
117138fd1498Szrj     { return __y < __x; }
117238fd1498Szrj 
117338fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
117438fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
117538fd1498Szrj     operator>=(const move_iterator<_IteratorL>& __x,
117638fd1498Szrj 	       const move_iterator<_IteratorR>& __y)
117738fd1498Szrj     { return !(__x < __y); }
117838fd1498Szrj 
117938fd1498Szrj   template<typename _Iterator>
118038fd1498Szrj     inline _GLIBCXX17_CONSTEXPR bool
118138fd1498Szrj     operator>=(const move_iterator<_Iterator>& __x,
118238fd1498Szrj 	       const move_iterator<_Iterator>& __y)
118338fd1498Szrj     { return !(__x < __y); }
118438fd1498Szrj 
118538fd1498Szrj   // DR 685.
118638fd1498Szrj   template<typename _IteratorL, typename _IteratorR>
118738fd1498Szrj     inline _GLIBCXX17_CONSTEXPR auto
118838fd1498Szrj     operator-(const move_iterator<_IteratorL>& __x,
118938fd1498Szrj 	      const move_iterator<_IteratorR>& __y)
119038fd1498Szrj     -> decltype(__x.base() - __y.base())
119138fd1498Szrj     { return __x.base() - __y.base(); }
119238fd1498Szrj 
119338fd1498Szrj   template<typename _Iterator>
119438fd1498Szrj     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
119538fd1498Szrj     operator+(typename move_iterator<_Iterator>::difference_type __n,
119638fd1498Szrj 	      const move_iterator<_Iterator>& __x)
119738fd1498Szrj     { return __x + __n; }
119838fd1498Szrj 
119938fd1498Szrj   template<typename _Iterator>
120038fd1498Szrj     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
120138fd1498Szrj     make_move_iterator(_Iterator __i)
120238fd1498Szrj     { return move_iterator<_Iterator>(__i); }
120338fd1498Szrj 
120438fd1498Szrj   template<typename _Iterator, typename _ReturnType
120538fd1498Szrj     = typename conditional<__move_if_noexcept_cond
120638fd1498Szrj       <typename iterator_traits<_Iterator>::value_type>::value,
120738fd1498Szrj                 _Iterator, move_iterator<_Iterator>>::type>
120838fd1498Szrj     inline _GLIBCXX17_CONSTEXPR _ReturnType
120938fd1498Szrj     __make_move_if_noexcept_iterator(_Iterator __i)
121038fd1498Szrj     { return _ReturnType(__i); }
121138fd1498Szrj 
121238fd1498Szrj   // Overload for pointers that matches std::move_if_noexcept more closely,
121338fd1498Szrj   // returning a constant iterator when we don't want to move.
121438fd1498Szrj   template<typename _Tp, typename _ReturnType
121538fd1498Szrj     = typename conditional<__move_if_noexcept_cond<_Tp>::value,
121638fd1498Szrj 			   const _Tp*, move_iterator<_Tp*>>::type>
121738fd1498Szrj     inline _GLIBCXX17_CONSTEXPR _ReturnType
121838fd1498Szrj     __make_move_if_noexcept_iterator(_Tp* __i)
121938fd1498Szrj     { return _ReturnType(__i); }
122038fd1498Szrj 
122138fd1498Szrj   // @} group iterators
122238fd1498Szrj 
122338fd1498Szrj   template<typename _Iterator>
122438fd1498Szrj     auto
122538fd1498Szrj     __niter_base(move_iterator<_Iterator> __it)
122638fd1498Szrj     -> decltype(make_move_iterator(__niter_base(__it.base())))
122738fd1498Szrj     { return make_move_iterator(__niter_base(__it.base())); }
122838fd1498Szrj 
122938fd1498Szrj   template<typename _Iterator>
123038fd1498Szrj     struct __is_move_iterator<move_iterator<_Iterator> >
123138fd1498Szrj     {
123238fd1498Szrj       enum { __value = 1 };
123338fd1498Szrj       typedef __true_type __type;
123438fd1498Szrj     };
123538fd1498Szrj 
123638fd1498Szrj   template<typename _Iterator>
123738fd1498Szrj     auto
123838fd1498Szrj     __miter_base(move_iterator<_Iterator> __it)
123938fd1498Szrj     -> decltype(__miter_base(__it.base()))
124038fd1498Szrj     { return __miter_base(__it.base()); }
124138fd1498Szrj 
124238fd1498Szrj #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
124338fd1498Szrj #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
124438fd1498Szrj   std::__make_move_if_noexcept_iterator(_Iter)
124538fd1498Szrj #else
124638fd1498Szrj #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
124738fd1498Szrj #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
124838fd1498Szrj #endif // C++11
124938fd1498Szrj 
125038fd1498Szrj #if __cpp_deduction_guides >= 201606
125138fd1498Szrj   // These helper traits are used for deduction guides
125238fd1498Szrj   // of associative containers.
125338fd1498Szrj   template<typename _InputIterator>
125438fd1498Szrj     using __iter_key_t = remove_const_t<
125538fd1498Szrj     typename iterator_traits<_InputIterator>::value_type::first_type>;
125638fd1498Szrj 
125738fd1498Szrj   template<typename _InputIterator>
125838fd1498Szrj     using __iter_val_t =
125938fd1498Szrj     typename iterator_traits<_InputIterator>::value_type::second_type;
126038fd1498Szrj 
126138fd1498Szrj   template<typename _T1, typename _T2>
126238fd1498Szrj     struct pair;
126338fd1498Szrj 
126438fd1498Szrj   template<typename _InputIterator>
126538fd1498Szrj     using __iter_to_alloc_t =
126638fd1498Szrj     pair<add_const_t<__iter_key_t<_InputIterator>>,
126738fd1498Szrj 	 __iter_val_t<_InputIterator>>;
126838fd1498Szrj 
126938fd1498Szrj #endif
127038fd1498Szrj 
127138fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
127238fd1498Szrj } // namespace
127338fd1498Szrj 
127438fd1498Szrj #ifdef _GLIBCXX_DEBUG
127538fd1498Szrj # include <debug/stl_iterator.h>
127638fd1498Szrj #endif
127738fd1498Szrj 
127838fd1498Szrj #endif
1279