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