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
68namespace 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
707namespace __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
940namespace 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
1183