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
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
199 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
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
297 iterator_traits<_InputIterator>::difference_type __n = 1)
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
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;
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 std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
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