62 #ifndef _STL_ITERATOR_H
63 #define _STL_ITERATOR_H 1
69 namespace std _GLIBCXX_VISIBILITY(default)
71 _GLIBCXX_BEGIN_NAMESPACE_VERSION
97 template<
typename _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>
108 typedef iterator_traits<_Iterator> __traits_type;
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;
134 : current(__x.current) { }
140 template<
typename _Iter>
142 : current(__x.
base()) { }
164 _Iterator __tmp = current;
278 {
return *(*
this + __n); }
291 template<
typename _Iterator>
295 {
return __x.
base() == __y.
base(); }
297 template<
typename _Iterator>
299 operator<(const reverse_iterator<_Iterator>& __x,
300 const reverse_iterator<_Iterator>& __y)
301 {
return __y.base() < __x.base(); }
303 template<
typename _Iterator>
305 operator!=(
const reverse_iterator<_Iterator>& __x,
306 const reverse_iterator<_Iterator>& __y)
307 {
return !(__x == __y); }
309 template<
typename _Iterator>
311 operator>(
const reverse_iterator<_Iterator>& __x,
312 const reverse_iterator<_Iterator>& __y)
313 {
return __y < __x; }
315 template<
typename _Iterator>
317 operator<=(const reverse_iterator<_Iterator>& __x,
318 const reverse_iterator<_Iterator>& __y)
319 {
return !(__y < __x); }
321 template<
typename _Iterator>
323 operator>=(
const reverse_iterator<_Iterator>& __x,
324 const reverse_iterator<_Iterator>& __y)
325 {
return !(__x < __y); }
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(); }
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); }
341 template<
typename _IteratorL,
typename _IteratorR>
343 operator==(
const reverse_iterator<_IteratorL>& __x,
344 const reverse_iterator<_IteratorR>& __y)
345 {
return __x.base() == __y.base(); }
347 template<
typename _IteratorL,
typename _IteratorR>
349 operator<(const reverse_iterator<_IteratorL>& __x,
350 const reverse_iterator<_IteratorR>& __y)
351 {
return __y.base() < __x.base(); }
353 template<
typename _IteratorL,
typename _IteratorR>
355 operator!=(
const reverse_iterator<_IteratorL>& __x,
356 const reverse_iterator<_IteratorR>& __y)
357 {
return !(__x == __y); }
359 template<
typename _IteratorL,
typename _IteratorR>
361 operator>(
const reverse_iterator<_IteratorL>& __x,
362 const reverse_iterator<_IteratorR>& __y)
363 {
return __y < __x; }
365 template<
typename _IteratorL,
typename _IteratorR>
367 operator<=(const reverse_iterator<_IteratorL>& __x,
368 const reverse_iterator<_IteratorR>& __y)
369 {
return !(__y < __x); }
371 template<
typename _IteratorL,
typename _IteratorR>
373 operator>=(
const reverse_iterator<_IteratorL>& __x,
374 const reverse_iterator<_IteratorR>& __y)
375 {
return !(__x < __y); }
377 template<
typename _IteratorL,
typename _IteratorR>
378 #ifdef __GXX_EXPERIMENTAL_CXX0X__
381 operator-(
const reverse_iterator<_IteratorL>& __x,
382 const reverse_iterator<_IteratorR>& __y)
383 -> decltype(__y.base() - __x.base())
385 inline typename reverse_iterator<_IteratorL>::difference_type
386 operator-(
const reverse_iterator<_IteratorL>& __x,
387 const reverse_iterator<_IteratorR>& __y)
389 {
return __y.base() - __x.base(); }
403 template<
typename _Container>
405 :
public iterator<output_iterator_tag, void, void, void, void>
408 _Container* container;
429 #ifndef __GXX_EXPERIMENTAL_CXX0X__
431 operator=(
typename _Container::const_reference __value)
433 container->push_back(__value);
438 operator=(
const typename _Container::value_type& __value)
440 container->push_back(__value);
445 operator=(
typename _Container::value_type&& __value)
447 container->push_back(std::move(__value));
479 template<
typename _Container>
480 inline back_insert_iterator<_Container>
494 template<
typename _Container>
496 :
public iterator<output_iterator_tag, void, void, void, void>
499 _Container* container;
519 #ifndef __GXX_EXPERIMENTAL_CXX0X__
521 operator=(
typename _Container::const_reference __value)
523 container->push_front(__value);
528 operator=(
const typename _Container::value_type& __value)
530 container->push_front(__value);
535 operator=(
typename _Container::value_type&& __value)
537 container->push_front(std::move(__value));
569 template<
typename _Container>
570 inline front_insert_iterator<_Container>
588 template<
typename _Container>
590 :
public iterator<output_iterator_tag, void, void, void, void>
593 _Container* container;
594 typename _Container::iterator iter;
605 : container(&__x), iter(__i) {}
630 #ifndef __GXX_EXPERIMENTAL_CXX0X__
632 operator=(
typename _Container::const_reference __value)
634 iter = container->insert(iter, __value);
640 operator=(
const typename _Container::value_type& __value)
642 iter = container->insert(iter, __value);
648 operator=(
typename _Container::value_type&& __value)
650 iter = container->insert(iter, std::move(__value));
683 template<
typename _Container,
typename _Iterator>
684 inline insert_iterator<_Container>
688 typename _Container::iterator(__i));
693 _GLIBCXX_END_NAMESPACE_VERSION
696 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
698 _GLIBCXX_BEGIN_NAMESPACE_VERSION
707 using std::iterator_traits;
709 template<
typename _Iterator,
typename _Container>
710 class __normal_iterator
713 _Iterator _M_current;
715 typedef iterator_traits<_Iterator> __traits_type;
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;
725 _GLIBCXX_CONSTEXPR __normal_iterator() : _M_current(_Iterator()) { }
728 __normal_iterator(
const _Iterator& __i) : _M_current(__i) { }
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()) { }
741 {
return *_M_current; }
745 {
return _M_current; }
756 {
return __normal_iterator(_M_current++); }
768 {
return __normal_iterator(_M_current--); }
773 {
return _M_current[__n]; }
776 operator+=(
const difference_type& __n)
777 { _M_current += __n;
return *
this; }
780 operator+(
const difference_type& __n)
const
781 {
return __normal_iterator(_M_current + __n); }
784 operator-=(
const difference_type& __n)
785 { _M_current -= __n;
return *
this; }
788 operator-(
const difference_type& __n)
const
789 {
return __normal_iterator(_M_current - __n); }
793 {
return _M_current; }
805 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
807 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
808 const __normal_iterator<_IteratorR, _Container>& __rhs)
809 {
return __lhs.base() == __rhs.base(); }
811 template<
typename _Iterator,
typename _Container>
813 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
814 const __normal_iterator<_Iterator, _Container>& __rhs)
815 {
return __lhs.base() == __rhs.base(); }
817 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
819 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
820 const __normal_iterator<_IteratorR, _Container>& __rhs)
821 {
return __lhs.base() != __rhs.base(); }
823 template<
typename _Iterator,
typename _Container>
825 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
826 const __normal_iterator<_Iterator, _Container>& __rhs)
827 {
return __lhs.base() != __rhs.base(); }
830 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
832 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
833 const __normal_iterator<_IteratorR, _Container>& __rhs)
834 {
return __lhs.base() < __rhs.base(); }
836 template<
typename _Iterator,
typename _Container>
838 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
839 const __normal_iterator<_Iterator, _Container>& __rhs)
840 {
return __lhs.base() < __rhs.base(); }
842 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
844 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
845 const __normal_iterator<_IteratorR, _Container>& __rhs)
846 {
return __lhs.base() > __rhs.base(); }
848 template<
typename _Iterator,
typename _Container>
850 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
851 const __normal_iterator<_Iterator, _Container>& __rhs)
852 {
return __lhs.base() > __rhs.base(); }
854 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
856 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
857 const __normal_iterator<_IteratorR, _Container>& __rhs)
858 {
return __lhs.base() <= __rhs.base(); }
860 template<
typename _Iterator,
typename _Container>
862 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
863 const __normal_iterator<_Iterator, _Container>& __rhs)
864 {
return __lhs.base() <= __rhs.base(); }
866 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
868 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
869 const __normal_iterator<_IteratorR, _Container>& __rhs)
870 {
return __lhs.base() >= __rhs.base(); }
872 template<
typename _Iterator,
typename _Container>
874 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
875 const __normal_iterator<_Iterator, _Container>& __rhs)
876 {
return __lhs.base() >= __rhs.base(); }
882 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
883 #ifdef __GXX_EXPERIMENTAL_CXX0X__
886 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
887 const __normal_iterator<_IteratorR, _Container>& __rhs)
888 -> decltype(__lhs.base() - __rhs.base())
890 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
891 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
892 const __normal_iterator<_IteratorR, _Container>& __rhs)
894 {
return __lhs.base() - __rhs.base(); }
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(); }
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); }
908 _GLIBCXX_END_NAMESPACE_VERSION
911 #ifdef __GXX_EXPERIMENTAL_CXX0X__
913 namespace std _GLIBCXX_VISIBILITY(default)
915 _GLIBCXX_BEGIN_NAMESPACE_VERSION
931 template<
typename _Iterator>
935 _Iterator _M_current;
937 typedef iterator_traits<_Iterator> __traits_type;
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;
945 typedef _Iterator pointer;
946 typedef value_type&& reference;
952 move_iterator(iterator_type __i)
953 : _M_current(__i) { }
955 template<
typename _Iter>
956 move_iterator(
const move_iterator<_Iter>& __i)
957 : _M_current(__i.base()) { }
961 {
return _M_current; }
965 {
return std::move(*_M_current); }
969 {
return _M_current; }
981 move_iterator __tmp = *
this;
996 move_iterator __tmp = *
this;
1002 operator+(difference_type __n)
const
1003 {
return move_iterator(_M_current + __n); }
1006 operator+=(difference_type __n)
1013 operator-(difference_type __n)
const
1014 {
return move_iterator(_M_current - __n); }
1017 operator-=(difference_type __n)
1024 operator[](difference_type __n)
const
1025 {
return std::move(_M_current[__n]); }
1031 template<
typename _IteratorL,
typename _IteratorR>
1033 operator==(
const move_iterator<_IteratorL>& __x,
1034 const move_iterator<_IteratorR>& __y)
1035 {
return __x.base() == __y.base(); }
1037 template<
typename _Iterator>
1039 operator==(
const move_iterator<_Iterator>& __x,
1040 const move_iterator<_Iterator>& __y)
1041 {
return __x.base() == __y.base(); }
1043 template<
typename _IteratorL,
typename _IteratorR>
1045 operator!=(
const move_iterator<_IteratorL>& __x,
1046 const move_iterator<_IteratorR>& __y)
1047 {
return !(__x == __y); }
1049 template<
typename _Iterator>
1051 operator!=(
const move_iterator<_Iterator>& __x,
1052 const move_iterator<_Iterator>& __y)
1053 {
return !(__x == __y); }
1055 template<
typename _IteratorL,
typename _IteratorR>
1057 operator<(const move_iterator<_IteratorL>& __x,
1058 const move_iterator<_IteratorR>& __y)
1059 {
return __x.base() < __y.base(); }
1061 template<
typename _Iterator>
1063 operator<(const move_iterator<_Iterator>& __x,
1064 const move_iterator<_Iterator>& __y)
1065 {
return __x.base() < __y.base(); }
1067 template<
typename _IteratorL,
typename _IteratorR>
1069 operator<=(const move_iterator<_IteratorL>& __x,
1070 const move_iterator<_IteratorR>& __y)
1071 {
return !(__y < __x); }
1073 template<
typename _Iterator>
1075 operator<=(const move_iterator<_Iterator>& __x,
1076 const move_iterator<_Iterator>& __y)
1077 {
return !(__y < __x); }
1079 template<
typename _IteratorL,
typename _IteratorR>
1081 operator>(
const move_iterator<_IteratorL>& __x,
1082 const move_iterator<_IteratorR>& __y)
1083 {
return __y < __x; }
1085 template<
typename _Iterator>
1087 operator>(
const move_iterator<_Iterator>& __x,
1088 const move_iterator<_Iterator>& __y)
1089 {
return __y < __x; }
1091 template<
typename _IteratorL,
typename _IteratorR>
1093 operator>=(
const move_iterator<_IteratorL>& __x,
1094 const move_iterator<_IteratorR>& __y)
1095 {
return !(__x < __y); }
1097 template<
typename _Iterator>
1099 operator>=(
const move_iterator<_Iterator>& __x,
1100 const move_iterator<_Iterator>& __y)
1101 {
return !(__x < __y); }
1104 template<
typename _IteratorL,
typename _IteratorR>
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(); }
1111 template<
typename _Iterator>
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(); }
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; }
1124 template<
typename _Iterator>
1125 inline move_iterator<_Iterator>
1126 make_move_iterator(_Iterator __i)
1127 {
return move_iterator<_Iterator>(__i); }
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>
1134 __make_move_if_noexcept_iterator(_Iterator __i)
1135 {
return _ReturnType(__i); }
1139 _GLIBCXX_END_NAMESPACE_VERSION
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)
1146 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1147 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
1148 #endif // __GXX_EXPERIMENTAL_CXX0X__
reference operator[](difference_type __n) const
reverse_iterator & operator--()
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
reference operator*() const
back_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
insert_iterator(_Container &__x, typename _Container::iterator __i)
insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
reverse_iterator(const reverse_iterator &__x)
reverse_iterator(const reverse_iterator< _Iter > &__x)
front_insert_iterator & operator=(const typename _Container::value_type &__value)
reverse_iterator operator-(difference_type __n) const
back_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
Turns assignment into insertion.
_Container container_type
A nested typedef for the type of whatever container you used.
Turns assignment into insertion.
reverse_iterator operator+(difference_type __n) const
reverse_iterator operator--(int)
front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
reverse_iterator operator++(int)
front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
front_insert_iterator & operator*()
Simply returns *this.
insert_iterator & operator=(const typename _Container::value_type &__value)
reverse_iterator & operator++()
complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
reverse_iterator(iterator_type __x)
insert_iterator & operator*()
Simply returns *this.
complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
reference operator[](size_t __position)
Array-indexing support.
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)
back_insert_iterator & operator=(const typename _Container::value_type &__value)
_Container container_type
A nested typedef for the type of whatever container you used.
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
iterator_type base() const
front_insert_iterator< _Container > front_inserter(_Container &__x)
reverse_iterator & operator+=(difference_type __n)
reverse_iterator & operator-=(difference_type __n)
back_insert_iterator & operator*()
Simply returns *this.
Turns assignment into insertion.
_Container container_type
A nested typedef for the type of whatever container you used.
back_insert_iterator< _Container > back_inserter(_Container &__x)
pointer operator->() const