60 #ifndef _STL_ITERATOR_H
61 #define _STL_ITERATOR_H 1
68 namespace std _GLIBCXX_VISIBILITY(default)
70 _GLIBCXX_BEGIN_NAMESPACE_VERSION
96 template<
typename _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>
107 typedef iterator_traits<_Iterator> __traits_type;
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;
133 : current(__x.current) { }
139 template<
typename _Iter>
141 : current(__x.
base()) { }
163 _Iterator __tmp = current;
277 {
return *(*
this + __n); }
290 template<
typename _Iterator>
294 {
return __x.
base() == __y.
base(); }
296 template<
typename _Iterator>
298 operator<(const reverse_iterator<_Iterator>& __x,
299 const reverse_iterator<_Iterator>& __y)
300 {
return __y.base() < __x.base(); }
302 template<
typename _Iterator>
304 operator!=(
const reverse_iterator<_Iterator>& __x,
305 const reverse_iterator<_Iterator>& __y)
306 {
return !(__x == __y); }
308 template<
typename _Iterator>
310 operator>(
const reverse_iterator<_Iterator>& __x,
311 const reverse_iterator<_Iterator>& __y)
312 {
return __y < __x; }
314 template<
typename _Iterator>
316 operator<=(const reverse_iterator<_Iterator>& __x,
317 const reverse_iterator<_Iterator>& __y)
318 {
return !(__y < __x); }
320 template<
typename _Iterator>
322 operator>=(
const reverse_iterator<_Iterator>& __x,
323 const reverse_iterator<_Iterator>& __y)
324 {
return !(__x < __y); }
326 template<
typename _Iterator>
327 #if __cplusplus < 201103L
328 inline typename reverse_iterator<_Iterator>::difference_type
329 operator-(
const reverse_iterator<_Iterator>& __x,
330 const reverse_iterator<_Iterator>& __y)
333 operator-(
const reverse_iterator<_Iterator>& __x,
334 const reverse_iterator<_Iterator>& __y)
335 -> decltype(__x.base() - __y.base())
337 {
return __y.base() - __x.base(); }
339 template<
typename _Iterator>
340 inline reverse_iterator<_Iterator>
341 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
342 const reverse_iterator<_Iterator>& __x)
343 {
return reverse_iterator<_Iterator>(__x.base() - __n); }
347 template<
typename _IteratorL,
typename _IteratorR>
349 operator==(
const reverse_iterator<_IteratorL>& __x,
350 const reverse_iterator<_IteratorR>& __y)
351 {
return __x.base() == __y.base(); }
353 template<
typename _IteratorL,
typename _IteratorR>
355 operator<(const reverse_iterator<_IteratorL>& __x,
356 const reverse_iterator<_IteratorR>& __y)
357 {
return __y.base() < __x.base(); }
359 template<
typename _IteratorL,
typename _IteratorR>
361 operator!=(
const reverse_iterator<_IteratorL>& __x,
362 const reverse_iterator<_IteratorR>& __y)
363 {
return !(__x == __y); }
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 !(__y < __x); }
377 template<
typename _IteratorL,
typename _IteratorR>
379 operator>=(
const reverse_iterator<_IteratorL>& __x,
380 const reverse_iterator<_IteratorR>& __y)
381 {
return !(__x < __y); }
383 template<
typename _IteratorL,
typename _IteratorR>
384 #if __cplusplus >= 201103L
387 operator-(
const reverse_iterator<_IteratorL>& __x,
388 const reverse_iterator<_IteratorR>& __y)
389 -> decltype(__y.base() - __x.base())
391 inline typename reverse_iterator<_IteratorL>::difference_type
392 operator-(
const reverse_iterator<_IteratorL>& __x,
393 const reverse_iterator<_IteratorR>& __y)
395 {
return __y.base() - __x.base(); }
398 #if __cplusplus > 201103L
399 #define __cpp_lib_make_reverse_iterator 201402
404 template<
typename _Iterator>
405 inline reverse_iterator<_Iterator>
421 template<
typename _Container>
423 :
public iterator<output_iterator_tag, void, void, void, void>
426 _Container* container;
447 #if __cplusplus < 201103L
449 operator=(
typename _Container::const_reference __value)
451 container->push_back(__value);
456 operator=(
const typename _Container::value_type& __value)
458 container->push_back(__value);
463 operator=(
typename _Container::value_type&& __value)
465 container->push_back(std::move(__value));
497 template<
typename _Container>
498 inline back_insert_iterator<_Container>
512 template<
typename _Container>
514 :
public iterator<output_iterator_tag, void, void, void, void>
517 _Container* container;
537 #if __cplusplus < 201103L
539 operator=(
typename _Container::const_reference __value)
541 container->push_front(__value);
546 operator=(
const typename _Container::value_type& __value)
548 container->push_front(__value);
553 operator=(
typename _Container::value_type&& __value)
555 container->push_front(std::move(__value));
587 template<
typename _Container>
588 inline front_insert_iterator<_Container>
606 template<
typename _Container>
608 :
public iterator<output_iterator_tag, void, void, void, void>
611 _Container* container;
612 typename _Container::iterator iter;
623 : container(&__x), iter(__i) {}
648 #if __cplusplus < 201103L
650 operator=(
typename _Container::const_reference __value)
652 iter = container->insert(iter, __value);
658 operator=(
const typename _Container::value_type& __value)
660 iter = container->insert(iter, __value);
666 operator=(
typename _Container::value_type&& __value)
668 iter = container->insert(iter, std::move(__value));
701 template<
typename _Container,
typename _Iterator>
702 inline insert_iterator<_Container>
706 typename _Container::iterator(__i));
711 _GLIBCXX_END_NAMESPACE_VERSION
714 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
716 _GLIBCXX_BEGIN_NAMESPACE_VERSION
725 using std::iterator_traits;
727 template<
typename _Iterator,
typename _Container>
728 class __normal_iterator
731 _Iterator _M_current;
733 typedef iterator_traits<_Iterator> __traits_type;
736 typedef _Iterator iterator_type;
737 typedef typename __traits_type::iterator_category iterator_category;
738 typedef typename __traits_type::value_type value_type;
739 typedef typename __traits_type::difference_type difference_type;
740 typedef typename __traits_type::reference reference;
741 typedef typename __traits_type::pointer pointer;
743 _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
744 : _M_current(_Iterator()) { }
747 __normal_iterator(
const _Iterator& __i) _GLIBCXX_NOEXCEPT
748 : _M_current(__i) { }
751 template<
typename _Iter>
752 __normal_iterator(
const __normal_iterator<_Iter,
753 typename __enable_if<
754 (std::__are_same<_Iter, typename _Container::pointer>::__value),
755 _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
756 : _M_current(__i.base()) { }
760 operator*() const _GLIBCXX_NOEXCEPT
761 {
return *_M_current; }
764 operator->() const _GLIBCXX_NOEXCEPT
765 {
return _M_current; }
768 operator++() _GLIBCXX_NOEXCEPT
775 operator++(
int) _GLIBCXX_NOEXCEPT
776 {
return __normal_iterator(_M_current++); }
780 operator--() _GLIBCXX_NOEXCEPT
787 operator--(
int) _GLIBCXX_NOEXCEPT
788 {
return __normal_iterator(_M_current--); }
792 operator[](difference_type __n)
const _GLIBCXX_NOEXCEPT
793 {
return _M_current[__n]; }
796 operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
797 { _M_current += __n;
return *
this; }
800 operator+(difference_type __n)
const _GLIBCXX_NOEXCEPT
801 {
return __normal_iterator(_M_current + __n); }
804 operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
805 { _M_current -= __n;
return *
this; }
808 operator-(difference_type __n)
const _GLIBCXX_NOEXCEPT
809 {
return __normal_iterator(_M_current - __n); }
812 base() const _GLIBCXX_NOEXCEPT
813 {
return _M_current; }
825 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
827 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
828 const __normal_iterator<_IteratorR, _Container>& __rhs)
830 {
return __lhs.base() == __rhs.base(); }
832 template<
typename _Iterator,
typename _Container>
834 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
835 const __normal_iterator<_Iterator, _Container>& __rhs)
837 {
return __lhs.base() == __rhs.base(); }
839 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
841 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
842 const __normal_iterator<_IteratorR, _Container>& __rhs)
844 {
return __lhs.base() != __rhs.base(); }
846 template<
typename _Iterator,
typename _Container>
848 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
849 const __normal_iterator<_Iterator, _Container>& __rhs)
851 {
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)
859 {
return __lhs.base() < __rhs.base(); }
861 template<
typename _Iterator,
typename _Container>
863 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
864 const __normal_iterator<_Iterator, _Container>& __rhs)
866 {
return __lhs.base() < __rhs.base(); }
868 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
870 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
871 const __normal_iterator<_IteratorR, _Container>& __rhs)
873 {
return __lhs.base() > __rhs.base(); }
875 template<
typename _Iterator,
typename _Container>
877 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
878 const __normal_iterator<_Iterator, _Container>& __rhs)
880 {
return __lhs.base() > __rhs.base(); }
882 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
884 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
885 const __normal_iterator<_IteratorR, _Container>& __rhs)
887 {
return __lhs.base() <= __rhs.base(); }
889 template<
typename _Iterator,
typename _Container>
891 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
892 const __normal_iterator<_Iterator, _Container>& __rhs)
894 {
return __lhs.base() <= __rhs.base(); }
896 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
898 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
899 const __normal_iterator<_IteratorR, _Container>& __rhs)
901 {
return __lhs.base() >= __rhs.base(); }
903 template<
typename _Iterator,
typename _Container>
905 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
906 const __normal_iterator<_Iterator, _Container>& __rhs)
908 {
return __lhs.base() >= __rhs.base(); }
914 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
915 #if __cplusplus >= 201103L
918 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
919 const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
920 -> decltype(__lhs.base() - __rhs.base())
922 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
923 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
924 const __normal_iterator<_IteratorR, _Container>& __rhs)
926 {
return __lhs.base() - __rhs.base(); }
928 template<
typename _Iterator,
typename _Container>
929 inline typename __normal_iterator<_Iterator, _Container>::difference_type
930 operator-(
const __normal_iterator<_Iterator, _Container>& __lhs,
931 const __normal_iterator<_Iterator, _Container>& __rhs)
933 {
return __lhs.base() - __rhs.base(); }
935 template<
typename _Iterator,
typename _Container>
936 inline __normal_iterator<_Iterator, _Container>
937 operator+(
typename __normal_iterator<_Iterator, _Container>::difference_type
938 __n,
const __normal_iterator<_Iterator, _Container>& __i)
940 {
return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
942 _GLIBCXX_END_NAMESPACE_VERSION
945 #if __cplusplus >= 201103L
947 namespace std _GLIBCXX_VISIBILITY(default)
949 _GLIBCXX_BEGIN_NAMESPACE_VERSION
965 template<
typename _Iterator>
969 _Iterator _M_current;
971 typedef iterator_traits<_Iterator> __traits_type;
972 typedef typename __traits_type::reference __base_ref;
975 typedef _Iterator iterator_type;
976 typedef typename __traits_type::iterator_category iterator_category;
977 typedef typename __traits_type::value_type value_type;
978 typedef typename __traits_type::difference_type difference_type;
980 typedef _Iterator pointer;
983 typedef typename conditional<is_reference<__base_ref>::value,
984 typename remove_reference<__base_ref>::type&&,
985 __base_ref>::type reference;
991 move_iterator(iterator_type __i)
992 : _M_current(__i) { }
994 template<
typename _Iter>
995 move_iterator(
const move_iterator<_Iter>& __i)
996 : _M_current(__i.base()) { }
1000 {
return _M_current; }
1004 {
return static_cast<reference
>(*_M_current); }
1008 {
return _M_current; }
1020 move_iterator __tmp = *
this;
1035 move_iterator __tmp = *
this;
1041 operator+(difference_type __n)
const
1042 {
return move_iterator(_M_current + __n); }
1045 operator+=(difference_type __n)
1052 operator-(difference_type __n)
const
1053 {
return move_iterator(_M_current - __n); }
1056 operator-=(difference_type __n)
1063 operator[](difference_type __n)
const
1064 {
return std::move(_M_current[__n]); }
1070 template<
typename _IteratorL,
typename _IteratorR>
1072 operator==(
const move_iterator<_IteratorL>& __x,
1073 const move_iterator<_IteratorR>& __y)
1074 {
return __x.base() == __y.base(); }
1076 template<
typename _Iterator>
1078 operator==(
const move_iterator<_Iterator>& __x,
1079 const move_iterator<_Iterator>& __y)
1080 {
return __x.base() == __y.base(); }
1082 template<
typename _IteratorL,
typename _IteratorR>
1084 operator!=(
const move_iterator<_IteratorL>& __x,
1085 const move_iterator<_IteratorR>& __y)
1086 {
return !(__x == __y); }
1088 template<
typename _Iterator>
1090 operator!=(
const move_iterator<_Iterator>& __x,
1091 const move_iterator<_Iterator>& __y)
1092 {
return !(__x == __y); }
1094 template<
typename _IteratorL,
typename _IteratorR>
1096 operator<(const move_iterator<_IteratorL>& __x,
1097 const move_iterator<_IteratorR>& __y)
1098 {
return __x.base() < __y.base(); }
1100 template<
typename _Iterator>
1102 operator<(const move_iterator<_Iterator>& __x,
1103 const move_iterator<_Iterator>& __y)
1104 {
return __x.base() < __y.base(); }
1106 template<
typename _IteratorL,
typename _IteratorR>
1108 operator<=(const move_iterator<_IteratorL>& __x,
1109 const move_iterator<_IteratorR>& __y)
1110 {
return !(__y < __x); }
1112 template<
typename _Iterator>
1114 operator<=(const move_iterator<_Iterator>& __x,
1115 const move_iterator<_Iterator>& __y)
1116 {
return !(__y < __x); }
1118 template<
typename _IteratorL,
typename _IteratorR>
1120 operator>(
const move_iterator<_IteratorL>& __x,
1121 const move_iterator<_IteratorR>& __y)
1122 {
return __y < __x; }
1124 template<
typename _Iterator>
1126 operator>(
const move_iterator<_Iterator>& __x,
1127 const move_iterator<_Iterator>& __y)
1128 {
return __y < __x; }
1130 template<
typename _IteratorL,
typename _IteratorR>
1132 operator>=(
const move_iterator<_IteratorL>& __x,
1133 const move_iterator<_IteratorR>& __y)
1134 {
return !(__x < __y); }
1136 template<
typename _Iterator>
1138 operator>=(
const move_iterator<_Iterator>& __x,
1139 const move_iterator<_Iterator>& __y)
1140 {
return !(__x < __y); }
1143 template<
typename _IteratorL,
typename _IteratorR>
1145 operator-(
const move_iterator<_IteratorL>& __x,
1146 const move_iterator<_IteratorR>& __y)
1147 -> decltype(__x.base() - __y.base())
1148 {
return __x.base() - __y.base(); }
1150 template<
typename _Iterator>
1152 operator-(
const move_iterator<_Iterator>& __x,
1153 const move_iterator<_Iterator>& __y)
1154 -> decltype(__x.base() - __y.base())
1155 {
return __x.base() - __y.base(); }
1157 template<
typename _Iterator>
1158 inline move_iterator<_Iterator>
1159 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1160 const move_iterator<_Iterator>& __x)
1161 {
return __x + __n; }
1163 template<
typename _Iterator>
1164 inline move_iterator<_Iterator>
1165 make_move_iterator(_Iterator __i)
1166 {
return move_iterator<_Iterator>(__i); }
1168 template<
typename _Iterator,
typename _ReturnType
1169 =
typename conditional<__move_if_noexcept_cond
1170 <
typename iterator_traits<_Iterator>::value_type>::value,
1171 _Iterator, move_iterator<_Iterator>>::type>
1173 __make_move_if_noexcept_iterator(_Iterator __i)
1174 {
return _ReturnType(__i); }
1178 _GLIBCXX_END_NAMESPACE_VERSION
1181 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1182 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
1183 std::__make_move_if_noexcept_iterator(_Iter)
1185 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1186 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
reverse_iterator & operator++()
reverse_iterator(iterator_type __x)
_Container container_type
A nested typedef for the type of whatever container you used.
insert_iterator & operator=(const typename _Container::value_type &__value)
GNU extensions for public use.
reverse_iterator & operator+=(difference_type __n)
insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
reference operator[](difference_type __n) const
Turns assignment into insertion.
Turns assignment into insertion.
reverse_iterator operator--(int)
back_insert_iterator & operator=(const typename _Container::value_type &__value)
_Container container_type
A nested typedef for the type of whatever container you used.
ISO C++ entities toplevel namespace is std.
reverse_iterator operator++(int)
reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
reverse_iterator & operator-=(difference_type __n)
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
back_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
insert_iterator(_Container &__x, typename _Container::iterator __i)
reverse_iterator operator-(difference_type __n) const
reverse_iterator(const reverse_iterator< _Iter > &__x)
Turns assignment into insertion.
back_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
reverse_iterator operator+(difference_type __n) const
front_insert_iterator< _Container > front_inserter(_Container &__x)
back_insert_iterator< _Container > back_inserter(_Container &__x)
front_insert_iterator & operator=(const typename _Container::value_type &__value)
complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
_Container container_type
A nested typedef for the type of whatever container you used.
reference operator*() const
insert_iterator & operator*()
Simply returns *this.
reverse_iterator(const reverse_iterator &__x)
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
iterator_type base() const
reverse_iterator & operator--()
pointer operator->() const
back_insert_iterator & operator*()
Simply returns *this.
complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
front_insert_iterator & operator*()
Simply returns *this.
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)