60 #ifndef _STL_ITERATOR_H 61 #define _STL_ITERATOR_H 1 68 #if __cplusplus > 201402L 69 # define __cpp_lib_array_constexpr 201603 72 namespace std _GLIBCXX_VISIBILITY(default)
74 _GLIBCXX_BEGIN_NAMESPACE_VERSION
100 template<
typename _Iterator>
102 :
public iterator<typename iterator_traits<_Iterator>::iterator_category,
103 typename iterator_traits<_Iterator>::value_type,
104 typename iterator_traits<_Iterator>::difference_type,
105 typename iterator_traits<_Iterator>::pointer,
106 typename iterator_traits<_Iterator>::reference>
111 typedef iterator_traits<_Iterator> __traits_type;
114 typedef _Iterator iterator_type;
115 typedef typename __traits_type::difference_type difference_type;
116 typedef typename __traits_type::pointer pointer;
117 typedef typename __traits_type::reference reference;
132 explicit _GLIBCXX17_CONSTEXPR
140 : current(__x.current) { }
146 template<
typename _Iter>
149 : current(__x.
base()) { }
154 _GLIBCXX17_CONSTEXPR iterator_type
168 _GLIBCXX17_CONSTEXPR reference
171 _Iterator __tmp = current;
182 _GLIBCXX17_CONSTEXPR pointer
285 _GLIBCXX17_CONSTEXPR reference
287 {
return *(*
this + __n); }
300 template<
typename _Iterator>
301 inline _GLIBCXX17_CONSTEXPR
bool 304 {
return __x.
base() == __y.
base(); }
306 template<
typename _Iterator>
307 inline _GLIBCXX17_CONSTEXPR
bool 308 operator<(const reverse_iterator<_Iterator>& __x,
310 {
return __y.
base() < __x.base(); }
312 template<
typename _Iterator>
313 inline _GLIBCXX17_CONSTEXPR
bool 316 {
return !(__x == __y); }
318 template<
typename _Iterator>
319 inline _GLIBCXX17_CONSTEXPR
bool 322 {
return __y < __x; }
324 template<
typename _Iterator>
325 inline _GLIBCXX17_CONSTEXPR
bool 326 operator<=(const reverse_iterator<_Iterator>& __x,
328 {
return !(__y < __x); }
330 template<
typename _Iterator>
331 inline _GLIBCXX17_CONSTEXPR
bool 334 {
return !(__x < __y); }
338 template<
typename _IteratorL,
typename _IteratorR>
339 inline _GLIBCXX17_CONSTEXPR
bool 342 {
return __x.
base() == __y.
base(); }
344 template<
typename _IteratorL,
typename _IteratorR>
345 inline _GLIBCXX17_CONSTEXPR
bool 346 operator<(const reverse_iterator<_IteratorL>& __x,
348 {
return __y.
base() < __x.base(); }
350 template<
typename _IteratorL,
typename _IteratorR>
351 inline _GLIBCXX17_CONSTEXPR
bool 354 {
return !(__x == __y); }
356 template<
typename _IteratorL,
typename _IteratorR>
357 inline _GLIBCXX17_CONSTEXPR
bool 360 {
return __y < __x; }
362 template<
typename _IteratorL,
typename _IteratorR>
363 inline _GLIBCXX17_CONSTEXPR
bool 364 operator<=(const reverse_iterator<_IteratorL>& __x,
366 {
return !(__y < __x); }
368 template<
typename _IteratorL,
typename _IteratorR>
369 inline _GLIBCXX17_CONSTEXPR
bool 372 {
return !(__x < __y); }
375 #if __cplusplus < 201103L 376 template<
typename _Iterator>
377 inline typename reverse_iterator<_Iterator>::difference_type
382 template<
typename _IteratorL,
typename _IteratorR>
383 inline typename reverse_iterator<_IteratorL>::difference_type
390 template<
typename _IteratorL,
typename _IteratorR>
391 inline _GLIBCXX17_CONSTEXPR
auto 394 -> decltype(__y.
base() - __x.
base())
398 template<
typename _Iterator>
400 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
404 #if __cplusplus >= 201103L 406 template<
typename _Iterator>
408 __make_reverse_iterator(_Iterator __i)
411 # if __cplusplus > 201103L 412 # define __cpp_lib_make_reverse_iterator 201402 417 template<
typename _Iterator>
424 #if __cplusplus >= 201103L 425 template<
typename _Iterator>
428 -> decltype(__make_reverse_iterator(__niter_base(__it.
base())))
429 {
return __make_reverse_iterator(__niter_base(__it.
base())); }
431 template<
typename _Iterator>
432 struct __is_move_iterator<reverse_iterator<_Iterator> >
433 : __is_move_iterator<_Iterator>
436 template<
typename _Iterator>
439 -> decltype(__make_reverse_iterator(__miter_base(__it.
base())))
440 {
return __make_reverse_iterator(__miter_base(__it.
base())); }
454 template<
typename _Container>
456 :
public iterator<output_iterator_tag, void, void, void, void>
459 _Container* container;
481 #if __cplusplus < 201103L 483 operator=(
typename _Container::const_reference __value)
485 container->push_back(__value);
490 operator=(
const typename _Container::value_type& __value)
492 container->push_back(__value);
497 operator=(
typename _Container::value_type&& __value)
499 container->push_back(std::move(__value));
531 template<
typename _Container>
546 template<
typename _Container>
548 :
public iterator<output_iterator_tag, void, void, void, void>
551 _Container* container;
572 #if __cplusplus < 201103L 574 operator=(
typename _Container::const_reference __value)
576 container->push_front(__value);
581 operator=(
const typename _Container::value_type& __value)
583 container->push_front(__value);
588 operator=(
typename _Container::value_type&& __value)
590 container->push_front(std::move(__value));
622 template<
typename _Container>
641 template<
typename _Container>
643 :
public iterator<output_iterator_tag, void, void, void, void>
646 _Container* container;
647 typename _Container::iterator iter;
683 #if __cplusplus < 201103L 685 operator=(
typename _Container::const_reference __value)
687 iter = container->insert(iter, __value);
693 operator=(
const typename _Container::value_type& __value)
695 iter = container->insert(iter, __value);
701 operator=(
typename _Container::value_type&& __value)
703 iter = container->insert(iter, std::move(__value));
737 template<
typename _Container,
typename _Iterator>
742 typename _Container::iterator(__i));
747 _GLIBCXX_END_NAMESPACE_VERSION
750 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
752 _GLIBCXX_BEGIN_NAMESPACE_VERSION
761 using std::iterator_traits;
763 template<
typename _Iterator,
typename _Container>
764 class __normal_iterator
767 _Iterator _M_current;
769 typedef iterator_traits<_Iterator> __traits_type;
772 typedef _Iterator iterator_type;
774 typedef typename __traits_type::value_type
value_type;
775 typedef typename __traits_type::difference_type difference_type;
776 typedef typename __traits_type::reference reference;
777 typedef typename __traits_type::pointer pointer;
779 _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
780 : _M_current(_Iterator()) { }
783 __normal_iterator(
const _Iterator& __i) _GLIBCXX_NOEXCEPT
784 : _M_current(__i) { }
787 template<
typename _Iter>
788 __normal_iterator(
const __normal_iterator<_Iter,
789 typename __enable_if<
790 (std::__are_same<_Iter, typename _Container::pointer>::__value),
791 _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
792 : _M_current(__i.base()) { }
797 {
return *_M_current; }
801 {
return _M_current; }
812 {
return __normal_iterator(_M_current++); }
824 {
return __normal_iterator(_M_current--); }
828 operator[](difference_type __n)
const _GLIBCXX_NOEXCEPT
829 {
return _M_current[__n]; }
832 operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
833 { _M_current += __n;
return *
this; }
836 operator+(difference_type __n)
const _GLIBCXX_NOEXCEPT
837 {
return __normal_iterator(_M_current + __n); }
840 operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
841 { _M_current -= __n;
return *
this; }
844 operator-(difference_type __n)
const _GLIBCXX_NOEXCEPT
845 {
return __normal_iterator(_M_current - __n); }
848 base()
const _GLIBCXX_NOEXCEPT
849 {
return _M_current; }
861 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
863 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
864 const __normal_iterator<_IteratorR, _Container>& __rhs)
866 {
return __lhs.base() == __rhs.base(); }
868 template<
typename _Iterator,
typename _Container>
870 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
871 const __normal_iterator<_Iterator, _Container>& __rhs)
873 {
return __lhs.base() == __rhs.base(); }
875 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
877 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
878 const __normal_iterator<_IteratorR, _Container>& __rhs)
880 {
return __lhs.base() != __rhs.base(); }
882 template<
typename _Iterator,
typename _Container>
884 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
885 const __normal_iterator<_Iterator, _Container>& __rhs)
887 {
return __lhs.base() != __rhs.base(); }
890 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
892 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
893 const __normal_iterator<_IteratorR, _Container>& __rhs)
895 {
return __lhs.base() < __rhs.base(); }
897 template<
typename _Iterator,
typename _Container>
899 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
900 const __normal_iterator<_Iterator, _Container>& __rhs)
902 {
return __lhs.base() < __rhs.base(); }
904 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
906 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
907 const __normal_iterator<_IteratorR, _Container>& __rhs)
909 {
return __lhs.base() > __rhs.base(); }
911 template<
typename _Iterator,
typename _Container>
913 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
914 const __normal_iterator<_Iterator, _Container>& __rhs)
916 {
return __lhs.base() > __rhs.base(); }
918 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
920 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
921 const __normal_iterator<_IteratorR, _Container>& __rhs)
923 {
return __lhs.base() <= __rhs.base(); }
925 template<
typename _Iterator,
typename _Container>
927 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
928 const __normal_iterator<_Iterator, _Container>& __rhs)
930 {
return __lhs.base() <= __rhs.base(); }
932 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
934 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
935 const __normal_iterator<_IteratorR, _Container>& __rhs)
937 {
return __lhs.base() >= __rhs.base(); }
939 template<
typename _Iterator,
typename _Container>
941 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
942 const __normal_iterator<_Iterator, _Container>& __rhs)
944 {
return __lhs.base() >= __rhs.base(); }
950 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
951 #if __cplusplus >= 201103L 954 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
955 const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
956 -> decltype(__lhs.base() - __rhs.base())
958 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
959 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
960 const __normal_iterator<_IteratorR, _Container>& __rhs)
962 {
return __lhs.base() - __rhs.base(); }
964 template<
typename _Iterator,
typename _Container>
965 inline typename __normal_iterator<_Iterator, _Container>::difference_type
966 operator-(
const __normal_iterator<_Iterator, _Container>& __lhs,
967 const __normal_iterator<_Iterator, _Container>& __rhs)
969 {
return __lhs.base() - __rhs.base(); }
971 template<
typename _Iterator,
typename _Container>
972 inline __normal_iterator<_Iterator, _Container>
973 operator+(
typename __normal_iterator<_Iterator, _Container>::difference_type
974 __n,
const __normal_iterator<_Iterator, _Container>& __i)
976 {
return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
978 _GLIBCXX_END_NAMESPACE_VERSION
981 namespace std _GLIBCXX_VISIBILITY(default)
983 _GLIBCXX_BEGIN_NAMESPACE_VERSION
985 template<
typename _Iterator,
typename _Container>
987 __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
988 {
return __it.base(); }
990 #if __cplusplus >= 201103L 1006 template<
typename _Iterator>
1010 _Iterator _M_current;
1012 typedef iterator_traits<_Iterator> __traits_type;
1013 typedef typename __traits_type::reference __base_ref;
1016 typedef _Iterator iterator_type;
1018 typedef typename __traits_type::value_type
value_type;
1019 typedef typename __traits_type::difference_type difference_type;
1021 typedef _Iterator pointer;
1025 typename remove_reference<__base_ref>::type&&,
1026 __base_ref>::type reference;
1028 _GLIBCXX17_CONSTEXPR
1032 explicit _GLIBCXX17_CONSTEXPR
1033 move_iterator(iterator_type __i)
1034 : _M_current(__i) { }
1036 template<
typename _Iter>
1037 _GLIBCXX17_CONSTEXPR
1039 : _M_current(__i.base()) { }
1041 _GLIBCXX17_CONSTEXPR iterator_type
1043 {
return _M_current; }
1045 _GLIBCXX17_CONSTEXPR reference
1047 {
return static_cast<reference
>(*_M_current); }
1049 _GLIBCXX17_CONSTEXPR pointer
1051 {
return _M_current; }
1053 _GLIBCXX17_CONSTEXPR move_iterator&
1060 _GLIBCXX17_CONSTEXPR move_iterator
1063 move_iterator __tmp = *
this;
1068 _GLIBCXX17_CONSTEXPR move_iterator&
1075 _GLIBCXX17_CONSTEXPR move_iterator
1078 move_iterator __tmp = *
this;
1083 _GLIBCXX17_CONSTEXPR move_iterator
1085 {
return move_iterator(_M_current + __n); }
1087 _GLIBCXX17_CONSTEXPR move_iterator&
1094 _GLIBCXX17_CONSTEXPR move_iterator
1096 {
return move_iterator(_M_current - __n); }
1098 _GLIBCXX17_CONSTEXPR move_iterator&
1105 _GLIBCXX17_CONSTEXPR reference
1107 {
return std::move(_M_current[__n]); }
1113 template<
typename _IteratorL,
typename _IteratorR>
1114 inline _GLIBCXX17_CONSTEXPR
bool 1117 {
return __x.base() == __y.base(); }
1119 template<
typename _Iterator>
1120 inline _GLIBCXX17_CONSTEXPR
bool 1123 {
return __x.base() == __y.base(); }
1125 template<
typename _IteratorL,
typename _IteratorR>
1126 inline _GLIBCXX17_CONSTEXPR
bool 1129 {
return !(__x == __y); }
1131 template<
typename _Iterator>
1132 inline _GLIBCXX17_CONSTEXPR
bool 1135 {
return !(__x == __y); }
1137 template<
typename _IteratorL,
typename _IteratorR>
1138 inline _GLIBCXX17_CONSTEXPR
bool 1139 operator<(const move_iterator<_IteratorL>& __x,
1141 {
return __x.base() < __y.base(); }
1143 template<
typename _Iterator>
1144 inline _GLIBCXX17_CONSTEXPR
bool 1145 operator<(const move_iterator<_Iterator>& __x,
1147 {
return __x.base() < __y.base(); }
1149 template<
typename _IteratorL,
typename _IteratorR>
1150 inline _GLIBCXX17_CONSTEXPR
bool 1151 operator<=(const move_iterator<_IteratorL>& __x,
1153 {
return !(__y < __x); }
1155 template<
typename _Iterator>
1156 inline _GLIBCXX17_CONSTEXPR
bool 1157 operator<=(const move_iterator<_Iterator>& __x,
1159 {
return !(__y < __x); }
1161 template<
typename _IteratorL,
typename _IteratorR>
1162 inline _GLIBCXX17_CONSTEXPR
bool 1165 {
return __y < __x; }
1167 template<
typename _Iterator>
1168 inline _GLIBCXX17_CONSTEXPR
bool 1171 {
return __y < __x; }
1173 template<
typename _IteratorL,
typename _IteratorR>
1174 inline _GLIBCXX17_CONSTEXPR
bool 1177 {
return !(__x < __y); }
1179 template<
typename _Iterator>
1180 inline _GLIBCXX17_CONSTEXPR
bool 1183 {
return !(__x < __y); }
1186 template<
typename _IteratorL,
typename _IteratorR>
1187 inline _GLIBCXX17_CONSTEXPR
auto 1190 -> decltype(__x.base() - __y.base())
1191 {
return __x.base() - __y.base(); }
1193 template<
typename _Iterator>
1195 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1197 {
return __x + __n; }
1199 template<
typename _Iterator>
1201 make_move_iterator(_Iterator __i)
1204 template<
typename _Iterator,
typename _ReturnType
1206 <
typename iterator_traits<_Iterator>::value_type>::value,
1208 inline _GLIBCXX17_CONSTEXPR _ReturnType
1209 __make_move_if_noexcept_iterator(_Iterator __i)
1210 {
return _ReturnType(__i); }
1214 template<
typename _Tp,
typename _ReturnType
1217 inline _GLIBCXX17_CONSTEXPR _ReturnType
1218 __make_move_if_noexcept_iterator(_Tp* __i)
1219 {
return _ReturnType(__i); }
1223 template<
typename _Iterator>
1226 -> decltype(make_move_iterator(__niter_base(__it.base())))
1227 {
return make_move_iterator(__niter_base(__it.base())); }
1229 template<
typename _Iterator>
1230 struct __is_move_iterator<move_iterator<_Iterator> >
1232 enum { __value = 1 };
1233 typedef __true_type __type;
1236 template<
typename _Iterator>
1239 -> decltype(__miter_base(__it.base()))
1240 {
return __miter_base(__it.base()); }
1242 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) 1243 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ 1244 std::__make_move_if_noexcept_iterator(_Iter) 1246 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) 1247 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) 1250 #if __cpp_deduction_guides >= 201606 1253 template<
typename _InputIterator>
1255 typename iterator_traits<_InputIterator>::value_type::first_type>;
1257 template<
typename _InputIterator>
1258 using __iter_val_t =
1259 typename iterator_traits<_InputIterator>::value_type::second_type;
1261 template<
typename _T1,
typename _T2>
1264 template<
typename _InputIterator>
1265 using __iter_to_alloc_t =
1267 __iter_val_t<_InputIterator>>;
1271 _GLIBCXX_END_NAMESPACE_VERSION
1274 #ifdef _GLIBCXX_DEBUG _Container container_type
A nested typedef for the type of whatever container you used.
iterator_traits< _Iterator >::value_type value_type
The type "pointed to" by the iterator.
_GLIBCXX17_CONSTEXPR reference operator*() const
front_insert_iterator & operator=(const typename _Container::value_type &__value)
_Container container_type
A nested typedef for the type of whatever container you used.
_GLIBCXX17_CONSTEXPR reverse_iterator operator-(difference_type __n) const
Define a member typedef type to one of two argument types.
_GLIBCXX17_CONSTEXPR reverse_iterator & operator-=(difference_type __n)
GNU extensions for public use.
_GLIBCXX17_CONSTEXPR 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. (This iterator does not move.)
back_insert_iterator & operator*()
Simply returns *this.
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
insert_iterator(_Container &__x, typename _Container::iterator __i)
back_insert_iterator & operator=(const typename _Container::value_type &__value)
_GLIBCXX17_CONSTEXPR pointer operator->() const
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
_GLIBCXX17_CONSTEXPR reverse_iterator(const reverse_iterator< _Iter > &__x)
Turns assignment into insertion.
front_insert_iterator & operator*()
Simply returns *this.
_GLIBCXX17_CONSTEXPR iterator_type base() const
_GLIBCXX17_CONSTEXPR reverse_iterator operator+(difference_type __n) const
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
front_insert_iterator< _Container > front_inserter(_Container &__x)
_Container container_type
A nested typedef for the type of whatever container you used.
ISO C++ entities toplevel namespace is std.
back_insert_iterator< _Container > back_inserter(_Container &__x)
_GLIBCXX17_CONSTEXPR reverse_iterator()
_GLIBCXX17_CONSTEXPR reverse_iterator(const reverse_iterator &__x)
_GLIBCXX17_CONSTEXPR reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
_GLIBCXX17_CONSTEXPR reverse_iterator(iterator_type __x)
_GLIBCXX17_CONSTEXPR reverse_iterator & operator+=(difference_type __n)
_GLIBCXX17_CONSTEXPR reverse_iterator & operator++()
Turns assignment into insertion.
typename remove_const< _Tp >::type remove_const_t
Alias template for remove_const.
_GLIBCXX17_CONSTEXPR reverse_iterator & operator--()
iterator_traits< _Iterator >::iterator_category iterator_category
One of the tag types.
_GLIBCXX17_CONSTEXPR reverse_iterator operator++(int)
Turns assignment into insertion.
_GLIBCXX17_CONSTEXPR reverse_iterator operator--(int)
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
insert_iterator & operator*()
Simply returns *this.
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)
front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
insert_iterator & operator=(const typename _Container::value_type &__value)
Struct holding two objects of arbitrary type.
front_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.)