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;
134 : current(__x.current) { }
140 template<
typename _Iter>
142 : current(__x.
base()) { }
164 _Iterator __tmp = current;
280 {
return *(*
this + __n); }
293 template<
typename _Iterator>
297 {
return __x.
base() == __y.
base(); }
299 template<
typename _Iterator>
301 operator<(const reverse_iterator<_Iterator>& __x,
303 {
return __y.
base() < __x.base(); }
305 template<
typename _Iterator>
309 {
return !(__x == __y); }
311 template<
typename _Iterator>
315 {
return __y < __x; }
317 template<
typename _Iterator>
319 operator<=(const reverse_iterator<_Iterator>& __x,
321 {
return !(__y < __x); }
323 template<
typename _Iterator>
327 {
return !(__x < __y); }
329 template<
typename _Iterator>
330 #if __cplusplus < 201103L 331 inline typename reverse_iterator<_Iterator>::difference_type
338 -> decltype(__x.
base() - __y.
base())
342 template<
typename _Iterator>
344 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
350 template<
typename _IteratorL,
typename _IteratorR>
354 {
return __x.
base() == __y.
base(); }
356 template<
typename _IteratorL,
typename _IteratorR>
358 operator<(const reverse_iterator<_IteratorL>& __x,
360 {
return __y.
base() < __x.base(); }
362 template<
typename _IteratorL,
typename _IteratorR>
366 {
return !(__x == __y); }
368 template<
typename _IteratorL,
typename _IteratorR>
372 {
return __y < __x; }
374 template<
typename _IteratorL,
typename _IteratorR>
376 operator<=(const reverse_iterator<_IteratorL>& __x,
378 {
return !(__y < __x); }
380 template<
typename _IteratorL,
typename _IteratorR>
384 {
return !(__x < __y); }
386 template<
typename _IteratorL,
typename _IteratorR>
387 #if __cplusplus >= 201103L 392 -> decltype(__y.
base() - __x.
base())
394 inline typename reverse_iterator<_IteratorL>::difference_type
401 #if __cplusplus >= 201103L 403 template<
typename _Iterator>
405 __make_reverse_iterator(_Iterator __i)
408 # if __cplusplus > 201103L 409 # define __cpp_lib_make_reverse_iterator 201402 414 template<
typename _Iterator>
421 #if __cplusplus >= 201103L 422 template<
typename _Iterator>
425 -> decltype(__make_reverse_iterator(__niter_base(__it.
base())))
426 {
return __make_reverse_iterator(__niter_base(__it.
base())); }
428 template<
typename _Iterator>
429 struct __is_move_iterator<reverse_iterator<_Iterator> >
430 : __is_move_iterator<_Iterator>
433 template<
typename _Iterator>
436 -> decltype(__make_reverse_iterator(__miter_base(__it.
base())))
437 {
return __make_reverse_iterator(__miter_base(__it.
base())); }
451 template<
typename _Container>
453 :
public iterator<output_iterator_tag, void, void, void, void>
456 _Container* container;
478 #if __cplusplus < 201103L 480 operator=(
typename _Container::const_reference __value)
482 container->push_back(__value);
487 operator=(
const typename _Container::value_type& __value)
489 container->push_back(__value);
494 operator=(
typename _Container::value_type&& __value)
496 container->push_back(std::move(__value));
528 template<
typename _Container>
543 template<
typename _Container>
545 :
public iterator<output_iterator_tag, void, void, void, void>
548 _Container* container;
569 #if __cplusplus < 201103L 571 operator=(
typename _Container::const_reference __value)
573 container->push_front(__value);
578 operator=(
const typename _Container::value_type& __value)
580 container->push_front(__value);
585 operator=(
typename _Container::value_type&& __value)
587 container->push_front(std::move(__value));
619 template<
typename _Container>
638 template<
typename _Container>
640 :
public iterator<output_iterator_tag, void, void, void, void>
643 _Container* container;
644 typename _Container::iterator iter;
680 #if __cplusplus < 201103L 682 operator=(
typename _Container::const_reference __value)
684 iter = container->insert(iter, __value);
690 operator=(
const typename _Container::value_type& __value)
692 iter = container->insert(iter, __value);
698 operator=(
typename _Container::value_type&& __value)
700 iter = container->insert(iter, std::move(__value));
733 template<
typename _Container,
typename _Iterator>
738 typename _Container::iterator(__i));
743 _GLIBCXX_END_NAMESPACE_VERSION
746 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
748 _GLIBCXX_BEGIN_NAMESPACE_VERSION
757 using std::iterator_traits;
759 template<
typename _Iterator,
typename _Container>
760 class __normal_iterator
763 _Iterator _M_current;
765 typedef iterator_traits<_Iterator> __traits_type;
768 typedef _Iterator iterator_type;
770 typedef typename __traits_type::value_type
value_type;
771 typedef typename __traits_type::difference_type difference_type;
772 typedef typename __traits_type::reference reference;
773 typedef typename __traits_type::pointer pointer;
775 _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
776 : _M_current(_Iterator()) { }
779 __normal_iterator(
const _Iterator& __i) _GLIBCXX_NOEXCEPT
780 : _M_current(__i) { }
783 template<
typename _Iter>
784 __normal_iterator(
const __normal_iterator<_Iter,
785 typename __enable_if<
786 (std::__are_same<_Iter, typename _Container::pointer>::__value),
787 _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
788 : _M_current(__i.base()) { }
793 {
return *_M_current; }
797 {
return _M_current; }
808 {
return __normal_iterator(_M_current++); }
820 {
return __normal_iterator(_M_current--); }
824 operator[](difference_type __n)
const _GLIBCXX_NOEXCEPT
825 {
return _M_current[__n]; }
828 operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
829 { _M_current += __n;
return *
this; }
832 operator+(difference_type __n)
const _GLIBCXX_NOEXCEPT
833 {
return __normal_iterator(_M_current + __n); }
836 operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
837 { _M_current -= __n;
return *
this; }
840 operator-(difference_type __n)
const _GLIBCXX_NOEXCEPT
841 {
return __normal_iterator(_M_current - __n); }
844 base()
const _GLIBCXX_NOEXCEPT
845 {
return _M_current; }
857 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
859 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
860 const __normal_iterator<_IteratorR, _Container>& __rhs)
862 {
return __lhs.base() == __rhs.base(); }
864 template<
typename _Iterator,
typename _Container>
866 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
867 const __normal_iterator<_Iterator, _Container>& __rhs)
869 {
return __lhs.base() == __rhs.base(); }
871 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
873 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
874 const __normal_iterator<_IteratorR, _Container>& __rhs)
876 {
return __lhs.base() != __rhs.base(); }
878 template<
typename _Iterator,
typename _Container>
880 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
881 const __normal_iterator<_Iterator, _Container>& __rhs)
883 {
return __lhs.base() != __rhs.base(); }
886 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
888 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
889 const __normal_iterator<_IteratorR, _Container>& __rhs)
891 {
return __lhs.base() < __rhs.base(); }
893 template<
typename _Iterator,
typename _Container>
895 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
896 const __normal_iterator<_Iterator, _Container>& __rhs)
898 {
return __lhs.base() < __rhs.base(); }
900 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
902 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
903 const __normal_iterator<_IteratorR, _Container>& __rhs)
905 {
return __lhs.base() > __rhs.base(); }
907 template<
typename _Iterator,
typename _Container>
909 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
910 const __normal_iterator<_Iterator, _Container>& __rhs)
912 {
return __lhs.base() > __rhs.base(); }
914 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
916 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
917 const __normal_iterator<_IteratorR, _Container>& __rhs)
919 {
return __lhs.base() <= __rhs.base(); }
921 template<
typename _Iterator,
typename _Container>
923 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
924 const __normal_iterator<_Iterator, _Container>& __rhs)
926 {
return __lhs.base() <= __rhs.base(); }
928 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
930 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
931 const __normal_iterator<_IteratorR, _Container>& __rhs)
933 {
return __lhs.base() >= __rhs.base(); }
935 template<
typename _Iterator,
typename _Container>
937 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
938 const __normal_iterator<_Iterator, _Container>& __rhs)
940 {
return __lhs.base() >= __rhs.base(); }
946 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
947 #if __cplusplus >= 201103L 950 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
951 const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
952 -> decltype(__lhs.base() - __rhs.base())
954 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
955 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
956 const __normal_iterator<_IteratorR, _Container>& __rhs)
958 {
return __lhs.base() - __rhs.base(); }
960 template<
typename _Iterator,
typename _Container>
961 inline typename __normal_iterator<_Iterator, _Container>::difference_type
962 operator-(
const __normal_iterator<_Iterator, _Container>& __lhs,
963 const __normal_iterator<_Iterator, _Container>& __rhs)
965 {
return __lhs.base() - __rhs.base(); }
967 template<
typename _Iterator,
typename _Container>
968 inline __normal_iterator<_Iterator, _Container>
969 operator+(
typename __normal_iterator<_Iterator, _Container>::difference_type
970 __n,
const __normal_iterator<_Iterator, _Container>& __i)
972 {
return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
974 _GLIBCXX_END_NAMESPACE_VERSION
977 namespace std _GLIBCXX_VISIBILITY(default)
979 _GLIBCXX_BEGIN_NAMESPACE_VERSION
981 template<
typename _Iterator,
typename _Container>
983 __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
984 {
return __it.base(); }
986 _GLIBCXX_END_NAMESPACE_VERSION
989 #if __cplusplus >= 201103L 991 namespace std _GLIBCXX_VISIBILITY(default)
993 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1009 template<
typename _Iterator>
1013 _Iterator _M_current;
1015 typedef iterator_traits<_Iterator> __traits_type;
1016 typedef typename __traits_type::reference __base_ref;
1019 typedef _Iterator iterator_type;
1021 typedef typename __traits_type::value_type
value_type;
1022 typedef typename __traits_type::difference_type difference_type;
1024 typedef _Iterator pointer;
1027 typedef typename conditional<is_reference<__base_ref>::value,
1028 typename remove_reference<__base_ref>::type&&,
1029 __base_ref>::type reference;
1036 : _M_current(__i) { }
1038 template<
typename _Iter>
1040 : _M_current(__i.base()) { }
1044 {
return _M_current; }
1048 {
return static_cast<reference
>(*_M_current); }
1052 {
return _M_current; }
1108 {
return std::move(_M_current[__n]); }
1114 template<
typename _IteratorL,
typename _IteratorR>
1118 {
return __x.base() == __y.base(); }
1120 template<
typename _Iterator>
1124 {
return __x.base() == __y.base(); }
1126 template<
typename _IteratorL,
typename _IteratorR>
1130 {
return !(__x == __y); }
1132 template<
typename _Iterator>
1136 {
return !(__x == __y); }
1138 template<
typename _IteratorL,
typename _IteratorR>
1140 operator<(const move_iterator<_IteratorL>& __x,
1142 {
return __x.base() < __y.base(); }
1144 template<
typename _Iterator>
1146 operator<(const move_iterator<_Iterator>& __x,
1148 {
return __x.base() < __y.base(); }
1150 template<
typename _IteratorL,
typename _IteratorR>
1152 operator<=(const move_iterator<_IteratorL>& __x,
1154 {
return !(__y < __x); }
1156 template<
typename _Iterator>
1158 operator<=(const move_iterator<_Iterator>& __x,
1160 {
return !(__y < __x); }
1162 template<
typename _IteratorL,
typename _IteratorR>
1166 {
return __y < __x; }
1168 template<
typename _Iterator>
1172 {
return __y < __x; }
1174 template<
typename _IteratorL,
typename _IteratorR>
1178 {
return !(__x < __y); }
1180 template<
typename _Iterator>
1184 {
return !(__x < __y); }
1187 template<
typename _IteratorL,
typename _IteratorR>
1191 -> decltype(__x.base() - __y.base())
1192 {
return __x.base() - __y.base(); }
1194 template<
typename _Iterator>
1198 -> decltype(__x.base() - __y.base())
1199 {
return __x.base() - __y.base(); }
1201 template<
typename _Iterator>
1203 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1205 {
return __x + __n; }
1207 template<
typename _Iterator>
1209 make_move_iterator(_Iterator __i)
1212 template<
typename _Iterator,
typename _ReturnType
1213 =
typename conditional<__move_if_noexcept_cond
1214 <
typename iterator_traits<_Iterator>::value_type>::value,
1217 __make_move_if_noexcept_iterator(_Iterator __i)
1218 {
return _ReturnType(__i); }
1222 template<
typename _Tp,
typename _ReturnType
1223 =
typename conditional<__move_if_noexcept_cond<_Tp>::value,
1226 __make_move_if_noexcept_iterator(_Tp* __i)
1227 {
return _ReturnType(__i); }
1231 template<
typename _Iterator>
1234 -> decltype(make_move_iterator(__niter_base(__it.base())))
1235 {
return make_move_iterator(__niter_base(__it.base())); }
1237 template<
typename _Iterator>
1238 struct __is_move_iterator<move_iterator<_Iterator> >
1240 enum { __value = 1 };
1241 typedef __true_type __type;
1244 template<
typename _Iterator>
1247 -> decltype(__miter_base(__it.base()))
1248 {
return __miter_base(__it.base()); }
1250 _GLIBCXX_END_NAMESPACE_VERSION
1253 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) 1254 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ 1255 std::__make_move_if_noexcept_iterator(_Iter) 1257 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) 1258 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) 1261 #ifdef _GLIBCXX_DEBUG back_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
_Container container_type
A nested typedef for the type of whatever container you used.
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
reverse_iterator(const reverse_iterator< _Iter > &__x)
front_insert_iterator< _Container > front_inserter(_Container &__x)
reverse_iterator & operator+=(difference_type __n)
reverse_iterator operator++(int)
GNU extensions for public use.
reverse_iterator(iterator_type __x)
reverse_iterator operator+(difference_type __n) const
iterator_traits< _Iterator >::iterator_category iterator_category
One of the tag types.
back_insert_iterator< _Container > back_inserter(_Container &__x)
reverse_iterator & operator-=(difference_type __n)
reference operator*() const
reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
back_insert_iterator & operator*()
Simply returns *this.
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
insert_iterator(_Container &__x, typename _Container::iterator __i)
insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
front_insert_iterator & operator=(const typename _Container::value_type &__value)
insert_iterator & operator=(const typename _Container::value_type &__value)
front_insert_iterator & operator*()
Simply returns *this.
reverse_iterator(const reverse_iterator &__x)
Turns assignment into insertion.
reverse_iterator & operator--()
pointer operator->() const
iterator_traits< _Iterator >::value_type value_type
The type "pointed to" by the iterator.
_Container container_type
A nested typedef for the type of whatever container you used.
back_insert_iterator & operator=(const typename _Container::value_type &__value)
Turns assignment into insertion.
ISO C++ entities toplevel namespace is std.
reverse_iterator & operator++()
reference operator[](difference_type __n) const
back_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
insert_iterator & operator*()
Simply returns *this.
iterator_type base() const
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)
_Container container_type
A nested typedef for the type of whatever container you used.
reverse_iterator operator--(int)
reverse_iterator operator-(difference_type __n) const
Turns assignment into insertion.