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 
_GLIBCXX_VISIBILITY(default)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>
97     class reverse_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       */
132       reverse_iterator(const reverse_iterator& __x)
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>
140         reverse_iterator(const reverse_iterator<_Iter>& __x)
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       */
181       reverse_iterator&
182       operator++()
183       {
184 	--current;
185 	return *this;
186       }
187 
188       /**
189        *  @return  The original value of @c *this
190        *
191        *  Decrements the underlying iterator.
192       */
193       reverse_iterator
194       operator++(int)
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       */
206       reverse_iterator&
207       operator--()
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       */
218       reverse_iterator
219       operator--(int)
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       */
231       reverse_iterator
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       */
241       reverse_iterator&
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       */
253       reverse_iterator
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       */
263       reverse_iterator&
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>
403     class back_insert_iterator
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
429       back_insert_iterator&
430       operator=(typename _Container::const_reference __value)
431       {
432 	container->push_back(__value);
433 	return *this;
434       }
435 #else
436       back_insert_iterator&
437       operator=(const typename _Container::value_type& __value)
438       {
439 	container->push_back(__value);
440 	return *this;
441       }
442 
443       back_insert_iterator&
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.
452       back_insert_iterator&
453       operator*()
454       { return *this; }
455 
456       /// Simply returns *this.  (This %iterator does not @a move.)
457       back_insert_iterator&
458       operator++()
459       { return *this; }
460 
461       /// Simply returns *this.  (This %iterator does not @a move.)
462       back_insert_iterator
463       operator++(int)
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>
494     class front_insert_iterator
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
519       front_insert_iterator&
520       operator=(typename _Container::const_reference __value)
521       {
522 	container->push_front(__value);
523 	return *this;
524       }
525 #else
526       front_insert_iterator&
527       operator=(const typename _Container::value_type& __value)
528       {
529 	container->push_front(__value);
530 	return *this;
531       }
532 
533       front_insert_iterator&
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.
542       front_insert_iterator&
543       operator*()
544       { return *this; }
545 
546       /// Simply returns *this.  (This %iterator does not @a move.)
547       front_insert_iterator&
548       operator++()
549       { return *this; }
550 
551       /// Simply returns *this.  (This %iterator does not @a move.)
552       front_insert_iterator
553       operator++(int)
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>
588     class insert_iterator
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
630       insert_iterator&
631       operator=(typename _Container::const_reference __value)
632       {
633 	iter = container->insert(iter, __value);
634 	++iter;
635 	return *this;
636       }
637 #else
638       insert_iterator&
639       operator=(const typename _Container::value_type& __value)
640       {
641 	iter = container->insert(iter, __value);
642 	++iter;
643 	return *this;
644       }
645 
646       insert_iterator&
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.
656       insert_iterator&
657       operator*()
658       { return *this; }
659 
660       /// Simply returns *this.  (This %iterator does not @a move.)
661       insert_iterator&
662       operator++()
663       { return *this; }
664 
665       /// Simply returns *this.  (This %iterator does not @a move.)
666       insert_iterator&
667       operator++(int)
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 
_GLIBCXX_VISIBILITY(default)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       // Forward iterator requirements
740       reference
741       operator*() const _GLIBCXX_NOEXCEPT
742       { return *_M_current; }
743 
744       pointer
745       operator->() const _GLIBCXX_NOEXCEPT
746       { return _M_current; }
747 
748       __normal_iterator&
749       operator++() _GLIBCXX_NOEXCEPT
750       {
751 	++_M_current;
752 	return *this;
753       }
754 
755       __normal_iterator
756       operator++(int) _GLIBCXX_NOEXCEPT
757       { return __normal_iterator(_M_current++); }
758 
759       // Bidirectional iterator requirements
760       __normal_iterator&
761       operator--() _GLIBCXX_NOEXCEPT
762       {
763 	--_M_current;
764 	return *this;
765       }
766 
767       __normal_iterator
768       operator--(int) _GLIBCXX_NOEXCEPT
769       { return __normal_iterator(_M_current--); }
770 
771       // Random access iterator requirements
772       reference
773       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
774       { return _M_current[__n]; }
775 
776       __normal_iterator&
777       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
778       { _M_current += __n; return *this; }
779 
780       __normal_iterator
781       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
782       { return __normal_iterator(_M_current + __n); }
783 
784       __normal_iterator&
785       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
786       { _M_current -= __n; return *this; }
787 
788       __normal_iterator
789       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
790       { return __normal_iterator(_M_current - __n); }
791 
792       const _Iterator&
793       base() const _GLIBCXX_NOEXCEPT
794       { return _M_current; }
795     };
796 
797   // Note: In what follows, the left- and right-hand-side iterators are
798   // allowed to vary in types (conceptually in cv-qualification) so that
799   // comparison between cv-qualified and non-cv-qualified iterators be
800   // valid.  However, the greedy and unfriendly operators in std::rel_ops
801   // will make overload resolution ambiguous (when in scope) if we don't
802   // provide overloads whose operands are of the same type.  Can someone
803   // remind me what generic programming is about? -- Gaby
804 
805   // Forward iterator requirements
806   template<typename _IteratorL, typename _IteratorR, typename _Container>
807     inline bool
808     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
809 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
810     _GLIBCXX_NOEXCEPT
811     { return __lhs.base() == __rhs.base(); }
812 
813   template<typename _Iterator, typename _Container>
814     inline bool
815     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
816 	       const __normal_iterator<_Iterator, _Container>& __rhs)
817     _GLIBCXX_NOEXCEPT
818     { return __lhs.base() == __rhs.base(); }
819 
820   template<typename _IteratorL, typename _IteratorR, typename _Container>
821     inline bool
822     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
823 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
824     _GLIBCXX_NOEXCEPT
825     { return __lhs.base() != __rhs.base(); }
826 
827   template<typename _Iterator, typename _Container>
828     inline bool
829     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
830 	       const __normal_iterator<_Iterator, _Container>& __rhs)
831     _GLIBCXX_NOEXCEPT
832     { return __lhs.base() != __rhs.base(); }
833 
834   // Random access iterator requirements
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   template<typename _IteratorL, typename _IteratorR, typename _Container>
850     inline bool
851     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
852 	      const __normal_iterator<_IteratorR, _Container>& __rhs)
853     _GLIBCXX_NOEXCEPT
854     { return __lhs.base() > __rhs.base(); }
855 
856   template<typename _Iterator, typename _Container>
857     inline bool
858     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
859 	      const __normal_iterator<_Iterator, _Container>& __rhs)
860     _GLIBCXX_NOEXCEPT
861     { return __lhs.base() > __rhs.base(); }
862 
863   template<typename _IteratorL, typename _IteratorR, typename _Container>
864     inline bool
865     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
866 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
867     _GLIBCXX_NOEXCEPT
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     _GLIBCXX_NOEXCEPT
875     { return __lhs.base() <= __rhs.base(); }
876 
877   template<typename _IteratorL, typename _IteratorR, typename _Container>
878     inline bool
879     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
880 	       const __normal_iterator<_IteratorR, _Container>& __rhs)
881     _GLIBCXX_NOEXCEPT
882     { return __lhs.base() >= __rhs.base(); }
883 
884   template<typename _Iterator, typename _Container>
885     inline bool
886     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
887 	       const __normal_iterator<_Iterator, _Container>& __rhs)
888     _GLIBCXX_NOEXCEPT
889     { return __lhs.base() >= __rhs.base(); }
890 
891   // _GLIBCXX_RESOLVE_LIB_DEFECTS
892   // According to the resolution of DR179 not only the various comparison
893   // operators but also operator- must accept mixed iterator/const_iterator
894   // parameters.
895   template<typename _IteratorL, typename _IteratorR, typename _Container>
896 #if __cplusplus >= 201103L
897     // DR 685.
898     inline auto
899     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
900 	      const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
901     -> decltype(__lhs.base() - __rhs.base())
902 #else
903     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
904     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
905 	      const __normal_iterator<_IteratorR, _Container>& __rhs)
906 #endif
907     { return __lhs.base() - __rhs.base(); }
908 
909   template<typename _Iterator, typename _Container>
910     inline typename __normal_iterator<_Iterator, _Container>::difference_type
911     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
912 	      const __normal_iterator<_Iterator, _Container>& __rhs)
913     _GLIBCXX_NOEXCEPT
914     { return __lhs.base() - __rhs.base(); }
915 
916   template<typename _Iterator, typename _Container>
917     inline __normal_iterator<_Iterator, _Container>
918     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
919 	      __n, const __normal_iterator<_Iterator, _Container>& __i)
920     _GLIBCXX_NOEXCEPT
921     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
922 
923 _GLIBCXX_END_NAMESPACE_VERSION
924 } // namespace
925 
926 #if __cplusplus >= 201103L
927 
_GLIBCXX_VISIBILITY(default)928 namespace std _GLIBCXX_VISIBILITY(default)
929 {
930 _GLIBCXX_BEGIN_NAMESPACE_VERSION
931 
932   /**
933    * @addtogroup iterators
934    * @{
935    */
936 
937   // 24.4.3  Move iterators
938   /**
939    *  Class template move_iterator is an iterator adapter with the same
940    *  behavior as the underlying iterator except that its dereference
941    *  operator implicitly converts the value returned by the underlying
942    *  iterator's dereference operator to an rvalue reference.  Some
943    *  generic algorithms can be called with move iterators to replace
944    *  copying with moving.
945    */
946   template<typename _Iterator>
947     class move_iterator
948     {
949     protected:
950       _Iterator _M_current;
951 
952       typedef iterator_traits<_Iterator>		__traits_type;
953 
954     public:
955       typedef _Iterator					iterator_type;
956       typedef typename __traits_type::iterator_category iterator_category;
957       typedef typename __traits_type::value_type  	value_type;
958       typedef typename __traits_type::difference_type	difference_type;
959       // NB: DR 680.
960       typedef _Iterator					pointer;
961       typedef value_type&&				reference;
962 
963       move_iterator()
964       : _M_current() { }
965 
966       explicit
967       move_iterator(iterator_type __i)
968       : _M_current(__i) { }
969 
970       template<typename _Iter>
971 	move_iterator(const move_iterator<_Iter>& __i)
972 	: _M_current(__i.base()) { }
973 
974       iterator_type
975       base() const
976       { return _M_current; }
977 
978       reference
979       operator*() const
980       { return std::move(*_M_current); }
981 
982       pointer
983       operator->() const
984       { return _M_current; }
985 
986       move_iterator&
987       operator++()
988       {
989 	++_M_current;
990 	return *this;
991       }
992 
993       move_iterator
994       operator++(int)
995       {
996 	move_iterator __tmp = *this;
997 	++_M_current;
998 	return __tmp;
999       }
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+(difference_type __n) const
1018       { return move_iterator(_M_current + __n); }
1019 
1020       move_iterator&
1021       operator+=(difference_type __n)
1022       {
1023 	_M_current += __n;
1024 	return *this;
1025       }
1026 
1027       move_iterator
1028       operator-(difference_type __n) const
1029       { return move_iterator(_M_current - __n); }
1030 
1031       move_iterator&
1032       operator-=(difference_type __n)
1033       {
1034 	_M_current -= __n;
1035 	return *this;
1036       }
1037 
1038       reference
1039       operator[](difference_type __n) const
1040       { return std::move(_M_current[__n]); }
1041     };
1042 
1043   // Note: See __normal_iterator operators note from Gaby to understand
1044   // why there are always 2 versions for most of the move_iterator
1045   // operators.
1046   template<typename _IteratorL, typename _IteratorR>
1047     inline bool
1048     operator==(const move_iterator<_IteratorL>& __x,
1049 	       const move_iterator<_IteratorR>& __y)
1050     { return __x.base() == __y.base(); }
1051 
1052   template<typename _Iterator>
1053     inline bool
1054     operator==(const move_iterator<_Iterator>& __x,
1055 	       const move_iterator<_Iterator>& __y)
1056     { return __x.base() == __y.base(); }
1057 
1058   template<typename _IteratorL, typename _IteratorR>
1059     inline bool
1060     operator!=(const move_iterator<_IteratorL>& __x,
1061 	       const move_iterator<_IteratorR>& __y)
1062     { return !(__x == __y); }
1063 
1064   template<typename _Iterator>
1065     inline bool
1066     operator!=(const move_iterator<_Iterator>& __x,
1067 	       const move_iterator<_Iterator>& __y)
1068     { return !(__x == __y); }
1069 
1070   template<typename _IteratorL, typename _IteratorR>
1071     inline bool
1072     operator<(const move_iterator<_IteratorL>& __x,
1073 	      const move_iterator<_IteratorR>& __y)
1074     { return __x.base() < __y.base(); }
1075 
1076   template<typename _Iterator>
1077     inline bool
1078     operator<(const move_iterator<_Iterator>& __x,
1079 	      const move_iterator<_Iterator>& __y)
1080     { return __x.base() < __y.base(); }
1081 
1082   template<typename _IteratorL, typename _IteratorR>
1083     inline bool
1084     operator<=(const move_iterator<_IteratorL>& __x,
1085 	       const move_iterator<_IteratorR>& __y)
1086     { return !(__y < __x); }
1087 
1088   template<typename _Iterator>
1089     inline bool
1090     operator<=(const move_iterator<_Iterator>& __x,
1091 	       const move_iterator<_Iterator>& __y)
1092     { return !(__y < __x); }
1093 
1094   template<typename _IteratorL, typename _IteratorR>
1095     inline bool
1096     operator>(const move_iterator<_IteratorL>& __x,
1097 	      const move_iterator<_IteratorR>& __y)
1098     { return __y < __x; }
1099 
1100   template<typename _Iterator>
1101     inline bool
1102     operator>(const move_iterator<_Iterator>& __x,
1103 	      const move_iterator<_Iterator>& __y)
1104     { return __y < __x; }
1105 
1106   template<typename _IteratorL, typename _IteratorR>
1107     inline bool
1108     operator>=(const move_iterator<_IteratorL>& __x,
1109 	       const move_iterator<_IteratorR>& __y)
1110     { return !(__x < __y); }
1111 
1112   template<typename _Iterator>
1113     inline bool
1114     operator>=(const move_iterator<_Iterator>& __x,
1115 	       const move_iterator<_Iterator>& __y)
1116     { return !(__x < __y); }
1117 
1118   // DR 685.
1119   template<typename _IteratorL, typename _IteratorR>
1120     inline auto
1121     operator-(const move_iterator<_IteratorL>& __x,
1122 	      const move_iterator<_IteratorR>& __y)
1123     -> decltype(__x.base() - __y.base())
1124     { return __x.base() - __y.base(); }
1125 
1126   template<typename _Iterator>
1127     inline auto
1128     operator-(const move_iterator<_Iterator>& __x,
1129 	      const move_iterator<_Iterator>& __y)
1130     -> decltype(__x.base() - __y.base())
1131     { return __x.base() - __y.base(); }
1132 
1133   template<typename _Iterator>
1134     inline move_iterator<_Iterator>
1135     operator+(typename move_iterator<_Iterator>::difference_type __n,
1136 	      const move_iterator<_Iterator>& __x)
1137     { return __x + __n; }
1138 
1139   template<typename _Iterator>
1140     inline move_iterator<_Iterator>
1141     make_move_iterator(_Iterator __i)
1142     { return move_iterator<_Iterator>(__i); }
1143 
1144   template<typename _Iterator, typename _ReturnType
1145     = typename conditional<__move_if_noexcept_cond
1146       <typename iterator_traits<_Iterator>::value_type>::value,
1147                 _Iterator, move_iterator<_Iterator>>::type>
1148     inline _ReturnType
1149     __make_move_if_noexcept_iterator(_Iterator __i)
1150     { return _ReturnType(__i); }
1151 
1152   // @} group iterators
1153 
1154 _GLIBCXX_END_NAMESPACE_VERSION
1155 } // namespace
1156 
1157 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1158 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
1159   std::__make_move_if_noexcept_iterator(_Iter)
1160 #else
1161 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1162 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
1163 #endif // C++11
1164 
1165 #endif
1166