60 #ifndef _STL_ITERATOR_H 61 #define _STL_ITERATOR_H 1 68 #if __cplusplus >= 201103L 72 #if __cplusplus >= 201703L 73 # define __cpp_lib_array_constexpr 201803L 76 namespace std _GLIBCXX_VISIBILITY(default)
78 _GLIBCXX_BEGIN_NAMESPACE_VERSION
104 template<
typename _Iterator>
106 :
public iterator<typename iterator_traits<_Iterator>::iterator_category,
107 typename iterator_traits<_Iterator>::value_type,
108 typename iterator_traits<_Iterator>::difference_type,
109 typename iterator_traits<_Iterator>::pointer,
110 typename iterator_traits<_Iterator>::reference>
115 typedef iterator_traits<_Iterator> __traits_type;
118 typedef _Iterator iterator_type;
119 typedef typename __traits_type::difference_type difference_type;
120 typedef typename __traits_type::pointer pointer;
121 typedef typename __traits_type::reference reference;
136 explicit _GLIBCXX17_CONSTEXPR
144 : current(__x.current) { }
146 #if __cplusplus >= 201103L 154 template<
typename _Iter>
157 : current(__x.
base()) { }
162 _GLIBCXX17_CONSTEXPR iterator_type
176 _GLIBCXX17_CONSTEXPR reference
179 _Iterator __tmp = current;
188 _GLIBCXX17_CONSTEXPR pointer
193 _Iterator __tmp = current;
195 return _S_to_pointer(__tmp);
297 _GLIBCXX17_CONSTEXPR reference
299 {
return *(*
this + __n); }
302 template<
typename _Tp>
303 static _GLIBCXX17_CONSTEXPR _Tp*
304 _S_to_pointer(_Tp* __p)
307 template<
typename _Tp>
308 static _GLIBCXX17_CONSTEXPR pointer
309 _S_to_pointer(_Tp __t)
310 {
return __t.operator->(); }
323 template<
typename _Iterator>
324 inline _GLIBCXX17_CONSTEXPR
bool 327 {
return __x.
base() == __y.
base(); }
329 template<
typename _Iterator>
330 inline _GLIBCXX17_CONSTEXPR
bool 331 operator<(const reverse_iterator<_Iterator>& __x,
333 {
return __y.
base() < __x.base(); }
335 template<
typename _Iterator>
336 inline _GLIBCXX17_CONSTEXPR
bool 339 {
return !(__x == __y); }
341 template<
typename _Iterator>
342 inline _GLIBCXX17_CONSTEXPR
bool 345 {
return __y < __x; }
347 template<
typename _Iterator>
348 inline _GLIBCXX17_CONSTEXPR
bool 349 operator<=(const reverse_iterator<_Iterator>& __x,
351 {
return !(__y < __x); }
353 template<
typename _Iterator>
354 inline _GLIBCXX17_CONSTEXPR
bool 357 {
return !(__x < __y); }
361 template<
typename _IteratorL,
typename _IteratorR>
362 inline _GLIBCXX17_CONSTEXPR
bool 365 {
return __x.
base() == __y.
base(); }
367 template<
typename _IteratorL,
typename _IteratorR>
368 inline _GLIBCXX17_CONSTEXPR
bool 369 operator<(const reverse_iterator<_IteratorL>& __x,
371 {
return __y.
base() < __x.base(); }
373 template<
typename _IteratorL,
typename _IteratorR>
374 inline _GLIBCXX17_CONSTEXPR
bool 377 {
return !(__x == __y); }
379 template<
typename _IteratorL,
typename _IteratorR>
380 inline _GLIBCXX17_CONSTEXPR
bool 383 {
return __y < __x; }
385 template<
typename _IteratorL,
typename _IteratorR>
386 inline _GLIBCXX17_CONSTEXPR
bool 387 operator<=(const reverse_iterator<_IteratorL>& __x,
389 {
return !(__y < __x); }
391 template<
typename _IteratorL,
typename _IteratorR>
392 inline _GLIBCXX17_CONSTEXPR
bool 395 {
return !(__x < __y); }
398 #if __cplusplus < 201103L 399 template<
typename _Iterator>
400 inline typename reverse_iterator<_Iterator>::difference_type
405 template<
typename _IteratorL,
typename _IteratorR>
406 inline typename reverse_iterator<_IteratorL>::difference_type
413 template<
typename _IteratorL,
typename _IteratorR>
414 inline _GLIBCXX17_CONSTEXPR
auto 417 -> decltype(__y.
base() - __x.
base())
421 template<
typename _Iterator>
423 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
427 #if __cplusplus >= 201103L 429 template<
typename _Iterator>
431 __make_reverse_iterator(_Iterator __i)
434 # if __cplusplus > 201103L 435 # define __cpp_lib_make_reverse_iterator 201402 440 template<
typename _Iterator>
447 #if __cplusplus >= 201103L 448 template<
typename _Iterator>
451 -> decltype(__make_reverse_iterator(__niter_base(__it.
base())))
452 {
return __make_reverse_iterator(__niter_base(__it.
base())); }
454 template<
typename _Iterator>
455 struct __is_move_iterator<reverse_iterator<_Iterator> >
456 : __is_move_iterator<_Iterator>
459 template<
typename _Iterator>
462 -> decltype(__make_reverse_iterator(__miter_base(__it.
base())))
463 {
return __make_reverse_iterator(__miter_base(__it.
base())); }
477 template<
typename _Container>
479 :
public iterator<output_iterator_tag, void, void, void, void>
482 _Container* container;
504 #if __cplusplus < 201103L 506 operator=(
typename _Container::const_reference __value)
508 container->push_back(__value);
513 operator=(
const typename _Container::value_type& __value)
515 container->push_back(__value);
520 operator=(
typename _Container::value_type&& __value)
522 container->push_back(std::move(__value));
554 template<
typename _Container>
569 template<
typename _Container>
571 :
public iterator<output_iterator_tag, void, void, void, void>
574 _Container* container;
595 #if __cplusplus < 201103L 597 operator=(
typename _Container::const_reference __value)
599 container->push_front(__value);
604 operator=(
const typename _Container::value_type& __value)
606 container->push_front(__value);
611 operator=(
typename _Container::value_type&& __value)
613 container->push_front(std::move(__value));
645 template<
typename _Container>
664 template<
typename _Container>
666 :
public iterator<output_iterator_tag, void, void, void, void>
669 _Container* container;
670 typename _Container::iterator iter;
706 #if __cplusplus < 201103L 708 operator=(
typename _Container::const_reference __value)
710 iter = container->insert(iter, __value);
716 operator=(
const typename _Container::value_type& __value)
718 iter = container->insert(iter, __value);
724 operator=(
typename _Container::value_type&& __value)
726 iter = container->insert(iter, std::move(__value));
760 template<
typename _Container>
762 inserter(_Container& __x,
typename _Container::iterator __i)
767 _GLIBCXX_END_NAMESPACE_VERSION
770 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
772 _GLIBCXX_BEGIN_NAMESPACE_VERSION
781 using std::iterator_traits;
783 template<
typename _Iterator,
typename _Container>
784 class __normal_iterator
787 _Iterator _M_current;
789 typedef iterator_traits<_Iterator> __traits_type;
792 typedef _Iterator iterator_type;
794 typedef typename __traits_type::value_type
value_type;
795 typedef typename __traits_type::difference_type difference_type;
796 typedef typename __traits_type::reference reference;
797 typedef typename __traits_type::pointer pointer;
799 _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
800 : _M_current(_Iterator()) { }
803 __normal_iterator(
const _Iterator& __i) _GLIBCXX_NOEXCEPT
804 : _M_current(__i) { }
807 template<
typename _Iter>
808 __normal_iterator(
const __normal_iterator<_Iter,
809 typename __enable_if<
810 (std::__are_same<_Iter, typename _Container::pointer>::__value),
811 _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
812 : _M_current(__i.base()) { }
817 {
return *_M_current; }
821 {
return _M_current; }
832 {
return __normal_iterator(_M_current++); }
844 {
return __normal_iterator(_M_current--); }
848 operator[](difference_type __n)
const _GLIBCXX_NOEXCEPT
849 {
return _M_current[__n]; }
852 operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
853 { _M_current += __n;
return *
this; }
856 operator+(difference_type __n)
const _GLIBCXX_NOEXCEPT
857 {
return __normal_iterator(_M_current + __n); }
860 operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
861 { _M_current -= __n;
return *
this; }
864 operator-(difference_type __n)
const _GLIBCXX_NOEXCEPT
865 {
return __normal_iterator(_M_current - __n); }
868 base()
const _GLIBCXX_NOEXCEPT
869 {
return _M_current; }
881 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
883 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
884 const __normal_iterator<_IteratorR, _Container>& __rhs)
886 {
return __lhs.base() == __rhs.base(); }
888 template<
typename _Iterator,
typename _Container>
890 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
891 const __normal_iterator<_Iterator, _Container>& __rhs)
893 {
return __lhs.base() == __rhs.base(); }
895 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
897 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
898 const __normal_iterator<_IteratorR, _Container>& __rhs)
900 {
return __lhs.base() != __rhs.base(); }
902 template<
typename _Iterator,
typename _Container>
904 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
905 const __normal_iterator<_Iterator, _Container>& __rhs)
907 {
return __lhs.base() != __rhs.base(); }
910 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
912 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
913 const __normal_iterator<_IteratorR, _Container>& __rhs)
915 {
return __lhs.base() < __rhs.base(); }
917 template<
typename _Iterator,
typename _Container>
919 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
920 const __normal_iterator<_Iterator, _Container>& __rhs)
922 {
return __lhs.base() < __rhs.base(); }
924 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
926 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
927 const __normal_iterator<_IteratorR, _Container>& __rhs)
929 {
return __lhs.base() > __rhs.base(); }
931 template<
typename _Iterator,
typename _Container>
933 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
934 const __normal_iterator<_Iterator, _Container>& __rhs)
936 {
return __lhs.base() > __rhs.base(); }
938 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
940 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
941 const __normal_iterator<_IteratorR, _Container>& __rhs)
943 {
return __lhs.base() <= __rhs.base(); }
945 template<
typename _Iterator,
typename _Container>
947 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
948 const __normal_iterator<_Iterator, _Container>& __rhs)
950 {
return __lhs.base() <= __rhs.base(); }
952 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
954 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
955 const __normal_iterator<_IteratorR, _Container>& __rhs)
957 {
return __lhs.base() >= __rhs.base(); }
959 template<
typename _Iterator,
typename _Container>
961 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
962 const __normal_iterator<_Iterator, _Container>& __rhs)
964 {
return __lhs.base() >= __rhs.base(); }
970 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
971 #if __cplusplus >= 201103L 974 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
975 const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
976 -> decltype(__lhs.base() - __rhs.base())
978 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
979 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
980 const __normal_iterator<_IteratorR, _Container>& __rhs)
982 {
return __lhs.base() - __rhs.base(); }
984 template<
typename _Iterator,
typename _Container>
985 inline typename __normal_iterator<_Iterator, _Container>::difference_type
986 operator-(
const __normal_iterator<_Iterator, _Container>& __lhs,
987 const __normal_iterator<_Iterator, _Container>& __rhs)
989 {
return __lhs.base() - __rhs.base(); }
991 template<
typename _Iterator,
typename _Container>
992 inline __normal_iterator<_Iterator, _Container>
993 operator+(
typename __normal_iterator<_Iterator, _Container>::difference_type
994 __n,
const __normal_iterator<_Iterator, _Container>& __i)
996 {
return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
998 _GLIBCXX_END_NAMESPACE_VERSION
1001 namespace std _GLIBCXX_VISIBILITY(default)
1003 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1005 template<
typename _Iterator,
typename _Container>
1007 __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
1009 {
return __it.base(); }
1011 #if __cplusplus >= 201103L 1027 template<
typename _Iterator>
1031 _Iterator _M_current;
1033 typedef iterator_traits<_Iterator> __traits_type;
1034 typedef typename __traits_type::reference __base_ref;
1037 typedef _Iterator iterator_type;
1039 typedef typename __traits_type::value_type
value_type;
1040 typedef typename __traits_type::difference_type difference_type;
1042 typedef _Iterator pointer;
1046 typename remove_reference<__base_ref>::type&&,
1047 __base_ref>::type reference;
1049 _GLIBCXX17_CONSTEXPR
1053 explicit _GLIBCXX17_CONSTEXPR
1054 move_iterator(iterator_type __i)
1055 : _M_current(__i) { }
1057 template<
typename _Iter>
1058 _GLIBCXX17_CONSTEXPR
1060 : _M_current(__i.base()) { }
1062 _GLIBCXX17_CONSTEXPR iterator_type
1064 {
return _M_current; }
1066 _GLIBCXX17_CONSTEXPR reference
1068 {
return static_cast<reference
>(*_M_current); }
1070 _GLIBCXX17_CONSTEXPR pointer
1072 {
return _M_current; }
1074 _GLIBCXX17_CONSTEXPR move_iterator&
1081 _GLIBCXX17_CONSTEXPR move_iterator
1084 move_iterator __tmp = *
this;
1089 _GLIBCXX17_CONSTEXPR move_iterator&
1096 _GLIBCXX17_CONSTEXPR move_iterator
1099 move_iterator __tmp = *
this;
1104 _GLIBCXX17_CONSTEXPR move_iterator
1106 {
return move_iterator(_M_current + __n); }
1108 _GLIBCXX17_CONSTEXPR move_iterator&
1115 _GLIBCXX17_CONSTEXPR move_iterator
1117 {
return move_iterator(_M_current - __n); }
1119 _GLIBCXX17_CONSTEXPR move_iterator&
1126 _GLIBCXX17_CONSTEXPR reference
1128 {
return std::move(_M_current[__n]); }
1134 template<
typename _IteratorL,
typename _IteratorR>
1135 inline _GLIBCXX17_CONSTEXPR
bool 1138 {
return __x.base() == __y.base(); }
1140 template<
typename _Iterator>
1141 inline _GLIBCXX17_CONSTEXPR
bool 1144 {
return __x.base() == __y.base(); }
1146 template<
typename _IteratorL,
typename _IteratorR>
1147 inline _GLIBCXX17_CONSTEXPR
bool 1150 {
return !(__x == __y); }
1152 template<
typename _Iterator>
1153 inline _GLIBCXX17_CONSTEXPR
bool 1156 {
return !(__x == __y); }
1158 template<
typename _IteratorL,
typename _IteratorR>
1159 inline _GLIBCXX17_CONSTEXPR
bool 1160 operator<(const move_iterator<_IteratorL>& __x,
1162 {
return __x.base() < __y.base(); }
1164 template<
typename _Iterator>
1165 inline _GLIBCXX17_CONSTEXPR
bool 1166 operator<(const move_iterator<_Iterator>& __x,
1168 {
return __x.base() < __y.base(); }
1170 template<
typename _IteratorL,
typename _IteratorR>
1171 inline _GLIBCXX17_CONSTEXPR
bool 1172 operator<=(const move_iterator<_IteratorL>& __x,
1174 {
return !(__y < __x); }
1176 template<
typename _Iterator>
1177 inline _GLIBCXX17_CONSTEXPR
bool 1178 operator<=(const move_iterator<_Iterator>& __x,
1180 {
return !(__y < __x); }
1182 template<
typename _IteratorL,
typename _IteratorR>
1183 inline _GLIBCXX17_CONSTEXPR
bool 1186 {
return __y < __x; }
1188 template<
typename _Iterator>
1189 inline _GLIBCXX17_CONSTEXPR
bool 1192 {
return __y < __x; }
1194 template<
typename _IteratorL,
typename _IteratorR>
1195 inline _GLIBCXX17_CONSTEXPR
bool 1198 {
return !(__x < __y); }
1200 template<
typename _Iterator>
1201 inline _GLIBCXX17_CONSTEXPR
bool 1204 {
return !(__x < __y); }
1207 template<
typename _IteratorL,
typename _IteratorR>
1208 inline _GLIBCXX17_CONSTEXPR
auto 1211 -> decltype(__x.base() - __y.base())
1212 {
return __x.base() - __y.base(); }
1214 template<
typename _Iterator>
1216 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1218 {
return __x + __n; }
1220 template<
typename _Iterator>
1222 make_move_iterator(_Iterator __i)
1225 template<
typename _Iterator,
typename _ReturnType
1227 <
typename iterator_traits<_Iterator>::value_type>::value,
1229 inline _GLIBCXX17_CONSTEXPR _ReturnType
1230 __make_move_if_noexcept_iterator(_Iterator __i)
1231 {
return _ReturnType(__i); }
1235 template<
typename _Tp,
typename _ReturnType
1238 inline _GLIBCXX17_CONSTEXPR _ReturnType
1239 __make_move_if_noexcept_iterator(_Tp* __i)
1240 {
return _ReturnType(__i); }
1244 template<
typename _Iterator>
1247 -> decltype(make_move_iterator(__niter_base(__it.base())))
1248 {
return make_move_iterator(__niter_base(__it.base())); }
1250 template<
typename _Iterator>
1251 struct __is_move_iterator<move_iterator<_Iterator> >
1253 enum { __value = 1 };
1254 typedef __true_type __type;
1257 template<
typename _Iterator>
1260 -> decltype(__miter_base(__it.base()))
1261 {
return __miter_base(__it.base()); }
1263 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) 1264 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ 1265 std::__make_move_if_noexcept_iterator(_Iter) 1267 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) 1268 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) 1271 #if __cpp_deduction_guides >= 201606 1274 template<
typename _InputIterator>
1276 typename iterator_traits<_InputIterator>::value_type::first_type>;
1278 template<
typename _InputIterator>
1279 using __iter_val_t =
1280 typename iterator_traits<_InputIterator>::value_type::second_type;
1282 template<
typename _T1,
typename _T2>
1285 template<
typename _InputIterator>
1286 using __iter_to_alloc_t =
1288 __iter_val_t<_InputIterator>>;
1292 _GLIBCXX_END_NAMESPACE_VERSION
1295 #ifdef _GLIBCXX_DEBUG
_GLIBCXX17_CONSTEXPR iterator_type base() const
Turns assignment into insertion.
_GLIBCXX17_CONSTEXPR reverse_iterator(const reverse_iterator &__x)
Struct holding two objects of arbitrary type.
back_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
front_insert_iterator< _Container > front_inserter(_Container &__x)
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.
Turns assignment into insertion.
_GLIBCXX17_CONSTEXPR reverse_iterator operator-(difference_type __n) const
_Container container_type
A nested typedef for the type of whatever container you used.
front_insert_iterator & operator*()
Simply returns *this.
typename remove_const< _Tp >::type remove_const_t
Alias template for remove_const.
GNU extensions for public use.
insert_iterator & operator*()
Simply returns *this.
back_insert_iterator & operator*()
Simply returns *this.
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
_GLIBCXX17_CONSTEXPR reference operator*() const
ISO C++ entities toplevel namespace is std.
front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
iterator_traits< _Iterator >::iterator_category iterator_category
One of the tag types.
Turns assignment into insertion.
_GLIBCXX17_CONSTEXPR reverse_iterator operator++(int)
_GLIBCXX17_CONSTEXPR reverse_iterator()
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)
_GLIBCXX17_CONSTEXPR reverse_iterator(const reverse_iterator< _Iter > &__x)
_GLIBCXX17_CONSTEXPR reverse_iterator operator+(difference_type __n) const
_GLIBCXX17_CONSTEXPR reverse_iterator operator--(int)
_Container container_type
A nested typedef for the type of whatever container you used.
_GLIBCXX17_CONSTEXPR reverse_iterator & operator-=(difference_type __n)
_GLIBCXX17_CONSTEXPR reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
iterator_traits< _Iterator >::value_type value_type
The type "pointed to" by the iterator.
back_insert_iterator & operator=(const typename _Container::value_type &__value)
_GLIBCXX17_CONSTEXPR pointer operator->() const
Define a member typedef type to one of two argument types.
_GLIBCXX17_CONSTEXPR reverse_iterator & operator++()
_GLIBCXX17_CONSTEXPR reverse_iterator & operator--()
insert_iterator & operator=(const typename _Container::value_type &__value)
insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
insert_iterator< _Container > inserter(_Container &__x, typename _Container::iterator __i)
is_nothrow_copy_constructible
back_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
_GLIBCXX17_CONSTEXPR reverse_iterator & operator+=(difference_type __n)
front_insert_iterator & operator=(const typename _Container::value_type &__value)
back_insert_iterator< _Container > back_inserter(_Container &__x)
_GLIBCXX17_CONSTEXPR reference operator[](difference_type __n) const
insert_iterator(_Container &__x, typename _Container::iterator __i)
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
_GLIBCXX17_CONSTEXPR reverse_iterator(iterator_type __x)