Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / libstdc++-v3 / include / bits / stl_iterator.h
1 // Iterators -*- C++ -*-
2
3 // Copyright (C) 2001-2015 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>
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 #if __cplusplus > 201103L
392 #define __cpp_lib_make_reverse_iterator 201402
393
394   // _GLIBCXX_RESOLVE_LIB_DEFECTS
395   // DR 2285. make_reverse_iterator
396   /// Generator function for reverse_iterator.
397   template<typename _Iterator>
398     inline reverse_iterator<_Iterator>
399     make_reverse_iterator(_Iterator __i)
400     { return reverse_iterator<_Iterator>(__i); }
401 #endif
402
403   // 24.4.2.2.1 back_insert_iterator
404   /**
405    *  @brief  Turns assignment into insertion.
406    *
407    *  These are output iterators, constructed from a container-of-T.
408    *  Assigning a T to the iterator appends it to the container using
409    *  push_back.
410    *
411    *  Tip:  Using the back_inserter function to create these iterators can
412    *  save typing.
413   */
414   template<typename _Container>
415     class back_insert_iterator
416     : public iterator<output_iterator_tag, void, void, void, void>
417     {
418     protected:
419       _Container* container;
420
421     public:
422       /// A nested typedef for the type of whatever container you used.
423       typedef _Container          container_type;
424
425       /// The only way to create this %iterator is with a container.
426       explicit
427       back_insert_iterator(_Container& __x) : container(&__x) { }
428
429       /**
430        *  @param  __value  An instance of whatever type
431        *                 container_type::const_reference is; presumably a
432        *                 reference-to-const T for container<T>.
433        *  @return  This %iterator, for chained operations.
434        *
435        *  This kind of %iterator doesn't really have a @a position in the
436        *  container (you can think of the position as being permanently at
437        *  the end, if you like).  Assigning a value to the %iterator will
438        *  always append the value to the end of the container.
439       */
440 #if __cplusplus < 201103L
441       back_insert_iterator&
442       operator=(typename _Container::const_reference __value)
443       {
444         container->push_back(__value);
445         return *this;
446       }
447 #else
448       back_insert_iterator&
449       operator=(const typename _Container::value_type& __value)
450       {
451         container->push_back(__value);
452         return *this;
453       }
454
455       back_insert_iterator&
456       operator=(typename _Container::value_type&& __value)
457       {
458         container->push_back(std::move(__value));
459         return *this;
460       }
461 #endif
462
463       /// Simply returns *this.
464       back_insert_iterator&
465       operator*()
466       { return *this; }
467
468       /// Simply returns *this.  (This %iterator does not @a move.)
469       back_insert_iterator&
470       operator++()
471       { return *this; }
472
473       /// Simply returns *this.  (This %iterator does not @a move.)
474       back_insert_iterator
475       operator++(int)
476       { return *this; }
477     };
478
479   /**
480    *  @param  __x  A container of arbitrary type.
481    *  @return  An instance of back_insert_iterator working on @p __x.
482    *
483    *  This wrapper function helps in creating back_insert_iterator instances.
484    *  Typing the name of the %iterator requires knowing the precise full
485    *  type of the container, which can be tedious and impedes generic
486    *  programming.  Using this function lets you take advantage of automatic
487    *  template parameter deduction, making the compiler match the correct
488    *  types for you.
489   */
490   template<typename _Container>
491     inline back_insert_iterator<_Container>
492     back_inserter(_Container& __x)
493     { return back_insert_iterator<_Container>(__x); }
494
495   /**
496    *  @brief  Turns assignment into insertion.
497    *
498    *  These are output iterators, constructed from a container-of-T.
499    *  Assigning a T to the iterator prepends it to the container using
500    *  push_front.
501    *
502    *  Tip:  Using the front_inserter function to create these iterators can
503    *  save typing.
504   */
505   template<typename _Container>
506     class front_insert_iterator
507     : public iterator<output_iterator_tag, void, void, void, void>
508     {
509     protected:
510       _Container* container;
511
512     public:
513       /// A nested typedef for the type of whatever container you used.
514       typedef _Container          container_type;
515
516       /// The only way to create this %iterator is with a container.
517       explicit front_insert_iterator(_Container& __x) : container(&__x) { }
518
519       /**
520        *  @param  __value  An instance of whatever type
521        *                 container_type::const_reference is; presumably a
522        *                 reference-to-const T for container<T>.
523        *  @return  This %iterator, for chained operations.
524        *
525        *  This kind of %iterator doesn't really have a @a position in the
526        *  container (you can think of the position as being permanently at
527        *  the front, if you like).  Assigning a value to the %iterator will
528        *  always prepend the value to the front of the container.
529       */
530 #if __cplusplus < 201103L
531       front_insert_iterator&
532       operator=(typename _Container::const_reference __value)
533       {
534         container->push_front(__value);
535         return *this;
536       }
537 #else
538       front_insert_iterator&
539       operator=(const typename _Container::value_type& __value)
540       {
541         container->push_front(__value);
542         return *this;
543       }
544
545       front_insert_iterator&
546       operator=(typename _Container::value_type&& __value)
547       {
548         container->push_front(std::move(__value));
549         return *this;
550       }
551 #endif
552
553       /// Simply returns *this.
554       front_insert_iterator&
555       operator*()
556       { return *this; }
557
558       /// Simply returns *this.  (This %iterator does not @a move.)
559       front_insert_iterator&
560       operator++()
561       { return *this; }
562
563       /// Simply returns *this.  (This %iterator does not @a move.)
564       front_insert_iterator
565       operator++(int)
566       { return *this; }
567     };
568
569   /**
570    *  @param  __x  A container of arbitrary type.
571    *  @return  An instance of front_insert_iterator working on @p x.
572    *
573    *  This wrapper function helps in creating front_insert_iterator instances.
574    *  Typing the name of the %iterator requires knowing the precise full
575    *  type of the container, which can be tedious and impedes generic
576    *  programming.  Using this function lets you take advantage of automatic
577    *  template parameter deduction, making the compiler match the correct
578    *  types for you.
579   */
580   template<typename _Container>
581     inline front_insert_iterator<_Container>
582     front_inserter(_Container& __x)
583     { return front_insert_iterator<_Container>(__x); }
584
585   /**
586    *  @brief  Turns assignment into insertion.
587    *
588    *  These are output iterators, constructed from a container-of-T.
589    *  Assigning a T to the iterator inserts it in the container at the
590    *  %iterator's position, rather than overwriting the value at that
591    *  position.
592    *
593    *  (Sequences will actually insert a @e copy of the value before the
594    *  %iterator's position.)
595    *
596    *  Tip:  Using the inserter function to create these iterators can
597    *  save typing.
598   */
599   template<typename _Container>
600     class insert_iterator
601     : public iterator<output_iterator_tag, void, void, void, void>
602     {
603     protected:
604       _Container* container;
605       typename _Container::iterator iter;
606
607     public:
608       /// A nested typedef for the type of whatever container you used.
609       typedef _Container          container_type;
610
611       /**
612        *  The only way to create this %iterator is with a container and an
613        *  initial position (a normal %iterator into the container).
614       */
615       insert_iterator(_Container& __x, typename _Container::iterator __i)
616       : container(&__x), iter(__i) {}
617
618       /**
619        *  @param  __value  An instance of whatever type
620        *                 container_type::const_reference is; presumably a
621        *                 reference-to-const T for container<T>.
622        *  @return  This %iterator, for chained operations.
623        *
624        *  This kind of %iterator maintains its own position in the
625        *  container.  Assigning a value to the %iterator will insert the
626        *  value into the container at the place before the %iterator.
627        *
628        *  The position is maintained such that subsequent assignments will
629        *  insert values immediately after one another.  For example,
630        *  @code
631        *     // vector v contains A and Z
632        *
633        *     insert_iterator i (v, ++v.begin());
634        *     i = 1;
635        *     i = 2;
636        *     i = 3;
637        *
638        *     // vector v contains A, 1, 2, 3, and Z
639        *  @endcode
640       */
641 #if __cplusplus < 201103L
642       insert_iterator&
643       operator=(typename _Container::const_reference __value)
644       {
645         iter = container->insert(iter, __value);
646         ++iter;
647         return *this;
648       }
649 #else
650       insert_iterator&
651       operator=(const typename _Container::value_type& __value)
652       {
653         iter = container->insert(iter, __value);
654         ++iter;
655         return *this;
656       }
657
658       insert_iterator&
659       operator=(typename _Container::value_type&& __value)
660       {
661         iter = container->insert(iter, std::move(__value));
662         ++iter;
663         return *this;
664       }
665 #endif
666
667       /// Simply returns *this.
668       insert_iterator&
669       operator*()
670       { return *this; }
671
672       /// Simply returns *this.  (This %iterator does not @a move.)
673       insert_iterator&
674       operator++()
675       { return *this; }
676
677       /// Simply returns *this.  (This %iterator does not @a move.)
678       insert_iterator&
679       operator++(int)
680       { return *this; }
681     };
682
683   /**
684    *  @param __x  A container of arbitrary type.
685    *  @return  An instance of insert_iterator working on @p __x.
686    *
687    *  This wrapper function helps in creating insert_iterator instances.
688    *  Typing the name of the %iterator requires knowing the precise full
689    *  type of the container, which can be tedious and impedes generic
690    *  programming.  Using this function lets you take advantage of automatic
691    *  template parameter deduction, making the compiler match the correct
692    *  types for you.
693   */
694   template<typename _Container, typename _Iterator>
695     inline insert_iterator<_Container>
696     inserter(_Container& __x, _Iterator __i)
697     {
698       return insert_iterator<_Container>(__x,
699                                          typename _Container::iterator(__i));
700     }
701
702   // @} group iterators
703
704 _GLIBCXX_END_NAMESPACE_VERSION
705 } // namespace
706
707 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
708 {
709 _GLIBCXX_BEGIN_NAMESPACE_VERSION
710
711   // This iterator adapter is @a normal in the sense that it does not
712   // change the semantics of any of the operators of its iterator
713   // parameter.  Its primary purpose is to convert an iterator that is
714   // not a class, e.g. a pointer, into an iterator that is a class.
715   // The _Container parameter exists solely so that different containers
716   // using this template can instantiate different types, even if the
717   // _Iterator parameter is the same.
718   using std::iterator_traits;
719   using std::iterator;
720   template<typename _Iterator, typename _Container>
721     class __normal_iterator
722     {
723     protected:
724       _Iterator _M_current;
725
726       typedef iterator_traits<_Iterator>                __traits_type;
727
728     public:
729       typedef _Iterator                                 iterator_type;
730       typedef typename __traits_type::iterator_category iterator_category;
731       typedef typename __traits_type::value_type        value_type;
732       typedef typename __traits_type::difference_type   difference_type;
733       typedef typename __traits_type::reference         reference;
734       typedef typename __traits_type::pointer           pointer;
735
736       _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
737       : _M_current(_Iterator()) { }
738
739       explicit
740       __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
741       : _M_current(__i) { }
742
743       // Allow iterator to const_iterator conversion
744       template<typename _Iter>
745         __normal_iterator(const __normal_iterator<_Iter,
746                           typename __enable_if<
747                (std::__are_same<_Iter, typename _Container::pointer>::__value),
748                       _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
749         : _M_current(__i.base()) { }
750
751       // Forward iterator requirements
752       reference
753       operator*() const _GLIBCXX_NOEXCEPT
754       { return *_M_current; }
755
756       pointer
757       operator->() const _GLIBCXX_NOEXCEPT
758       { return _M_current; }
759
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       // Bidirectional iterator requirements
772       __normal_iterator&
773       operator--() _GLIBCXX_NOEXCEPT
774       {
775         --_M_current;
776         return *this;
777       }
778
779       __normal_iterator
780       operator--(int) _GLIBCXX_NOEXCEPT
781       { return __normal_iterator(_M_current--); }
782
783       // Random access iterator requirements
784       reference
785       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
786       { return _M_current[__n]; }
787
788       __normal_iterator&
789       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
790       { _M_current += __n; return *this; }
791
792       __normal_iterator
793       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
794       { return __normal_iterator(_M_current + __n); }
795
796       __normal_iterator&
797       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
798       { _M_current -= __n; return *this; }
799
800       __normal_iterator
801       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
802       { return __normal_iterator(_M_current - __n); }
803
804       const _Iterator&
805       base() const _GLIBCXX_NOEXCEPT
806       { return _M_current; }
807     };
808
809   // Note: In what follows, the left- and right-hand-side iterators are
810   // allowed to vary in types (conceptually in cv-qualification) so that
811   // comparison between cv-qualified and non-cv-qualified iterators be
812   // valid.  However, the greedy and unfriendly operators in std::rel_ops
813   // will make overload resolution ambiguous (when in scope) if we don't
814   // provide overloads whose operands are of the same type.  Can someone
815   // remind me what generic programming is about? -- Gaby
816
817   // Forward iterator requirements
818   template<typename _IteratorL, typename _IteratorR, typename _Container>
819     inline bool
820     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
821                const __normal_iterator<_IteratorR, _Container>& __rhs)
822     _GLIBCXX_NOEXCEPT
823     { return __lhs.base() == __rhs.base(); }
824
825   template<typename _Iterator, typename _Container>
826     inline bool
827     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
828                const __normal_iterator<_Iterator, _Container>& __rhs)
829     _GLIBCXX_NOEXCEPT
830     { return __lhs.base() == __rhs.base(); }
831
832   template<typename _IteratorL, typename _IteratorR, typename _Container>
833     inline bool
834     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
835                const __normal_iterator<_IteratorR, _Container>& __rhs)
836     _GLIBCXX_NOEXCEPT
837     { return __lhs.base() != __rhs.base(); }
838
839   template<typename _Iterator, typename _Container>
840     inline bool
841     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
842                const __normal_iterator<_Iterator, _Container>& __rhs)
843     _GLIBCXX_NOEXCEPT
844     { return __lhs.base() != __rhs.base(); }
845
846   // Random access iterator requirements
847   template<typename _IteratorL, typename _IteratorR, typename _Container>
848     inline bool
849     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
850               const __normal_iterator<_IteratorR, _Container>& __rhs)
851     _GLIBCXX_NOEXCEPT
852     { return __lhs.base() < __rhs.base(); }
853
854   template<typename _Iterator, typename _Container>
855     inline bool
856     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
857               const __normal_iterator<_Iterator, _Container>& __rhs)
858     _GLIBCXX_NOEXCEPT
859     { return __lhs.base() < __rhs.base(); }
860
861   template<typename _IteratorL, typename _IteratorR, typename _Container>
862     inline bool
863     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
864               const __normal_iterator<_IteratorR, _Container>& __rhs)
865     _GLIBCXX_NOEXCEPT
866     { return __lhs.base() > __rhs.base(); }
867
868   template<typename _Iterator, typename _Container>
869     inline bool
870     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
871               const __normal_iterator<_Iterator, _Container>& __rhs)
872     _GLIBCXX_NOEXCEPT
873     { return __lhs.base() > __rhs.base(); }
874
875   template<typename _IteratorL, typename _IteratorR, typename _Container>
876     inline bool
877     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
878                const __normal_iterator<_IteratorR, _Container>& __rhs)
879     _GLIBCXX_NOEXCEPT
880     { return __lhs.base() <= __rhs.base(); }
881
882   template<typename _Iterator, typename _Container>
883     inline bool
884     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
885                const __normal_iterator<_Iterator, _Container>& __rhs)
886     _GLIBCXX_NOEXCEPT
887     { return __lhs.base() <= __rhs.base(); }
888
889   template<typename _IteratorL, typename _IteratorR, typename _Container>
890     inline bool
891     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
892                const __normal_iterator<_IteratorR, _Container>& __rhs)
893     _GLIBCXX_NOEXCEPT
894     { return __lhs.base() >= __rhs.base(); }
895
896   template<typename _Iterator, typename _Container>
897     inline bool
898     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
899                const __normal_iterator<_Iterator, _Container>& __rhs)
900     _GLIBCXX_NOEXCEPT
901     { return __lhs.base() >= __rhs.base(); }
902
903   // _GLIBCXX_RESOLVE_LIB_DEFECTS
904   // According to the resolution of DR179 not only the various comparison
905   // operators but also operator- must accept mixed iterator/const_iterator
906   // parameters.
907   template<typename _IteratorL, typename _IteratorR, typename _Container>
908 #if __cplusplus >= 201103L
909     // DR 685.
910     inline auto
911     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
912               const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
913     -> decltype(__lhs.base() - __rhs.base())
914 #else
915     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
916     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
917               const __normal_iterator<_IteratorR, _Container>& __rhs)
918 #endif
919     { return __lhs.base() - __rhs.base(); }
920
921   template<typename _Iterator, typename _Container>
922     inline typename __normal_iterator<_Iterator, _Container>::difference_type
923     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
924               const __normal_iterator<_Iterator, _Container>& __rhs)
925     _GLIBCXX_NOEXCEPT
926     { return __lhs.base() - __rhs.base(); }
927
928   template<typename _Iterator, typename _Container>
929     inline __normal_iterator<_Iterator, _Container>
930     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
931               __n, const __normal_iterator<_Iterator, _Container>& __i)
932     _GLIBCXX_NOEXCEPT
933     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
934
935 _GLIBCXX_END_NAMESPACE_VERSION
936 } // namespace
937
938 #if __cplusplus >= 201103L
939
940 namespace std _GLIBCXX_VISIBILITY(default)
941 {
942 _GLIBCXX_BEGIN_NAMESPACE_VERSION
943
944   /**
945    * @addtogroup iterators
946    * @{
947    */
948
949   // 24.4.3  Move iterators
950   /**
951    *  Class template move_iterator is an iterator adapter with the same
952    *  behavior as the underlying iterator except that its dereference
953    *  operator implicitly converts the value returned by the underlying
954    *  iterator's dereference operator to an rvalue reference.  Some
955    *  generic algorithms can be called with move iterators to replace
956    *  copying with moving.
957    */
958   template<typename _Iterator>
959     class move_iterator
960     {
961     protected:
962       _Iterator _M_current;
963
964       typedef iterator_traits<_Iterator>                __traits_type;
965       typedef typename __traits_type::reference         __base_ref;
966
967     public:
968       typedef _Iterator                                 iterator_type;
969       typedef typename __traits_type::iterator_category iterator_category;
970       typedef typename __traits_type::value_type        value_type;
971       typedef typename __traits_type::difference_type   difference_type;
972       // NB: DR 680.
973       typedef _Iterator                                 pointer;
974       // _GLIBCXX_RESOLVE_LIB_DEFECTS
975       // 2106. move_iterator wrapping iterators returning prvalues
976       typedef typename conditional<is_reference<__base_ref>::value,
977                          typename remove_reference<__base_ref>::type&&,
978                          __base_ref>::type              reference;
979
980       move_iterator()
981       : _M_current() { }
982
983       explicit
984       move_iterator(iterator_type __i)
985       : _M_current(__i) { }
986
987       template<typename _Iter>
988         move_iterator(const move_iterator<_Iter>& __i)
989         : _M_current(__i.base()) { }
990
991       iterator_type
992       base() const
993       { return _M_current; }
994
995       reference
996       operator*() const
997       { return static_cast<reference>(*_M_current); }
998
999       pointer
1000       operator->() const
1001       { return _M_current; }
1002
1003       move_iterator&
1004       operator++()
1005       {
1006         ++_M_current;
1007         return *this;
1008       }
1009
1010       move_iterator
1011       operator++(int)
1012       {
1013         move_iterator __tmp = *this;
1014         ++_M_current;
1015         return __tmp;
1016       }
1017
1018       move_iterator&
1019       operator--()
1020       {
1021         --_M_current;
1022         return *this;
1023       }
1024
1025       move_iterator
1026       operator--(int)
1027       {
1028         move_iterator __tmp = *this;
1029         --_M_current;
1030         return __tmp;
1031       }
1032
1033       move_iterator
1034       operator+(difference_type __n) const
1035       { return move_iterator(_M_current + __n); }
1036
1037       move_iterator&
1038       operator+=(difference_type __n)
1039       {
1040         _M_current += __n;
1041         return *this;
1042       }
1043
1044       move_iterator
1045       operator-(difference_type __n) const
1046       { return move_iterator(_M_current - __n); }
1047     
1048       move_iterator&
1049       operator-=(difference_type __n)
1050       { 
1051         _M_current -= __n;
1052         return *this;
1053       }
1054
1055       reference
1056       operator[](difference_type __n) const
1057       { return std::move(_M_current[__n]); }
1058     };
1059
1060   // Note: See __normal_iterator operators note from Gaby to understand
1061   // why there are always 2 versions for most of the move_iterator
1062   // operators.
1063   template<typename _IteratorL, typename _IteratorR>
1064     inline bool
1065     operator==(const move_iterator<_IteratorL>& __x,
1066                const move_iterator<_IteratorR>& __y)
1067     { return __x.base() == __y.base(); }
1068
1069   template<typename _Iterator>
1070     inline bool
1071     operator==(const move_iterator<_Iterator>& __x,
1072                const move_iterator<_Iterator>& __y)
1073     { return __x.base() == __y.base(); }
1074
1075   template<typename _IteratorL, typename _IteratorR>
1076     inline bool
1077     operator!=(const move_iterator<_IteratorL>& __x,
1078                const move_iterator<_IteratorR>& __y)
1079     { return !(__x == __y); }
1080
1081   template<typename _Iterator>
1082     inline bool
1083     operator!=(const move_iterator<_Iterator>& __x,
1084                const move_iterator<_Iterator>& __y)
1085     { return !(__x == __y); }
1086
1087   template<typename _IteratorL, typename _IteratorR>
1088     inline bool
1089     operator<(const move_iterator<_IteratorL>& __x,
1090               const move_iterator<_IteratorR>& __y)
1091     { return __x.base() < __y.base(); }
1092
1093   template<typename _Iterator>
1094     inline bool
1095     operator<(const move_iterator<_Iterator>& __x,
1096               const move_iterator<_Iterator>& __y)
1097     { return __x.base() < __y.base(); }
1098
1099   template<typename _IteratorL, typename _IteratorR>
1100     inline bool
1101     operator<=(const move_iterator<_IteratorL>& __x,
1102                const move_iterator<_IteratorR>& __y)
1103     { return !(__y < __x); }
1104
1105   template<typename _Iterator>
1106     inline bool
1107     operator<=(const move_iterator<_Iterator>& __x,
1108                const move_iterator<_Iterator>& __y)
1109     { return !(__y < __x); }
1110
1111   template<typename _IteratorL, typename _IteratorR>
1112     inline bool
1113     operator>(const move_iterator<_IteratorL>& __x,
1114               const move_iterator<_IteratorR>& __y)
1115     { return __y < __x; }
1116
1117   template<typename _Iterator>
1118     inline bool
1119     operator>(const move_iterator<_Iterator>& __x,
1120               const move_iterator<_Iterator>& __y)
1121     { return __y < __x; }
1122
1123   template<typename _IteratorL, typename _IteratorR>
1124     inline bool
1125     operator>=(const move_iterator<_IteratorL>& __x,
1126                const move_iterator<_IteratorR>& __y)
1127     { return !(__x < __y); }
1128
1129   template<typename _Iterator>
1130     inline bool
1131     operator>=(const move_iterator<_Iterator>& __x,
1132                const move_iterator<_Iterator>& __y)
1133     { return !(__x < __y); }
1134
1135   // DR 685.
1136   template<typename _IteratorL, typename _IteratorR>
1137     inline auto
1138     operator-(const move_iterator<_IteratorL>& __x,
1139               const move_iterator<_IteratorR>& __y)
1140     -> decltype(__x.base() - __y.base())
1141     { return __x.base() - __y.base(); }
1142
1143   template<typename _Iterator>
1144     inline auto
1145     operator-(const move_iterator<_Iterator>& __x,
1146               const move_iterator<_Iterator>& __y)
1147     -> decltype(__x.base() - __y.base())
1148     { return __x.base() - __y.base(); }
1149
1150   template<typename _Iterator>
1151     inline move_iterator<_Iterator>
1152     operator+(typename move_iterator<_Iterator>::difference_type __n,
1153               const move_iterator<_Iterator>& __x)
1154     { return __x + __n; }
1155
1156   template<typename _Iterator>
1157     inline move_iterator<_Iterator>
1158     make_move_iterator(_Iterator __i)
1159     { return move_iterator<_Iterator>(__i); }
1160
1161   template<typename _Iterator, typename _ReturnType
1162     = typename conditional<__move_if_noexcept_cond
1163       <typename iterator_traits<_Iterator>::value_type>::value,
1164                 _Iterator, move_iterator<_Iterator>>::type>
1165     inline _ReturnType
1166     __make_move_if_noexcept_iterator(_Iterator __i)
1167     { return _ReturnType(__i); }
1168
1169   // @} group iterators
1170
1171 _GLIBCXX_END_NAMESPACE_VERSION
1172 } // namespace
1173
1174 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1175 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
1176   std::__make_move_if_noexcept_iterator(_Iter)
1177 #else
1178 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1179 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
1180 #endif // C++11
1181
1182 #endif