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