OSDN Git Service

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