60#ifndef _STL_ITERATOR_H
61#define _STL_ITERATOR_H 1
69#if __cplusplus >= 201103L
73#if __cplusplus >= 202002L
81#if __glibcxx_tuple_like
85namespace std _GLIBCXX_VISIBILITY(default)
87_GLIBCXX_BEGIN_NAMESPACE_VERSION
94#ifdef __glibcxx_concepts
100 template<
typename _Cat,
typename _Limit,
typename _Otherwise = _Cat>
101 using __clamp_iter_cat
102 = __conditional_t<derived_from<_Cat, _Limit>, _Limit, _Otherwise>;
108#pragma GCC diagnostic push
109#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
130 template<
typename _Iterator>
131 class reverse_iterator
132 :
public iterator<typename iterator_traits<_Iterator>::iterator_category,
133 typename iterator_traits<_Iterator>::value_type,
134 typename iterator_traits<_Iterator>::difference_type,
135 typename iterator_traits<_Iterator>::pointer,
136 typename iterator_traits<_Iterator>::reference>
138 template<
typename _Iter>
139 friend class reverse_iterator;
141#ifdef __glibcxx_concepts
144 template<
typename _Iter>
145 static constexpr bool __convertible = !is_same_v<_Iter, _Iterator>
146 && convertible_to<const _Iter&, _Iterator>;
155 typedef _Iterator iterator_type;
156 typedef typename __traits_type::pointer pointer;
157#ifndef __glibcxx_concepts
158 typedef typename __traits_type::difference_type difference_type;
159 typedef typename __traits_type::reference reference;
161 using iterator_concept
162 = __conditional_t<random_access_iterator<_Iterator>,
165 using iterator_category
166 = __detail::__clamp_iter_cat<
typename __traits_type::iterator_category,
168 using value_type = iter_value_t<_Iterator>;
169 using difference_type = iter_difference_t<_Iterator>;
170 using reference = iter_reference_t<_Iterator>;
182 _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator()))
189 explicit _GLIBCXX17_CONSTEXPR
190 reverse_iterator(iterator_type __x)
191 _GLIBCXX_NOEXCEPT_IF(
noexcept(_Iterator(__x)))
199 reverse_iterator(
const reverse_iterator& __x)
200 _GLIBCXX_NOEXCEPT_IF(
noexcept(_Iterator(__x.current)))
201 : current(__x.current)
204#if __cplusplus >= 201103L
212 template<
typename _Iter>
213#ifdef __glibcxx_concepts
214 requires __convertible<_Iter>
217 reverse_iterator(
const reverse_iterator<_Iter>& __x)
218 _GLIBCXX_NOEXCEPT_IF(
noexcept(_Iterator(__x.current)))
219 : current(__x.current)
222#if __cplusplus >= 201103L
223 template<
typename _Iter>
224# ifdef __glibcxx_concepts
225 requires __convertible<_Iter>
226 && assignable_from<_Iterator&, const _Iter&>
231 _GLIBCXX_NOEXCEPT_IF(
noexcept(current = __x.current))
233 current = __x.current;
242 _GLIBCXX17_CONSTEXPR iterator_type
244 _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(current)))
258 _GLIBCXX17_CONSTEXPR reference
261 _Iterator __tmp = current;
271 _GLIBCXX17_CONSTEXPR pointer
273#ifdef __glibcxx_concepts
274 requires is_pointer_v<_Iterator>
275 ||
requires(
const _Iterator __i) { __i.operator->(); }
280 _Iterator __tmp = current;
282 return _S_to_pointer(__tmp);
290 _GLIBCXX17_CONSTEXPR reverse_iterator&
302 _GLIBCXX17_CONSTEXPR reverse_iterator
305 reverse_iterator __tmp = *
this;
315 _GLIBCXX17_CONSTEXPR reverse_iterator&
327 _GLIBCXX17_CONSTEXPR reverse_iterator
330 reverse_iterator __tmp = *
this;
341 _GLIBCXX17_CONSTEXPR reverse_iterator
343 {
return reverse_iterator(current - __n); }
351 _GLIBCXX17_CONSTEXPR reverse_iterator&
364 _GLIBCXX17_CONSTEXPR reverse_iterator
366 {
return reverse_iterator(current + __n); }
374 _GLIBCXX17_CONSTEXPR reverse_iterator&
387 _GLIBCXX17_CONSTEXPR reference
389 {
return *(*
this + __n); }
391#ifdef __glibcxx_ranges
393 friend constexpr iter_rvalue_reference_t<_Iterator>
395 noexcept(is_nothrow_copy_constructible_v<_Iterator>
398 auto __tmp = __i.base();
399 return ranges::iter_move(--__tmp);
402 template<indirectly_swappable<_Iterator> _Iter2>
403 friend constexpr void
404 iter_swap(
const reverse_iterator& __x,
405 const reverse_iterator<_Iter2>& __y)
406 noexcept(is_nothrow_copy_constructible_v<_Iterator>
407 && is_nothrow_copy_constructible_v<_Iter2>
411 auto __xtmp = __x.base();
412 auto __ytmp = __y.base();
413 ranges::iter_swap(--__xtmp, --__ytmp);
418 template<
typename _Tp>
419 static _GLIBCXX17_CONSTEXPR _Tp*
420 _S_to_pointer(_Tp* __p)
423 template<
typename _Tp>
424 static _GLIBCXX17_CONSTEXPR pointer
425 _S_to_pointer(_Tp __t)
426 {
return __t.operator->(); }
439#ifndef __glibcxx_concepts
440 template<
typename _Iterator>
442 inline _GLIBCXX17_CONSTEXPR
bool
445 {
return __x.base() == __y.base(); }
447 template<
typename _Iterator>
449 inline _GLIBCXX17_CONSTEXPR
bool
452 {
return __y.base() < __x.base(); }
454 template<
typename _Iterator>
456 inline _GLIBCXX17_CONSTEXPR
bool
459 {
return !(__x == __y); }
461 template<
typename _Iterator>
463 inline _GLIBCXX17_CONSTEXPR
bool
466 {
return __y < __x; }
468 template<
typename _Iterator>
470 inline _GLIBCXX17_CONSTEXPR
bool
473 {
return !(__y < __x); }
475 template<
typename _Iterator>
477 inline _GLIBCXX17_CONSTEXPR
bool
480 {
return !(__x < __y); }
485 template<
typename _IteratorL,
typename _IteratorR>
487 inline _GLIBCXX17_CONSTEXPR
bool
490 {
return __x.base() == __y.base(); }
492 template<
typename _IteratorL,
typename _IteratorR>
494 inline _GLIBCXX17_CONSTEXPR
bool
497 {
return __x.base() > __y.base(); }
499 template<
typename _IteratorL,
typename _IteratorR>
501 inline _GLIBCXX17_CONSTEXPR
bool
504 {
return __x.base() != __y.base(); }
506 template<
typename _IteratorL,
typename _IteratorR>
508 inline _GLIBCXX17_CONSTEXPR
bool
511 {
return __x.base() < __y.base(); }
513 template<
typename _IteratorL,
typename _IteratorR>
514 inline _GLIBCXX17_CONSTEXPR
bool
517 {
return __x.base() >= __y.base(); }
519 template<
typename _IteratorL,
typename _IteratorR>
521 inline _GLIBCXX17_CONSTEXPR
bool
524 {
return __x.base() <= __y.base(); }
526 template<
typename _IteratorL,
typename _IteratorR>
531 requires requires { { __x.
base() == __y.
base() } -> convertible_to<bool>; }
532 {
return __x.base() == __y.base(); }
534 template<
typename _IteratorL,
typename _IteratorR>
539 requires requires { { __x.base() != __y.base() } -> convertible_to<bool>; }
540 {
return __x.base() != __y.base(); }
542 template<
typename _IteratorL,
typename _IteratorR>
547 requires requires { { __x.base() > __y.base() } -> convertible_to<bool>; }
548 {
return __x.base() > __y.base(); }
550 template<
typename _IteratorL,
typename _IteratorR>
555 requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
556 {
return __x.base() < __y.base(); }
558 template<
typename _IteratorL,
typename _IteratorR>
563 requires requires { { __x.base() >= __y.base() } -> convertible_to<bool>; }
564 {
return __x.base() >= __y.base(); }
566 template<
typename _IteratorL,
typename _IteratorR>
571 requires requires { { __x.base() <= __y.base() } -> convertible_to<bool>; }
572 {
return __x.base() <= __y.base(); }
574 template<
typename _IteratorL,
575 three_way_comparable_with<_IteratorL> _IteratorR>
580 {
return __y.base() <=> __x.base(); }
585 template<
typename _Iterator>
590 requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
591 {
return __x.base() == __y.base(); }
593 template<three_way_comparable _Iterator>
598 {
return __y.base() <=> __x.base(); }
602#if __cplusplus < 201103L
603 template<
typename _Iterator>
604 inline typename reverse_iterator<_Iterator>::difference_type
607 {
return __y.base() - __x.base(); }
609 template<
typename _IteratorL,
typename _IteratorR>
610 inline typename reverse_iterator<_IteratorL>::difference_type
613 {
return __y.base() - __x.base(); }
617 template<
typename _IteratorL,
typename _IteratorR>
619 inline _GLIBCXX17_CONSTEXPR
auto
622 ->
decltype(__y.base() - __x.base())
623 {
return __y.base() - __x.base(); }
626 template<
typename _Iterator>
629 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
633#if __cplusplus >= 201103L
635 template<
typename _Iterator>
637 __make_reverse_iterator(_Iterator __i)
640# ifdef __glibcxx_make_reverse_iterator
644 template<
typename _Iterator>
650# ifdef __glibcxx_ranges
651 template<
typename _Iterator1,
typename _Iterator2>
652 requires (!sized_sentinel_for<_Iterator1, _Iterator2>)
653 inline constexpr bool
654 disable_sized_sentinel_for<reverse_iterator<_Iterator1>,
655 reverse_iterator<_Iterator2>> =
true;
659 template<
typename _Iterator>
660 struct __is_move_iterator<reverse_iterator<_Iterator> >
661 : __is_move_iterator<_Iterator>
676 template<
typename _Container>
678 :
public iterator<output_iterator_tag, void, void, void, void>
681 _Container* container;
686#ifdef __glibcxx_ranges
687 using difference_type = ptrdiff_t;
691 explicit _GLIBCXX20_CONSTEXPR
706#if __cplusplus < 201103L
708 operator=(
typename _Container::const_reference __value)
710 container->push_back(__value);
716 operator=(
const typename _Container::value_type& __value)
718 container->push_back(__value);
724 operator=(
typename _Container::value_type&& __value)
726 container->push_back(
std::move(__value));
732 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
761 template<
typename _Container>
762 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
763 inline back_insert_iterator<_Container>
777 template<
typename _Container>
779 :
public iterator<output_iterator_tag, void, void, void, void>
782 _Container* container;
787#ifdef __glibcxx_ranges
788 using difference_type = ptrdiff_t;
792 explicit _GLIBCXX20_CONSTEXPR
807#if __cplusplus < 201103L
809 operator=(
typename _Container::const_reference __value)
811 container->push_front(__value);
817 operator=(
const typename _Container::value_type& __value)
819 container->push_front(__value);
825 operator=(
typename _Container::value_type&& __value)
827 container->push_front(
std::move(__value));
833 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
862 template<
typename _Container>
863 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
864 inline front_insert_iterator<_Container>
882 template<
typename _Container>
884 :
public iterator<output_iterator_tag, void, void, void, void>
886#ifdef __glibcxx_ranges
887 using _Iter = std::__detail::__range_iter_t<_Container>;
889 typedef typename _Container::iterator _Iter;
892 _Container* container;
899#ifdef __glibcxx_ranges
900 using difference_type = ptrdiff_t;
934#if __cplusplus < 201103L
936 operator=(
typename _Container::const_reference __value)
938 iter = container->insert(iter, __value);
945 operator=(
const typename _Container::value_type& __value)
947 iter = container->insert(iter, __value);
954 operator=(
typename _Container::value_type&& __value)
956 iter = container->insert(iter,
std::move(__value));
963 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
981#pragma GCC diagnostic pop
995#ifdef __glibcxx_ranges
996 template<
typename _Container>
998 constexpr insert_iterator<_Container>
999 inserter(_Container& __x, std::__detail::__range_iter_t<_Container> __i)
1002 template<
typename _Container>
1004 inline insert_iterator<_Container>
1005 inserter(_Container& __x,
typename _Container::iterator __i)
1006 {
return insert_iterator<_Container>(__x, __i); }
1011_GLIBCXX_END_NAMESPACE_VERSION
1014namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
1016_GLIBCXX_BEGIN_NAMESPACE_VERSION
1025 template<
typename _Iterator,
typename _Container>
1026 class __normal_iterator
1029 _Iterator _M_current;
1031 typedef std::iterator_traits<_Iterator> __traits_type;
1033#if __cplusplus >= 201103L && ! defined __glibcxx_concepts
1034 template<
typename _Iter>
1035 using __convertible_from
1036 = std::__enable_if_t<std::is_convertible<_Iter, _Iterator>::value>;
1040 typedef _Iterator iterator_type;
1041 typedef typename __traits_type::iterator_category iterator_category;
1042 typedef typename __traits_type::value_type value_type;
1043 typedef typename __traits_type::difference_type difference_type;
1044 typedef typename __traits_type::reference reference;
1045 typedef typename __traits_type::pointer pointer;
1047#ifdef __glibcxx_ranges
1048 using iterator_concept = std::__detail::__iter_concept<_Iterator>;
1051 __attribute__((__always_inline__))
1053 __normal_iterator() _GLIBCXX_NOEXCEPT
1056 __attribute__((__always_inline__))
1057 explicit _GLIBCXX_CONSTEXPR
1058 __normal_iterator(
const _Iterator& __i) _GLIBCXX_NOEXCEPT
1059 : _M_current(__i) { }
1062#if __cplusplus >= 201103L
1063# ifdef __glibcxx_concepts
1064 template<
typename _Iter>
requires std::is_convertible_v<_Iter, _Iterator>
1066 template<
typename _Iter,
typename = __convertible_from<_Iter>>
1068 [[__gnu__::__always_inline__]]
1070 __normal_iterator(
const __normal_iterator<_Iter, _Container>& __i)
1075 template<
typename _Iter>
1076 __attribute__((__always_inline__))
1077 __normal_iterator(
const __normal_iterator<_Iter,
1078 typename __enable_if<
1079 (std::__are_same<_Iter, typename _Container::pointer>::__value),
1080 _Container>::__type>& __i)
1082 : _M_current(__i.base()) { }
1086 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1089 operator*() const _GLIBCXX_NOEXCEPT
1090 {
return *_M_current; }
1092 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1095 operator->() const _GLIBCXX_NOEXCEPT
1096 {
return _M_current; }
1098 __attribute__((__always_inline__))
1099 _GLIBCXX14_CONSTEXPR
1101 operator++() _GLIBCXX_NOEXCEPT
1107 __attribute__((__always_inline__))
1108 _GLIBCXX14_CONSTEXPR
1110 operator++(
int) _GLIBCXX_NOEXCEPT
1111 {
return __normal_iterator(_M_current++); }
1115 __attribute__((__always_inline__))
1116 _GLIBCXX14_CONSTEXPR
1118 operator--() _GLIBCXX_NOEXCEPT
1124 __attribute__((__always_inline__))
1125 _GLIBCXX14_CONSTEXPR
1127 operator--(
int) _GLIBCXX_NOEXCEPT
1128 {
return __normal_iterator(_M_current--); }
1132 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1135 operator[](difference_type __n)
const _GLIBCXX_NOEXCEPT
1136 {
return _M_current[__n]; }
1138 __attribute__((__always_inline__))
1139 _GLIBCXX14_CONSTEXPR
1141 operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
1142 { _M_current += __n;
return *
this; }
1144 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1147 operator+(difference_type __n)
const _GLIBCXX_NOEXCEPT
1148 {
return __normal_iterator(_M_current + __n); }
1150 __attribute__((__always_inline__))
1151 _GLIBCXX14_CONSTEXPR
1153 operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
1154 { _M_current -= __n;
return *
this; }
1156 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1159 operator-(difference_type __n)
const _GLIBCXX_NOEXCEPT
1160 {
return __normal_iterator(_M_current - __n); }
1162 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1165 base() const _GLIBCXX_NOEXCEPT
1166 {
return _M_current; }
1177#ifdef __cpp_lib_three_way_comparison
1178 template<
typename _Iter>
1179 [[nodiscard, __gnu__::__always_inline__]]
1182 operator==(
const __normal_iterator& __lhs,
1183 const __normal_iterator<_Iter, _Container>& __rhs)
1184 noexcept(
noexcept(__lhs.base() == __rhs.base()))
1186 { __lhs.base() == __rhs.base() } -> std::convertible_to<bool>;
1188 {
return __lhs.base() == __rhs.base(); }
1190 [[nodiscard, __gnu__::__always_inline__]]
1193 operator==(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1194 noexcept(
noexcept(__lhs.base() == __rhs.base()))
1196 { __lhs.base() == __rhs.base() } -> std::convertible_to<bool>;
1198 {
return __lhs.base() == __rhs.base(); }
1200 template<
typename _Iter>
1201 [[nodiscard, __gnu__::__always_inline__]]
1203 constexpr std::__detail::__synth3way_t<_Iterator, _Iter>
1204 operator<=>(
const __normal_iterator& __lhs,
1205 const __normal_iterator<_Iter, _Container>& __rhs)
1206 noexcept(
noexcept(std::__detail::__synth3way(__lhs.base(), __rhs.base())))
1208 std::__detail::__synth3way(__lhs.base(), __rhs.base());
1210 {
return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
1213 template<
typename _Iter>
1214 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1218 operator==(
const __normal_iterator& __lhs,
1219 const __normal_iterator<_Iter, _Container>& __rhs)
1221 {
return __lhs.base() == __rhs.base(); }
1223 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1227 operator==(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1229 {
return __lhs.base() == __rhs.base(); }
1231 template<
typename _Iter>
1232 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1236 operator!=(
const __normal_iterator& __lhs,
1237 const __normal_iterator<_Iter, _Container>& __rhs)
1239 {
return __lhs.base() != __rhs.base(); }
1241 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1245 operator!=(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1247 {
return __lhs.base() != __rhs.base(); }
1250 template<
typename _Iter>
1251 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1255 operator<(
const __normal_iterator& __lhs,
1256 const __normal_iterator<_Iter, _Container>& __rhs)
1258 {
return __lhs.base() < __rhs.base(); }
1260 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1262 _GLIBCXX20_CONSTEXPR
1264 operator<(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1266 {
return __lhs.base() < __rhs.base(); }
1268 template<
typename _Iter>
1269 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1273 operator>(
const __normal_iterator& __lhs,
1274 const __normal_iterator<_Iter, _Container>& __rhs)
1276 {
return __lhs.base() > __rhs.base(); }
1278 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1282 operator>(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1284 {
return __lhs.base() > __rhs.base(); }
1286 template<
typename _Iter>
1287 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1292 const __normal_iterator<_Iter, _Container>& __rhs)
1294 {
return __lhs.base() <= __rhs.base(); }
1296 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1300 operator<=(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1302 {
return __lhs.base() <= __rhs.base(); }
1304 template<
typename _Iter>
1305 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1310 const __normal_iterator<_Iter, _Container>& __rhs)
1312 {
return __lhs.base() >= __rhs.base(); }
1314 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1318 operator>=(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1320 {
return __lhs.base() >= __rhs.base(); }
1328 template<
typename _Iter>
1329#if __cplusplus >= 201103L
1330 [[__nodiscard__, __gnu__::__always_inline__]]
1335 operator-(
const __normal_iterator& __lhs,
1336 const __normal_iterator<_Iter, _Container>& __rhs)
noexcept
1337 ->
decltype(__lhs.base() - __rhs.base())
1341 operator-(
const __normal_iterator& __lhs,
1342 const __normal_iterator<_Iter, _Container>& __rhs)
1344 {
return __lhs.base() - __rhs.base(); }
1346 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1350 operator-(
const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
1352 {
return __lhs.base() - __rhs.base(); }
1354 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
1358 operator+(difference_type __n,
const __normal_iterator& __i)
1360 {
return __normal_iterator(__i.base() + __n); }
1363_GLIBCXX_END_NAMESPACE_VERSION
1366namespace std _GLIBCXX_VISIBILITY(default)
1368_GLIBCXX_BEGIN_NAMESPACE_VERSION
1370#if __cplusplus >= 201103L
1376#ifdef __glibcxx_ranges
1378 template<semiregular _Sent>
1384 noexcept(is_nothrow_default_constructible_v<_Sent>)
1388 move_sentinel(_Sent __s)
1389 noexcept(is_nothrow_move_constructible_v<_Sent>)
1392 template<
typename _S2>
requires convertible_to<const _S2&, _Sent>
1394 move_sentinel(
const move_sentinel<_S2>& __s)
1395 noexcept(is_nothrow_constructible_v<_Sent, const _S2&>)
1396 : _M_last(__s.base())
1399 template<
typename _S2>
requires assignable_from<_Sent&, const _S2&>
1400 constexpr move_sentinel&
1401 operator=(
const move_sentinel<_S2>& __s)
1402 noexcept(is_nothrow_assignable_v<_Sent, const _S2&>)
1404 _M_last = __s.base();
1411 noexcept(is_nothrow_copy_constructible_v<_Sent>)
1421 template<
typename _Iterator>
1422 struct __move_iter_cat
1425 template<
typename _Iterator>
1426 requires requires {
typename __iter_category_t<_Iterator>; }
1427 struct __move_iter_cat<_Iterator>
1429 using iterator_category
1430 = __clamp_iter_cat<__iter_category_t<_Iterator>,
1431 random_access_iterator_tag>;
1447 template<
typename _Iterator>
1449#ifdef __glibcxx_ranges
1450 :
public __detail::__move_iter_cat<_Iterator>
1453 _Iterator _M_current;
1456#ifndef __glibcxx_ranges
1457 using __base_ref =
typename __traits_type::reference;
1460 template<
typename _Iter2>
1461 friend class move_iterator;
1463#ifdef __glibcxx_concepts
1466 template<
typename _Iter2>
1467 static constexpr bool __convertible = !is_same_v<_Iter2, _Iterator>
1468 && convertible_to<const _Iter2&, _Iterator>;
1471#ifdef __glibcxx_ranges
1475 if constexpr (random_access_iterator<_Iterator>)
1477 else if constexpr (bidirectional_iterator<_Iterator>)
1479 else if constexpr (forward_iterator<_Iterator>)
1487 using iterator_type = _Iterator;
1489#ifdef __glibcxx_move_iterator_concept
1490 using iterator_concept =
decltype(_S_iter_concept());
1493 using value_type = iter_value_t<_Iterator>;
1494 using difference_type = iter_difference_t<_Iterator>;
1495 using pointer = _Iterator;
1496 using reference = iter_rvalue_reference_t<_Iterator>;
1498 typedef typename __traits_type::iterator_category iterator_category;
1499 typedef typename __traits_type::value_type value_type;
1500 typedef typename __traits_type::difference_type difference_type;
1502 typedef _Iterator pointer;
1506 = __conditional_t<is_reference<__base_ref>::value,
1507 typename remove_reference<__base_ref>::type&&,
1511 _GLIBCXX17_CONSTEXPR
1515 explicit _GLIBCXX17_CONSTEXPR
1516 move_iterator(iterator_type __i)
1519 template<
typename _Iter>
1520#ifdef __glibcxx_concepts
1521 requires __convertible<_Iter>
1523 _GLIBCXX17_CONSTEXPR
1524 move_iterator(
const move_iterator<_Iter>& __i)
1525 : _M_current(__i._M_current) { }
1527 template<
typename _Iter>
1528#ifdef __glibcxx_concepts
1529 requires __convertible<_Iter>
1530 && assignable_from<_Iterator&, const _Iter&>
1532 _GLIBCXX17_CONSTEXPR
1533 move_iterator& operator=(
const move_iterator<_Iter>& __i)
1535 _M_current = __i._M_current;
1539#if __cplusplus <= 201703L
1541 _GLIBCXX17_CONSTEXPR iterator_type
1543 {
return _M_current; }
1546 constexpr const iterator_type&
1547 base()
const &
noexcept
1548 {
return _M_current; }
1551 constexpr iterator_type
1557 _GLIBCXX17_CONSTEXPR reference
1559#ifdef __glibcxx_ranges
1560 {
return ranges::iter_move(_M_current); }
1562 {
return static_cast<reference
>(*_M_current); }
1566 _GLIBCXX17_CONSTEXPR pointer
1568 {
return _M_current; }
1570 _GLIBCXX17_CONSTEXPR move_iterator&
1577 _GLIBCXX17_CONSTEXPR move_iterator
1580 move_iterator __tmp = *
this;
1585#ifdef __glibcxx_concepts
1587 operator++(
int)
requires (!forward_iterator<_Iterator>)
1591 _GLIBCXX17_CONSTEXPR move_iterator&
1598 _GLIBCXX17_CONSTEXPR move_iterator
1601 move_iterator __tmp = *
this;
1607 _GLIBCXX17_CONSTEXPR move_iterator
1608 operator+(difference_type __n)
const
1609 {
return move_iterator(_M_current + __n); }
1611 _GLIBCXX17_CONSTEXPR move_iterator&
1612 operator+=(difference_type __n)
1619 _GLIBCXX17_CONSTEXPR move_iterator
1620 operator-(difference_type __n)
const
1621 {
return move_iterator(_M_current - __n); }
1623 _GLIBCXX17_CONSTEXPR move_iterator&
1624 operator-=(difference_type __n)
1631 _GLIBCXX17_CONSTEXPR reference
1632 operator[](difference_type __n)
const
1633#ifdef __glibcxx_ranges
1634 {
return ranges::iter_move(_M_current + __n); }
1639#ifdef __glibcxx_ranges
1640 template<sentinel_for<_Iterator> _Sent>
1642 friend constexpr bool
1644 {
return __x.base() == __y.base(); }
1646 template<sized_sentinel_for<_Iterator> _Sent>
1648 friend constexpr iter_difference_t<_Iterator>
1650 {
return __x.base() - __y.base(); }
1652 template<sized_sentinel_for<_Iterator> _Sent>
1654 friend constexpr iter_difference_t<_Iterator>
1656 {
return __x.base() - __y.base(); }
1659 friend constexpr iter_rvalue_reference_t<_Iterator>
1660 iter_move(
const move_iterator& __i)
1661 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
1662 {
return ranges::iter_move(__i._M_current); }
1664 template<indirectly_swappable<_Iterator> _Iter2>
1665 friend constexpr void
1666 iter_swap(
const move_iterator& __x,
const move_iterator<_Iter2>& __y)
1667 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
1668 {
return ranges::iter_swap(__x._M_current, __y._M_current); }
1672 template<
typename _IteratorL,
typename _IteratorR>
1674 inline _GLIBCXX17_CONSTEXPR
bool
1677#ifdef __glibcxx_concepts
1678 requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
1680 {
return __x.base() == __y.base(); }
1682#ifdef __cpp_lib_three_way_comparison
1683 template<
typename _IteratorL,
1684 three_way_comparable_with<_IteratorL> _IteratorR>
1689 {
return __x.base() <=> __y.base(); }
1691 template<
typename _IteratorL,
typename _IteratorR>
1693 inline _GLIBCXX17_CONSTEXPR
bool
1696 {
return !(__x == __y); }
1699 template<
typename _IteratorL,
typename _IteratorR>
1701 inline _GLIBCXX17_CONSTEXPR
bool
1704#ifdef __glibcxx_concepts
1705 requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
1707 {
return __x.base() < __y.base(); }
1709 template<
typename _IteratorL,
typename _IteratorR>
1711 inline _GLIBCXX17_CONSTEXPR
bool
1714#ifdef __glibcxx_concepts
1715 requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
1717 {
return !(__y < __x); }
1719 template<
typename _IteratorL,
typename _IteratorR>
1721 inline _GLIBCXX17_CONSTEXPR
bool
1724#ifdef __glibcxx_concepts
1725 requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
1727 {
return __y < __x; }
1729 template<
typename _IteratorL,
typename _IteratorR>
1731 inline _GLIBCXX17_CONSTEXPR
bool
1734#ifdef __glibcxx_concepts
1735 requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
1737 {
return !(__x < __y); }
1742 template<
typename _Iterator>
1744 inline _GLIBCXX17_CONSTEXPR
bool
1748 {
return __x.base() == __y.base(); }
1750#ifdef __cpp_lib_three_way_comparison
1751 template<three_way_comparable _Iterator>
1756 {
return __x.base() <=> __y.base(); }
1758 template<
typename _Iterator>
1760 inline _GLIBCXX17_CONSTEXPR
bool
1763 {
return !(__x == __y); }
1765 template<
typename _Iterator>
1767 inline _GLIBCXX17_CONSTEXPR
bool
1770 {
return __x.base() < __y.base(); }
1772 template<
typename _Iterator>
1774 inline _GLIBCXX17_CONSTEXPR
bool
1777 {
return !(__y < __x); }
1779 template<
typename _Iterator>
1781 inline _GLIBCXX17_CONSTEXPR
bool
1784 {
return __y < __x; }
1786 template<
typename _Iterator>
1788 inline _GLIBCXX17_CONSTEXPR
bool
1791 {
return !(__x < __y); }
1795 template<
typename _IteratorL,
typename _IteratorR>
1797 inline _GLIBCXX17_CONSTEXPR
auto
1800 ->
decltype(__x.base() - __y.base())
1801 {
return __x.base() - __y.base(); }
1803 template<
typename _Iterator>
1806 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1808#ifdef __glibcxx_concepts
1809 requires requires { { __x.base() + __n } -> same_as<_Iterator>; }
1811 {
return __x + __n; }
1813 template<
typename _Iterator>
1816 make_move_iterator(_Iterator __i)
1819 template<
typename _Iterator,
typename _ReturnType
1820 = __conditional_t<__move_if_noexcept_cond
1824 constexpr _ReturnType
1825 __make_move_if_noexcept_iterator(_Iterator __i)
1826 {
return _ReturnType(__i); }
1830 template<
typename _Tp,
typename _ReturnType
1831 = __conditional_t<__move_if_noexcept_cond<_Tp>::value,
1834 constexpr _ReturnType
1835 __make_move_if_noexcept_iterator(_Tp* __i)
1836 {
return _ReturnType(__i); }
1838 template<
typename _Iterator>
1841 enum { __value = 1 };
1842 typedef __true_type __type;
1845#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1846#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
1847 std::__make_move_if_noexcept_iterator(_Iter)
1849#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1850#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
1853#ifdef __glibcxx_ranges
1856 template<
typename _Iterator1,
typename _Iterator2>
1857 requires (!sized_sentinel_for<_Iterator1, _Iterator2>)
1858 inline constexpr bool
1867 template<
typename _It>
1868 concept __common_iter_has_arrow = indirectly_readable<const _It>
1869 && (
requires(
const _It& __it) { __it.operator->(); }
1870 || is_reference_v<iter_reference_t<_It>>
1871 || constructible_from<iter_value_t<_It>, iter_reference_t<_It>>);
1873 template<
typename _It>
1874 concept __common_iter_use_postfix_proxy
1875 = (!
requires (_It& __i) { { *__i++ } -> __can_reference; })
1876 && constructible_from<iter_value_t<_It>, iter_reference_t<_It>>
1877 && move_constructible<iter_value_t<_It>>;
1882 template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1883 requires (!same_as<_It, _Sent>) && copyable<_It>
1884 class common_iterator
1886 template<
typename _Tp,
typename _Up>
1887 static constexpr bool
1890 if constexpr (is_trivially_default_constructible_v<_Tp>)
1891 return is_nothrow_assignable_v<_Tp&, _Up>;
1893 return is_nothrow_constructible_v<_Tp, _Up>;
1896 template<
typename _It2,
typename _Sent2>
1897 static constexpr bool
1899 {
return _S_noexcept1<_It, _It2>() && _S_noexcept1<_Sent, _Sent2>(); }
1903 iter_value_t<_It> _M_keep;
1906 __arrow_proxy(iter_reference_t<_It>&& __x)
1909 friend class common_iterator;
1912 constexpr const iter_value_t<_It>*
1913 operator->()
const noexcept
1917 class __postfix_proxy
1919 iter_value_t<_It> _M_keep;
1922 __postfix_proxy(iter_reference_t<_It>&& __x)
1923 : _M_keep(
std::forward<iter_reference_t<_It>>(__x)) { }
1925 friend class common_iterator;
1928 constexpr const iter_value_t<_It>&
1929 operator*()
const noexcept
1936 noexcept(is_nothrow_default_constructible_v<_It>)
1937 requires default_initializable<_It>
1938 : _M_it(), _M_index(0)
1942 common_iterator(_It __i)
1943 noexcept(is_nothrow_move_constructible_v<_It>)
1948 common_iterator(_Sent __s)
1949 noexcept(is_nothrow_move_constructible_v<_Sent>)
1953 template<
typename _It2,
typename _Sent2>
1954 requires convertible_to<const _It2&, _It>
1955 && convertible_to<const _Sent2&, _Sent>
1957 common_iterator(
const common_iterator<_It2, _Sent2>& __x)
1958 noexcept(_S_noexcept<const _It2&, const _Sent2&>())
1959 : _M_valueless(), _M_index(__x._M_index)
1961 __glibcxx_assert(__x._M_has_value());
1964 if constexpr (is_trivially_default_constructible_v<_It>)
1969 else if (_M_index == 1)
1971 if constexpr (is_trivially_default_constructible_v<_Sent>)
1978 common_iterator(
const common_iterator&) =
default;
1981 common_iterator(
const common_iterator& __x)
1982 noexcept(_S_noexcept<const _It&, const _Sent&>())
1983 requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
1984 : _M_valueless(), _M_index(__x._M_index)
1988 if constexpr (is_trivially_default_constructible_v<_It>)
1993 else if (_M_index == 1)
1995 if constexpr (is_trivially_default_constructible_v<_Sent>)
1996 _M_sent = __x._M_sent;
2002 common_iterator(common_iterator&&) =
default;
2005 common_iterator(common_iterator&& __x)
2006 noexcept(_S_noexcept<_It, _Sent>())
2007 requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
2008 : _M_valueless(), _M_index(__x._M_index)
2012 if constexpr (is_trivially_default_constructible_v<_It>)
2017 else if (_M_index == 1)
2019 if constexpr (is_trivially_default_constructible_v<_Sent>)
2027 constexpr common_iterator&
2028 operator=(
const common_iterator&) =
default;
2030 constexpr common_iterator&
2031 operator=(
const common_iterator& __x)
2032 noexcept(is_nothrow_copy_assignable_v<_It>
2033 && is_nothrow_copy_assignable_v<_Sent>
2034 && is_nothrow_copy_constructible_v<_It>
2035 && is_nothrow_copy_constructible_v<_Sent>)
2036 requires (!is_trivially_copy_assignable_v<_It>
2037 || !is_trivially_copy_assignable_v<_Sent>)
2043 constexpr common_iterator&
2044 operator=(common_iterator&&) =
default;
2046 constexpr common_iterator&
2047 operator=(common_iterator&& __x)
2048 noexcept(is_nothrow_move_assignable_v<_It>
2049 && is_nothrow_move_assignable_v<_Sent>
2050 && is_nothrow_move_constructible_v<_It>
2051 && is_nothrow_move_constructible_v<_Sent>)
2052 requires (!is_trivially_move_assignable_v<_It>
2053 || !is_trivially_move_assignable_v<_Sent>)
2059 template<
typename _It2,
typename _Sent2>
2060 requires convertible_to<const _It2&, _It>
2061 && convertible_to<const _Sent2&, _Sent>
2062 && assignable_from<_It&, const _It2&>
2063 && assignable_from<_Sent&, const _Sent2&>
2064 constexpr common_iterator&
2065 operator=(
const common_iterator<_It2, _Sent2>& __x)
2066 noexcept(is_nothrow_constructible_v<_It, const _It2&>
2067 && is_nothrow_constructible_v<_Sent, const _Sent2&>
2068 && is_nothrow_assignable_v<_It&, const _It2&>
2069 && is_nothrow_assignable_v<_Sent&, const _Sent2&>)
2071 __glibcxx_assert(__x._M_has_value());
2076#if __cpp_concepts >= 202002L
2077 ~common_iterator() =
default;
2081 requires (!is_trivially_destructible_v<_It>
2082 || !is_trivially_destructible_v<_Sent>)
2090 else if (_M_index == 1)
2095 constexpr decltype(
auto)
2098 __glibcxx_assert(_M_index == 0);
2103 constexpr decltype(
auto)
2104 operator*()
const requires __detail::__dereferenceable<const _It>
2106 __glibcxx_assert(_M_index == 0);
2112 operator->()
const requires __detail::__common_iter_has_arrow<_It>
2114 __glibcxx_assert(_M_index == 0);
2115 if constexpr (is_pointer_v<_It> ||
requires { _M_it.operator->(); })
2117 else if constexpr (is_reference_v<iter_reference_t<_It>>)
2119 auto&& __tmp = *_M_it;
2123 return __arrow_proxy{*_M_it};
2126 constexpr common_iterator&
2129 __glibcxx_assert(_M_index == 0);
2134 constexpr decltype(
auto)
2137 __glibcxx_assert(_M_index == 0);
2138 if constexpr (forward_iterator<_It>)
2140 common_iterator __tmp = *
this;
2144 else if constexpr (!__detail::__common_iter_use_postfix_proxy<_It>)
2148 __postfix_proxy __p(**
this);
2154 template<
typename _It2, sentinel_for<_It> _Sent2>
2155 requires sentinel_for<_Sent, _It2>
2156 friend constexpr bool
2157 operator== [[nodiscard]] (
const common_iterator& __x,
2158 const common_iterator<_It2, _Sent2>& __y)
2160 switch(__x._M_index << 2 | __y._M_index)
2166 return __x._M_it == __y._M_sent;
2168 return __x._M_sent == __y._M_it;
2170 __glibcxx_assert(__x._M_has_value());
2171 __glibcxx_assert(__y._M_has_value());
2172 __builtin_unreachable();
2176 template<
typename _It2, sentinel_for<_It> _Sent2>
2177 requires sentinel_for<_Sent, _It2> && equality_comparable_with<_It, _It2>
2178 friend constexpr bool
2179 operator== [[nodiscard]] (
const common_iterator& __x,
2180 const common_iterator<_It2, _Sent2>& __y)
2182 switch(__x._M_index << 2 | __y._M_index)
2187 return __x._M_it == __y._M_it;
2189 return __x._M_it == __y._M_sent;
2191 return __x._M_sent == __y._M_it;
2193 __glibcxx_assert(__x._M_has_value());
2194 __glibcxx_assert(__y._M_has_value());
2195 __builtin_unreachable();
2199 template<sized_sentinel_for<_It> _It2, sized_sentinel_for<_It> _Sent2>
2200 requires sized_sentinel_for<_Sent, _It2>
2201 friend constexpr iter_difference_t<_It2>
2202 operator- [[nodiscard]] (
const common_iterator& __x,
2203 const common_iterator<_It2, _Sent2>& __y)
2205 switch(__x._M_index << 2 | __y._M_index)
2210 return __x._M_it - __y._M_it;
2212 return __x._M_it - __y._M_sent;
2214 return __x._M_sent - __y._M_it;
2216 __glibcxx_assert(__x._M_has_value());
2217 __glibcxx_assert(__y._M_has_value());
2218 __builtin_unreachable();
2223 friend constexpr iter_rvalue_reference_t<_It>
2224 iter_move(
const common_iterator& __i)
2226 requires input_iterator<_It>
2228 __glibcxx_assert(__i._M_index == 0);
2229 return ranges::iter_move(__i._M_it);
2232 template<indirectly_swappable<_It> _It2,
typename _Sent2>
2233 friend constexpr void
2234 iter_swap(
const common_iterator& __x,
2235 const common_iterator<_It2, _Sent2>& __y)
2239 __glibcxx_assert(__x._M_index == 0);
2240 __glibcxx_assert(__y._M_index == 0);
2241 return ranges::iter_swap(__x._M_it, __y._M_it);
2245 template<input_or_output_iterator _It2, sentinel_for<_It2> _Sent2>
2246 requires (!same_as<_It2, _Sent2>) && copyable<_It2>
2247 friend class common_iterator;
2250 _M_has_value()
const noexcept {
return _M_index != _S_valueless; }
2252 template<
typename _CIt>
2254 _M_assign(_CIt&& __x)
2256 if (_M_index == __x._M_index)
2260 else if (_M_index == 1)
2267 else if (_M_index == 1)
2269 _M_index = _S_valueless;
2271 if (__x._M_index == 0)
2274 else if (__x._M_index == 1)
2277 _M_index = __x._M_index;
2285 unsigned char _M_valueless;
2287 unsigned char _M_index;
2289 static constexpr unsigned char _S_valueless{2};
2292 template<
typename _It,
typename _Sent>
2298 template<input_iterator _It,
typename _Sent>
2299 struct iterator_traits<common_iterator<_It, _Sent>>
2302 template<
typename _Iter>
2308 template<
typename _Iter>
2309 requires __detail::__common_iter_has_arrow<_Iter>
2312 using _CIter = common_iterator<_Iter, _Sent>;
2319 if constexpr (
requires {
requires derived_from<__iter_category_t<_It>,
2320 forward_iterator_tag>; })
2321 return forward_iterator_tag{};
2323 return input_iterator_tag{};
2327 using iterator_concept = __conditional_t<forward_iterator<_It>,
2328 forward_iterator_tag,
2329 input_iterator_tag>;
2330 using iterator_category =
decltype(_S_iter_cat());
2331 using value_type = iter_value_t<_It>;
2332 using difference_type = iter_difference_t<_It>;
2333 using pointer =
typename __ptr<_It>::type;
2334 using reference = iter_reference_t<_It>;
2342 template<
typename _It>
2343 struct __counted_iter_value_type
2346 template<indirectly_readable _It>
2347 struct __counted_iter_value_type<_It>
2348 {
using value_type = iter_value_t<_It>; };
2350 template<
typename _It>
2351 struct __counted_iter_concept
2354 template<
typename _It>
2355 requires requires {
typename _It::iterator_concept; }
2356 struct __counted_iter_concept<_It>
2357 {
using iterator_concept =
typename _It::iterator_concept; };
2359 template<
typename _It>
2360 struct __counted_iter_cat
2363 template<
typename _It>
2364 requires requires {
typename _It::iterator_category; }
2365 struct __counted_iter_cat<_It>
2366 {
using iterator_category =
typename _It::iterator_category; };
2371 template<input_or_output_iterator _It>
2372 class counted_iterator
2373 :
public __detail::__counted_iter_value_type<_It>,
2374 public __detail::__counted_iter_concept<_It>,
2375 public __detail::__counted_iter_cat<_It>
2378 using iterator_type = _It;
2380 using difference_type = iter_difference_t<_It>;
2384 constexpr counted_iterator()
requires default_initializable<_It> =
default;
2387 counted_iterator(_It __i, iter_difference_t<_It> __n)
2388 : _M_current(
std::move(__i)), _M_length(__n)
2389 { __glibcxx_assert(__n >= 0); }
2391 template<
typename _It2>
2392 requires convertible_to<const _It2&, _It>
2394 counted_iterator(
const counted_iterator<_It2>& __x)
2395 : _M_current(__x._M_current), _M_length(__x._M_length)
2398 template<
typename _It2>
2399 requires assignable_from<_It&, const _It2&>
2400 constexpr counted_iterator&
2401 operator=(
const counted_iterator<_It2>& __x)
2403 _M_current = __x._M_current;
2404 _M_length = __x._M_length;
2409 constexpr const _It&
2410 base()
const &
noexcept
2411 {
return _M_current; }
2416 noexcept(is_nothrow_move_constructible_v<_It>)
2420 constexpr iter_difference_t<_It>
2421 count()
const noexcept {
return _M_length; }
2424 constexpr decltype(
auto)
2426 noexcept(
noexcept(*_M_current))
2428 __glibcxx_assert( _M_length > 0 );
2433 constexpr decltype(
auto)
2435 noexcept(
noexcept(*_M_current))
2436 requires __detail::__dereferenceable<const _It>
2438 __glibcxx_assert( _M_length > 0 );
2444 operator->()
const noexcept
2445 requires contiguous_iterator<_It>
2448 constexpr counted_iterator&
2451 __glibcxx_assert(_M_length > 0);
2457 constexpr decltype(
auto)
2460 __glibcxx_assert(_M_length > 0);
2464 return _M_current++;
2467 __throw_exception_again;
2471 constexpr counted_iterator
2472 operator++(
int)
requires forward_iterator<_It>
2479 constexpr counted_iterator&
2480 operator--()
requires bidirectional_iterator<_It>
2487 constexpr counted_iterator
2488 operator--(
int)
requires bidirectional_iterator<_It>
2496 constexpr counted_iterator
2497 operator+(iter_difference_t<_It> __n)
const
2498 requires random_access_iterator<_It>
2499 {
return counted_iterator(_M_current + __n, _M_length - __n); }
2502 friend constexpr counted_iterator
2503 operator+(iter_difference_t<_It> __n,
const counted_iterator& __x)
2504 requires random_access_iterator<_It>
2505 {
return __x + __n; }
2507 constexpr counted_iterator&
2508 operator+=(iter_difference_t<_It> __n)
2509 requires random_access_iterator<_It>
2511 __glibcxx_assert(__n <= _M_length);
2518 constexpr counted_iterator
2519 operator-(iter_difference_t<_It> __n)
const
2520 requires random_access_iterator<_It>
2521 {
return counted_iterator(_M_current - __n, _M_length + __n); }
2523 template<common_with<_It> _It2>
2525 friend constexpr iter_difference_t<_It2>
2526 operator-(
const counted_iterator& __x,
2527 const counted_iterator<_It2>& __y)
noexcept
2528 {
return __y._M_length - __x._M_length; }
2531 friend constexpr iter_difference_t<_It>
2533 {
return -__x._M_length; }
2536 friend constexpr iter_difference_t<_It>
2538 {
return __y._M_length; }
2540 constexpr counted_iterator&
2541 operator-=(iter_difference_t<_It> __n)
2542 requires random_access_iterator<_It>
2544 __glibcxx_assert(-__n <= _M_length);
2551 constexpr decltype(
auto)
2552 operator[](iter_difference_t<_It> __n)
const
2553 noexcept(
noexcept(_M_current[__n]))
2554 requires random_access_iterator<_It>
2556 __glibcxx_assert(__n < _M_length);
2557 return _M_current[__n];
2560 template<common_with<_It> _It2>
2562 friend constexpr bool
2563 operator==(
const counted_iterator& __x,
2564 const counted_iterator<_It2>& __y)
noexcept
2565 {
return __x._M_length == __y._M_length; }
2568 friend constexpr bool
2570 {
return __x._M_length == 0; }
2572 template<common_with<_It> _It2>
2574 friend constexpr strong_ordering
2575 operator<=>(
const counted_iterator& __x,
2576 const counted_iterator<_It2>& __y)
noexcept
2577 {
return __y._M_length <=> __x._M_length; }
2580 friend constexpr iter_rvalue_reference_t<_It>
2581 iter_move(
const counted_iterator& __i)
2582 noexcept(
noexcept(ranges::iter_move(__i._M_current)))
2583 requires input_iterator<_It>
2585 __glibcxx_assert( __i._M_length > 0 );
2586 return ranges::iter_move(__i._M_current);
2589 template<indirectly_swappable<_It> _It2>
2590 friend constexpr void
2591 iter_swap(
const counted_iterator& __x,
2592 const counted_iterator<_It2>& __y)
2593 noexcept(
noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
2595 __glibcxx_assert( __x._M_length > 0 && __y._M_length > 0 );
2596 ranges::iter_swap(__x._M_current, __y._M_current);
2600 template<input_or_output_iterator _It2>
friend class counted_iterator;
2602 _It _M_current = _It();
2603 iter_difference_t<_It> _M_length = 0;
2606 template<input_iterator _It>
2610 using pointer = __conditional_t<contiguous_iterator<_It>,
2615#ifdef __glibcxx_ranges_as_const
2616 template<indirectly_readable _It>
2617 using iter_const_reference_t
2620 template<input_iterator _It>
class basic_const_iterator;
2624 template<
typename _It>
2625 concept __constant_iterator = input_iterator<_It>
2626 && same_as<iter_const_reference_t<_It>, iter_reference_t<_It>>;
2628 template<
typename _Tp>
2629 inline constexpr bool __is_const_iterator =
false;
2631 template<
typename _It>
2632 inline constexpr bool __is_const_iterator<basic_const_iterator<_It>> =
true;
2634 template<
typename _Tp>
2635 concept __not_a_const_iterator = !__is_const_iterator<_Tp>;
2637 template<indirectly_readable _It>
2638 using __iter_const_rvalue_reference_t
2641 template<
typename _It>
2642 struct __basic_const_iterator_iter_cat
2645 template<forward_iterator _It>
2646 struct __basic_const_iterator_iter_cat<_It>
2647 {
using iterator_category = __iter_category_t<_It>; };
2650 template<input_iterator _It>
2651 using const_iterator
2652 = __conditional_t<__detail::__constant_iterator<_It>, _It, basic_const_iterator<_It>>;
2656 template<
typename _Sent>
2657 struct __const_sentinel
2658 {
using type = _Sent; };
2660 template<input_iterator _Sent>
2661 struct __const_sentinel<_Sent>
2662 {
using type = const_iterator<_Sent>; };
2665 template<semiregular _Sent>
2666 using const_sentinel =
typename __detail::__const_sentinel<_Sent>::type;
2668 template<input_iterator _It>
2669 class basic_const_iterator
2670 :
public __detail::__basic_const_iterator_iter_cat<_It>
2672 _It _M_current = _It();
2673 using __reference = iter_const_reference_t<_It>;
2674 using __rvalue_reference = __detail::__iter_const_rvalue_reference_t<_It>;
2679 if constexpr (contiguous_iterator<_It>)
2680 return contiguous_iterator_tag{};
2681 else if constexpr (random_access_iterator<_It>)
2682 return random_access_iterator_tag{};
2683 else if constexpr (bidirectional_iterator<_It>)
2684 return bidirectional_iterator_tag{};
2685 else if constexpr (forward_iterator<_It>)
2686 return forward_iterator_tag{};
2688 return input_iterator_tag{};
2691 template<input_iterator _It2>
friend class basic_const_iterator;
2694 using iterator_concept =
decltype(_S_iter_concept());
2695 using value_type = iter_value_t<_It>;
2696 using difference_type = iter_difference_t<_It>;
2698 basic_const_iterator()
requires default_initializable<_It> = default;
2701 basic_const_iterator(_It __current)
2702 noexcept(is_nothrow_move_constructible_v<_It>)
2703 : _M_current(std::move(__current))
2706 template<convertible_to<_It> _It2>
2708 basic_const_iterator(basic_const_iterator<_It2> __current)
2709 noexcept(is_nothrow_constructible_v<_It, _It2>)
2710 : _M_current(std::
move(__current._M_current))
2713 template<__detail::__different_from<basic_const_iterator> _Tp>
2714 requires convertible_to<_Tp, _It>
2716 basic_const_iterator(_Tp&& __current)
2717 noexcept(is_nothrow_constructible_v<_It, _Tp>)
2718 : _M_current(std::
forward<_Tp>(__current))
2721 constexpr const _It&
2722 base() const & noexcept
2723 {
return _M_current; }
2727 noexcept(is_nothrow_move_constructible_v<_It>)
2730 constexpr __reference
2732 noexcept(noexcept(static_cast<__reference>(*_M_current)))
2733 {
return static_cast<__reference
>(*_M_current); }
2735 constexpr const auto*
2737 noexcept(contiguous_iterator<_It> || noexcept(*_M_current))
2738 requires is_lvalue_reference_v<iter_reference_t<_It>>
2739 && same_as<remove_cvref_t<iter_reference_t<_It>>, value_type>
2741 if constexpr (contiguous_iterator<_It>)
2747 constexpr basic_const_iterator&
2749 noexcept(noexcept(++_M_current))
2757 noexcept(
noexcept(++_M_current))
2760 constexpr basic_const_iterator
2762 noexcept(
noexcept(++*
this) && is_nothrow_copy_constructible_v<basic_const_iterator>)
2763 requires forward_iterator<_It>
2770 constexpr basic_const_iterator&
2772 noexcept(noexcept(--_M_current))
2773 requires bidirectional_iterator<_It>
2779 constexpr basic_const_iterator
2781 noexcept(
noexcept(--*
this) && is_nothrow_copy_constructible_v<basic_const_iterator>)
2782 requires bidirectional_iterator<_It>
2789 constexpr basic_const_iterator&
2790 operator+=(difference_type __n)
2791 noexcept(
noexcept(_M_current += __n))
2792 requires random_access_iterator<_It>
2798 constexpr basic_const_iterator&
2799 operator-=(difference_type __n)
2800 noexcept(
noexcept(_M_current -= __n))
2801 requires random_access_iterator<_It>
2807 constexpr __reference
2808 operator[](difference_type __n)
const
2809 noexcept(
noexcept(
static_cast<__reference
>(_M_current[__n])))
2810 requires random_access_iterator<_It>
2811 {
return static_cast<__reference
>(_M_current[__n]); }
2813 template<sentinel_for<_It> _Sent>
2815 operator==(
const _Sent& __s)
const
2816 noexcept(
noexcept(_M_current == __s))
2817 {
return _M_current == __s; }
2819 template<__detail::__not_a_const_iterator _CIt>
2820 requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
2822 operator _CIt() const&
2823 {
return _M_current; }
2825 template<__detail::__not_a_const_iterator _CIt>
2826 requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
2832 operator<(
const basic_const_iterator& __y)
const
2833 noexcept(
noexcept(_M_current < __y._M_current))
2834 requires random_access_iterator<_It>
2835 {
return _M_current < __y._M_current; }
2838 operator>(
const basic_const_iterator& __y)
const
2839 noexcept(
noexcept(_M_current > __y._M_current))
2840 requires random_access_iterator<_It>
2841 {
return _M_current > __y._M_current; }
2844 operator<=(
const basic_const_iterator& __y)
const
2845 noexcept(
noexcept(_M_current <= __y._M_current))
2846 requires random_access_iterator<_It>
2847 {
return _M_current <= __y._M_current; }
2850 operator>=(
const basic_const_iterator& __y)
const
2851 noexcept(
noexcept(_M_current >= __y._M_current))
2852 requires random_access_iterator<_It>
2853 {
return _M_current >= __y._M_current; }
2856 operator<=>(
const basic_const_iterator& __y)
const
2857 noexcept(
noexcept(_M_current <=> __y._M_current))
2858 requires random_access_iterator<_It> && three_way_comparable<_It>
2859 {
return _M_current <=> __y._M_current; }
2861 template<__detail::__different_from<basic_const_iterator> _It2>
2864 noexcept(
noexcept(_M_current < __y))
2865 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2866 {
return _M_current < __y; }
2868 template<__detail::__different_from<basic_const_iterator> _It2>
2871 noexcept(
noexcept(_M_current > __y))
2872 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2873 {
return _M_current > __y; }
2875 template<__detail::__different_from<basic_const_iterator> _It2>
2878 noexcept(
noexcept(_M_current <= __y))
2879 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2880 {
return _M_current <= __y; }
2882 template<__detail::__different_from<basic_const_iterator> _It2>
2885 noexcept(
noexcept(_M_current >= __y))
2886 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2887 {
return _M_current >= __y; }
2889 template<__detail::__different_from<basic_const_iterator> _It2>
2891 operator<=>(
const _It2& __y)
const
2892 noexcept(
noexcept(_M_current <=> __y))
2893 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2894 && three_way_comparable_with<_It, _It2>
2895 {
return _M_current <=> __y; }
2897 template<__detail::__not_a_const_iterator _It2, same_as<_It> _It3>
2898 friend constexpr bool
2899 operator<(
const _It2& __x,
const basic_const_iterator<_It3>& __y)
2900 noexcept(
noexcept(__x < __y._M_current))
2901 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2902 {
return __x < __y._M_current; }
2904 template<__detail::__not_a_const_iterator _It2, same_as<_It> _It3>
2905 friend constexpr bool
2906 operator>(
const _It2& __x,
const basic_const_iterator<_It3>& __y)
2907 noexcept(
noexcept(__x > __y._M_current))
2908 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2909 {
return __x > __y._M_current; }
2911 template<__detail::__not_a_const_iterator _It2, same_as<_It> _It3>
2912 friend constexpr bool
2913 operator<=(
const _It2& __x,
const basic_const_iterator<_It3>& __y)
2914 noexcept(
noexcept(__x <= __y._M_current))
2915 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2916 {
return __x <= __y._M_current; }
2918 template<__detail::__not_a_const_iterator _It2, same_as<_It> _It3>
2919 friend constexpr bool
2920 operator>=(
const _It2& __x,
const basic_const_iterator<_It3>& __y)
2921 noexcept(
noexcept(__x >= __y._M_current))
2922 requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2923 {
return __x >= __y._M_current; }
2925 friend constexpr basic_const_iterator
2926 operator+(
const basic_const_iterator& __i, difference_type __n)
2927 noexcept(
noexcept(basic_const_iterator(__i._M_current + __n)))
2928 requires random_access_iterator<_It>
2929 {
return basic_const_iterator(__i._M_current + __n); }
2931 friend constexpr basic_const_iterator
2932 operator+(difference_type __n,
const basic_const_iterator& __i)
2933 noexcept(
noexcept(basic_const_iterator(__i._M_current + __n)))
2934 requires random_access_iterator<_It>
2935 {
return basic_const_iterator(__i._M_current + __n); }
2937 friend constexpr basic_const_iterator
2938 operator-(
const basic_const_iterator& __i, difference_type __n)
2939 noexcept(
noexcept(basic_const_iterator(__i._M_current - __n)))
2940 requires random_access_iterator<_It>
2941 {
return basic_const_iterator(__i._M_current - __n); }
2943 template<sized_sentinel_for<_It> _Sent>
2944 constexpr difference_type
2946 noexcept(
noexcept(_M_current - __y))
2947 {
return _M_current - __y; }
2949 template<__detail::__not_a_const_iterator _Sent, same_as<_It> _It2>
2950 requires sized_sentinel_for<_Sent, _It>
2951 friend constexpr difference_type
2952 operator-(
const _Sent& __x,
const basic_const_iterator<_It2>& __y)
2953 noexcept(
noexcept(__x - __y._M_current))
2954 {
return __x - __y._M_current; }
2956 friend constexpr __rvalue_reference
2957 iter_move(
const basic_const_iterator& __i)
2958 noexcept(
noexcept(
static_cast<__rvalue_reference
>(ranges::iter_move(__i._M_current))))
2959 {
return static_cast<__rvalue_reference
>(ranges::iter_move(__i._M_current)); }
2962 template<
typename _Tp, common_with<_Tp> _Up>
2963 requires input_iterator<common_type_t<_Tp, _Up>>
2964 struct common_type<basic_const_iterator<_Tp>, _Up>
2965 {
using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2967 template<
typename _Tp, common_with<_Tp> _Up>
2968 requires input_iterator<common_type_t<_Tp, _Up>>
2969 struct common_type<_Up, basic_const_iterator<_Tp>>
2970 {
using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2972 template<
typename _Tp, common_with<_Tp> _Up>
2973 requires input_iterator<common_type_t<_Tp, _Up>>
2974 struct common_type<basic_const_iterator<_Tp>, basic_const_iterator<_Up>>
2975 {
using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2977 template<input_iterator _It>
2978 constexpr const_iterator<_It>
2979 make_const_iterator(_It __it)
2980 noexcept(is_nothrow_convertible_v<_It, const_iterator<_It>>)
2983 template<semiregular _Sent>
2984 constexpr const_sentinel<_Sent>
2985 make_const_sentinel(_Sent __s)
2986 noexcept(is_nothrow_convertible_v<_Sent, const_sentinel<_Sent>>)
2993_GLIBCXX_END_NAMESPACE_VERSION
2998 template<
typename _Iterator,
typename _Sequence,
typename _Category>
3002namespace std _GLIBCXX_VISIBILITY(default)
3004_GLIBCXX_BEGIN_NAMESPACE_VERSION
3009 template<
typename _Iterator,
typename _Container>
3010 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
3011 _GLIBCXX20_CONSTEXPR
3013 __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
3014 _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
3015 {
return __it.base(); }
3018 template<
typename _Iterator>
3019 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
3020 _GLIBCXX20_CONSTEXPR
3022 __niter_base(_Iterator __it)
3023 _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
3028#if __cplusplus < 201103L
3029 template<
typename _Ite,
typename _Seq>
3031 __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq,
3032 std::random_access_iterator_tag>&);
3034 template<
typename _Ite,
typename _Cont,
typename _Seq>
3036 __niter_base(const ::__gnu_debug::_Safe_iterator<
3037 ::__gnu_cxx::__normal_iterator<_Ite, _Cont>, _Seq,
3038 std::random_access_iterator_tag>&);
3040 template<
typename _Ite,
typename _Seq>
3041 _GLIBCXX20_CONSTEXPR
3043 __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq,
3044 std::random_access_iterator_tag>&)
3048#if __cplusplus >= 201103L
3049 template<
typename _Iterator>
3050 _GLIBCXX20_CONSTEXPR
3053 ->
decltype(__make_reverse_iterator(__niter_base(__it.base())))
3054 {
return __make_reverse_iterator(__niter_base(__it.base())); }
3056 template<
typename _Iterator>
3057 _GLIBCXX20_CONSTEXPR
3060 ->
decltype(make_move_iterator(__niter_base(__it.base())))
3061 {
return make_move_iterator(__niter_base(__it.base())); }
3063 template<
typename _Iterator>
3064 _GLIBCXX20_CONSTEXPR
3067 ->
decltype(__make_reverse_iterator(__miter_base(__it.base())))
3068 {
return __make_reverse_iterator(__miter_base(__it.base())); }
3070 template<
typename _Iterator>
3071 _GLIBCXX20_CONSTEXPR
3074 ->
decltype(__miter_base(__it.base()))
3075 {
return __miter_base(__it.base()); }
3082 template<
typename _From,
typename _To>
3084 _GLIBCXX20_CONSTEXPR
3086 __niter_wrap(_From __from, _To __res)
3087 {
return __from + (std::__niter_base(__res) - std::__niter_base(__from)); }
3090 template<
typename _Iterator>
3091 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
3092 _GLIBCXX20_CONSTEXPR
3094 __niter_wrap(
const _Iterator&, _Iterator __res)
3099#if __cpp_deduction_guides >= 201606
3105 template<
typename _InputIterator>
3106 using __iter_key_t = __remove_cvref_t<
3107#ifdef __glibcxx_tuple_like
3108 tuple_element_t<0, typename iterator_traits<_InputIterator>::value_type>>;
3113 template<
typename _InputIterator>
3114 using __iter_val_t = __remove_cvref_t<
3115#ifdef __glibcxx_tuple_like
3116 tuple_element_t<1, typename iterator_traits<_InputIterator>::value_type>>;
3121 template<
typename _T1,
typename _T2>
3124 template<
typename _InputIterator>
3125 using __iter_to_alloc_t
3129_GLIBCXX_END_NAMESPACE_VERSION
3132#ifdef _GLIBCXX_DEBUG
constexpr bool operator<=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename common_reference< _Tp... >::type common_reference_t
typename add_pointer< _Tp >::type add_pointer_t
Alias template for add_pointer.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr reverse_iterator< _Iterator > make_reverse_iterator(_Iterator __i)
Generator function for reverse_iterator.
constexpr insert_iterator< _Container > inserter(_Container &__x, std::__detail::__range_iter_t< _Container > __i)
constexpr front_insert_iterator< _Container > front_inserter(_Container &__x)
constexpr back_insert_iterator< _Container > back_inserter(_Container &__x)
ISO C++ entities toplevel namespace is std.
typename __detail::__cmp3way_res_impl< _Tp, _Up >::type compare_three_way_result_t
[cmp.result], result of three-way comparison
Implementation details not part of the namespace std interface.
GNU extensions for public use.
GNU debug classes for public use.
is_nothrow_copy_constructible
constexpr reverse_iterator & operator-=(difference_type __n)
constexpr reverse_iterator & operator+=(difference_type __n)
constexpr reverse_iterator operator+(difference_type __n) const
constexpr iterator_type base() const noexcept(/*conditional */)
constexpr reference operator[](difference_type __n) const
constexpr reverse_iterator & operator--()
constexpr pointer operator->() const
constexpr reference operator*() const
constexpr reverse_iterator operator-(difference_type __n) const
constexpr reverse_iterator & operator++()
Turns assignment into insertion.
constexpr back_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.
constexpr back_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
constexpr back_insert_iterator & operator=(const typename _Container::value_type &__value)
constexpr back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
constexpr 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.
constexpr front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not move.)
constexpr front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
constexpr front_insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
constexpr front_insert_iterator & operator*()
Simply returns *this.
constexpr front_insert_iterator & operator=(const typename _Container::value_type &__value)
Turns assignment into insertion.
constexpr insert_iterator & operator++(int)
Simply returns *this. (This iterator does not move.)
constexpr insert_iterator & operator*()
Simply returns *this.
_Container container_type
A nested typedef for the type of whatever container you used.
constexpr insert_iterator & operator=(const typename _Container::value_type &__value)
constexpr insert_iterator & operator++()
Simply returns *this. (This iterator does not move.)
constexpr insert_iterator(_Container &__x, _Iter __i)
A sentinel adaptor for use with std::move_iterator.
An iterator adaptor that yields an rvalue reference.
An iterator/sentinel adaptor for representing a non-common range.
An iterator adaptor that keeps track of the distance to the end.
Struct holding two objects of arbitrary type.
Forward iterators support a superset of input iterator operations.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Traits class for iterators.