59#ifndef _STL_ITERATOR_BASE_FUNCS_H
60#define _STL_ITERATOR_BASE_FUNCS_H 1
63#pragma GCC system_header
70namespace 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
140 template<
typename _Iter>
141 concept __iter_category_converts_to_concept
142 = convertible_to<typename __iter_traits<_Iter>::iterator_category,
143 typename __iter_traits<_Iter>::iterator_concept>;
149 template<
typename _Iter>
150 concept __promotable_iterator
151 = input_iterator<_Iter>
152 &&
requires {
typename __iter_traits<_Iter>::iterator_concept; }
153 && ! __iter_category_converts_to_concept<_Iter>;
173 template<
typename _InputIterator>
174 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
175 inline _GLIBCXX17_CONSTEXPR
177 distance(_InputIterator __first, _InputIterator __last)
179#ifdef __glibcxx_concepts
187 if constexpr (__detail::__promotable_iterator<_InputIterator>)
189 if constexpr (random_access_iterator<_InputIterator>)
190 return __last - __first;
198 return std::__distance(__first, __last,
199 std::__iterator_category(__first));
204 template<
typename _InputIterator,
typename _Distance>
205 inline _GLIBCXX14_CONSTEXPR
void
206 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
209 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
210 __glibcxx_assert(__n >= 0);
215 template<
typename _B
idirectionalIterator,
typename _Distance>
216 inline _GLIBCXX14_CONSTEXPR
void
217 __advance(_BidirectionalIterator& __i, _Distance __n,
221 __glibcxx_function_requires(_BidirectionalIteratorConcept<
222 _BidirectionalIterator>)
231 template<typename _RandomAccessIterator, typename _Distance>
232 inline _GLIBCXX14_CONSTEXPR
void
233 __advance(_RandomAccessIterator& __i, _Distance __n,
237 __glibcxx_function_requires(_RandomAccessIteratorConcept<
238 _RandomAccessIterator>)
239 if (__builtin_constant_p(__n) && __n == 1)
241 else if (__builtin_constant_p(__n) && __n == -1)
247#if __cplusplus >= 201103L
249 template<
typename _OutputIterator,
typename _Distance>
267 template<
typename _InputIterator,
typename _Distance>
268 __attribute__((__always_inline__))
269 inline _GLIBCXX17_CONSTEXPR
void
272#ifdef __glibcxx_concepts
279 if constexpr (__detail::__promotable_iterator<_InputIterator>
280 && ranges::__detail::__is_integer_like<_Distance>)
282 auto __d =
static_cast<iter_difference_t<_InputIterator>
>(__n);
283 if constexpr (random_access_iterator<_InputIterator>)
285 else if constexpr (bidirectional_iterator<_InputIterator>)
295 std::__advance(__i, __d, std::__iterator_category(__i));
299#if __cplusplus >= 201103L
301 template<
typename _InputIterator>
302 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
303 inline _GLIBCXX17_CONSTEXPR _InputIterator
304 next(_InputIterator __x,
typename
305 iterator_traits<_InputIterator>::difference_type __n = 1)
308 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
313 template<
typename _B
idirectionalIterator>
314 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
315 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
316 prev(_BidirectionalIterator __x,
typename
320 __glibcxx_function_requires(_BidirectionalIteratorConcept<
321 _BidirectionalIterator>)
329#if __glibcxx_algorithm_iterator_requirements
330 template<
typename _Iter>
332 __iter_concept_or_category()
334 if constexpr (__detail::__promotable_iterator<_Iter>)
336 using __type = __detail::__iter_traits<_Iter>::iterator_concept;
346 template<
typename _Iter>
347 __attribute__((__always_inline__))
349 __iter_concept_or_category(
const _Iter&)
350 {
return std::__iter_concept_or_category<_Iter>(); }
352 template<
typename _Iter>
353 __attribute__((__always_inline__))
354 inline _GLIBCXX_CONSTEXPR
356 __iter_concept_or_category()
359 template<
typename _Iter>
360 __attribute__((__always_inline__))
361 inline _GLIBCXX_CONSTEXPR
363 __iter_concept_or_category(
const _Iter&)
369 template<
typename _Iter,
370 typename _Cat = __decltype(__iter_concept_or_category<_Iter>())>
371 struct __is_any_random_access_iter
372#if __cplusplus >= 201103L
379#if __cplusplus >= 202002L
380#define _GLIBCXX_ITER_MOVE(__it) \
381 std::iter_value_t<decltype(__it)>(std::ranges::iter_move(__it))
383#define _GLIBCXX_ITER_MOVE(__it) _GLIBCXX_MOVE(*__it)
388_GLIBCXX_END_NAMESPACE_VERSION
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
Implementation details not part of the namespace std interface.
Traits class for iterators.
Marking output iterators.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
[concept.derived], concept derived_from