59#ifndef _STL_ITERATOR_BASE_FUNCS_H
60#define _STL_ITERATOR_BASE_FUNCS_H 1
63#pragma GCC system_header
71namespace std _GLIBCXX_VISIBILITY(default)
73_GLIBCXX_BEGIN_NAMESPACE_VERSION
75_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
79_GLIBCXX_END_NAMESPACE_CONTAINER
81 template<
typename _InputIterator>
82 inline _GLIBCXX14_CONSTEXPR
84 __distance(_InputIterator __first, _InputIterator __last,
88 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
91 while (__first != __last)
99 template<
typename _RandomAccessIterator>
100 __attribute__((__always_inline__))
101 inline _GLIBCXX14_CONSTEXPR
103 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
107 __glibcxx_function_requires(_RandomAccessIteratorConcept<
108 _RandomAccessIterator>)
109 return __last - __first;
112#if _GLIBCXX_USE_CXX11_ABI
114 template<
typename _Tp>
116 __distance(_GLIBCXX_STD_C::_List_iterator<_Tp>,
117 _GLIBCXX_STD_C::_List_iterator<_Tp>,
120 template<
typename _Tp>
122 __distance(_GLIBCXX_STD_C::_List_const_iterator<_Tp>,
123 _GLIBCXX_STD_C::_List_const_iterator<_Tp>,
127#if __cplusplus >= 201103L
129 template<
typename _OutputIterator>
134#ifdef __glibcxx_concepts
141 template<
typename _Iter>
142 concept __iter_category_converts_to_concept
143 = convertible_to<typename __iter_traits<_Iter>::iterator_category,
144 typename __iter_traits<_Iter>::iterator_concept>;
150 template<
typename _Iter>
151 concept __promotable_iterator
152 = input_iterator<_Iter>
153 &&
requires {
typename __iter_traits<_Iter>::iterator_concept; }
154 && ! __iter_category_converts_to_concept<_Iter>;
174 template<
typename _InputIterator>
175 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
176 inline _GLIBCXX17_CONSTEXPR
178 distance(_InputIterator __first, _InputIterator __last)
180#ifdef __glibcxx_concepts
188 if constexpr (__detail::__promotable_iterator<_InputIterator>)
190 if constexpr (random_access_iterator<_InputIterator>)
191 return __last - __first;
199 return std::__distance(__first, __last,
200 std::__iterator_category(__first));
205 template<
typename _InputIterator,
typename _Distance>
206 inline _GLIBCXX14_CONSTEXPR
void
207 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
210 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
211 __glibcxx_assert(__n >= 0);
216 template<
typename _B
idirectionalIterator,
typename _Distance>
217 inline _GLIBCXX14_CONSTEXPR
void
218 __advance(_BidirectionalIterator& __i, _Distance __n,
222 __glibcxx_function_requires(_BidirectionalIteratorConcept<
223 _BidirectionalIterator>)
232 template<typename _RandomAccessIterator, typename _Distance>
233 inline _GLIBCXX14_CONSTEXPR
void
234 __advance(_RandomAccessIterator& __i, _Distance __n,
238 __glibcxx_function_requires(_RandomAccessIteratorConcept<
239 _RandomAccessIterator>)
240 if (__builtin_constant_p(__n) && __n == 1)
242 else if (__builtin_constant_p(__n) && __n == -1)
248#if __cplusplus >= 201103L
250 template<
typename _OutputIterator,
typename _Distance>
268 template<
typename _InputIterator,
typename _Distance>
269 __attribute__((__always_inline__))
270 inline _GLIBCXX17_CONSTEXPR
void
273#ifdef __glibcxx_concepts
280 if constexpr (__detail::__promotable_iterator<_InputIterator>
281 && ranges::__detail::__is_integer_like<_Distance>)
283 auto __d =
static_cast<iter_difference_t<_InputIterator>
>(__n);
284 if constexpr (random_access_iterator<_InputIterator>)
286 else if constexpr (bidirectional_iterator<_InputIterator>)
296 std::__advance(__i, __d, std::__iterator_category(__i));
300#if __cplusplus >= 201103L
302 template<
typename _InputIterator>
303 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
304 inline _GLIBCXX17_CONSTEXPR _InputIterator
305 next(_InputIterator __x,
typename
306 iterator_traits<_InputIterator>::difference_type __n = 1)
309 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
314 template<
typename _B
idirectionalIterator>
315 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
316 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
317 prev(_BidirectionalIterator __x,
typename
321 __glibcxx_function_requires(_BidirectionalIteratorConcept<
322 _BidirectionalIterator>)
330#if __glibcxx_algorithm_iterator_requirements
331 template<
typename _Iter>
333 __iter_concept_or_category()
335 if constexpr (__detail::__promotable_iterator<_Iter>)
337 using __type = __detail::__iter_traits<_Iter>::iterator_concept;
347 template<
typename _Iter>
348 __attribute__((__always_inline__))
350 __iter_concept_or_category(
const _Iter&)
351 {
return std::__iter_concept_or_category<_Iter>(); }
353 template<
typename _Iter>
354 __attribute__((__always_inline__))
355 inline _GLIBCXX_CONSTEXPR
357 __iter_concept_or_category()
360 template<
typename _Iter>
361 __attribute__((__always_inline__))
362 inline _GLIBCXX_CONSTEXPR
364 __iter_concept_or_category(
const _Iter&)
370 template<
typename _Iter,
371 typename _Cat = __decltype(__iter_concept_or_category<_Iter>())>
372 struct __is_any_random_access_iter
373#if __cplusplus >= 201103L
380#if __cplusplus >= 202002L
381#define _GLIBCXX_ITER_MOVE(__it) \
382 std::iter_value_t<decltype(__it)>(std::ranges::iter_move(__it))
384#define _GLIBCXX_ITER_MOVE(__it) _GLIBCXX_MOVE(*__it)
393 template<
typename _Iter,
typename _Fn>
394#if __cplusplus >= 201103L
396 __enable_if_t<__enable_for_each_segment<_Iter>, _Iter>
400 __for_each_segment(_Iter __first, _Iter __last, _Fn __func)
402 return _Iter::_S_for_each_segment(_GLIBCXX_MOVE(__first),
403 _GLIBCXX_MOVE(__last),
404 _GLIBCXX_MOVE(__func));
409_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