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