59 #ifndef _STL_ITERATOR_BASE_FUNCS_H 60 #define _STL_ITERATOR_BASE_FUNCS_H 1 62 #ifdef _GLIBCXX_SYSHDR 63 #pragma GCC system_header 70 namespace std _GLIBCXX_VISIBILITY(default)
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
74 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
78 _GLIBCXX_END_NAMESPACE_CONTAINER
80 template<
typename _InputIterator>
81 inline _GLIBCXX14_CONSTEXPR
83 __distance(_InputIterator __first, _InputIterator __last,
87 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
90 while (__first != __last)
98 template<
typename _RandomAccessIterator>
99 __attribute__((__always_inline__))
100 inline _GLIBCXX14_CONSTEXPR
102 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
106 __glibcxx_function_requires(_RandomAccessIteratorConcept<
107 _RandomAccessIterator>)
108 return __last - __first;
111 #if _GLIBCXX_USE_CXX11_ABI 113 template<
typename _Tp>
115 __distance(_GLIBCXX_STD_C::_List_iterator<_Tp>,
116 _GLIBCXX_STD_C::_List_iterator<_Tp>,
119 template<
typename _Tp>
121 __distance(_GLIBCXX_STD_C::_List_const_iterator<_Tp>,
122 _GLIBCXX_STD_C::_List_const_iterator<_Tp>,
126 #if __cplusplus >= 201103L 128 template<
typename _OutputIterator>
133 #ifdef __glibcxx_concepts 138 template<
typename _Iter>
139 concept __iter_category_converts_to_concept
140 = convertible_to<typename __iter_traits<_Iter>::iterator_category,
141 typename __iter_traits<_Iter>::iterator_concept>;
147 template<
typename _Iter>
148 concept __promotable_iterator
149 = input_iterator<_Iter>
150 && requires {
typename __iter_traits<_Iter>::iterator_concept; }
151 && ! __iter_category_converts_to_concept<_Iter>;
168 template<
typename _InputIterator>
169 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
170 inline _GLIBCXX17_CONSTEXPR
172 distance(_InputIterator __first, _InputIterator __last)
174 #ifdef __glibcxx_concepts 182 if constexpr (__detail::__promotable_iterator<_InputIterator>)
184 if constexpr (random_access_iterator<_InputIterator>)
185 return __last - __first;
193 return std::__distance(__first, __last,
197 template<
typename _InputIterator,
typename _Distance>
198 inline _GLIBCXX14_CONSTEXPR
void 202 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
203 __glibcxx_assert(__n >= 0);
208 template<
typename _B
idirectionalIterator,
typename _Distance>
209 inline _GLIBCXX14_CONSTEXPR
void 210 __advance(_BidirectionalIterator& __i, _Distance __n,
214 __glibcxx_function_requires(_BidirectionalIteratorConcept<
215 _BidirectionalIterator>)
224 template<
typename _RandomAccessIterator,
typename _Distance>
225 inline _GLIBCXX14_CONSTEXPR
void 226 __advance(_RandomAccessIterator& __i, _Distance __n,
230 __glibcxx_function_requires(_RandomAccessIteratorConcept<
231 _RandomAccessIterator>)
232 if (__builtin_constant_p(__n) && __n == 1)
234 else if (__builtin_constant_p(__n) && __n == -1)
240 #if __cplusplus >= 201103L 242 template<
typename _OutputIterator,
typename _Distance>
259 template<
typename _InputIterator,
typename _Distance>
260 __attribute__((__always_inline__))
261 inline _GLIBCXX17_CONSTEXPR
void 264 #ifdef __glibcxx_concepts 271 if constexpr (__detail::__promotable_iterator<_InputIterator>
272 && ranges::__detail::__is_integer_like<_Distance>)
274 auto __d =
static_cast<iter_difference_t<_InputIterator>
>(__n);
275 if constexpr (random_access_iterator<_InputIterator>)
277 else if constexpr (bidirectional_iterator<_InputIterator>)
291 #if __cplusplus >= 201103L 293 template<
typename _InputIterator>
294 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
295 inline _GLIBCXX17_CONSTEXPR _InputIterator
296 next(_InputIterator __x,
typename 300 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
305 template<
typename _B
idirectionalIterator>
306 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
307 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
308 prev(_BidirectionalIterator __x,
typename 312 __glibcxx_function_requires(_BidirectionalIteratorConcept<
313 _BidirectionalIterator>)
320 #if __glibcxx_algorithm_iterator_requirements // C++ >= 20 321 template<
typename _Iter>
323 __iter_concept_or_category()
325 if constexpr (__detail::__promotable_iterator<_Iter>)
327 using __type = __detail::__iter_traits<_Iter>::iterator_concept;
328 if constexpr (derived_from<__type, random_access_iterator_tag>)
337 template<
typename _Iter>
338 __attribute__((__always_inline__))
340 __iter_concept_or_category(
const _Iter&)
341 {
return std::__iter_concept_or_category<_Iter>(); }
343 template<
typename _Iter>
344 __attribute__((__always_inline__))
345 inline _GLIBCXX_CONSTEXPR
347 __iter_concept_or_category()
350 template<
typename _Iter>
351 __attribute__((__always_inline__))
352 inline _GLIBCXX_CONSTEXPR
354 __iter_concept_or_category(
const _Iter&)
360 template<
typename _Iter,
361 typename _Cat = __decltype(__iter_concept_or_category<_Iter>())>
362 struct __is_any_random_access_iter
363 #if __cplusplus >= 201103L
370 #if __cplusplus >= 202002L 371 #define _GLIBCXX_ITER_MOVE(__it) \ 372 std::iter_value_t<decltype(__it)>(std::ranges::iter_move(__it)) 374 #define _GLIBCXX_ITER_MOVE(__it) _GLIBCXX_MOVE(*__it) 377 _GLIBCXX_END_NAMESPACE_VERSION
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
Random-access iterators support a superset of bidirectional iterator operations.
Marking output iterators.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Bidirectional iterators support a superset of forward iterator operations.
Traits class for iterators.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.