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>
258 template<
typename _InputIterator,
typename _Distance>
259 __attribute__((__always_inline__))
260 inline _GLIBCXX17_CONSTEXPR
void
263#ifdef __glibcxx_concepts
270 if constexpr (__detail::__promotable_iterator<_InputIterator>
271 && ranges::__detail::__is_integer_like<_Distance>)
273 auto __d =
static_cast<iter_difference_t<_InputIterator>
>(__n);
274 if constexpr (random_access_iterator<_InputIterator>)
276 else if constexpr (bidirectional_iterator<_InputIterator>)
290#if __cplusplus >= 201103L
292 template<
typename _InputIterator>
293 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
294 inline _GLIBCXX17_CONSTEXPR _InputIterator
295 next(_InputIterator __x,
typename
296 iterator_traits<_InputIterator>::difference_type __n = 1)
299 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
304 template<
typename _B
idirectionalIterator>
305 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
306 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
307 prev(_BidirectionalIterator __x,
typename
311 __glibcxx_function_requires(_BidirectionalIteratorConcept<
312 _BidirectionalIterator>)
319#if __glibcxx_algorithm_iterator_requirements
320 template<
typename _Iter>
322 __iter_concept_or_category()
324 if constexpr (__detail::__promotable_iterator<_Iter>)
326 using __type = __detail::__iter_traits<_Iter>::iterator_concept;
336 template<
typename _Iter>
337 __attribute__((__always_inline__))
339 __iter_concept_or_category(
const _Iter&)
340 {
return std::__iter_concept_or_category<_Iter>(); }
342 template<
typename _Iter>
343 __attribute__((__always_inline__))
344 inline _GLIBCXX_CONSTEXPR
346 __iter_concept_or_category()
349 template<
typename _Iter>
350 __attribute__((__always_inline__))
351 inline _GLIBCXX_CONSTEXPR
353 __iter_concept_or_category(
const _Iter&)
359 template<
typename _Iter,
360 typename _Cat = __decltype(__iter_concept_or_category<_Iter>())>
361 struct __is_any_random_access_iter
362#if __cplusplus >= 201103L
369#if __cplusplus >= 202002L
370#define _GLIBCXX_ITER_MOVE(__it) \
371 std::iter_value_t<decltype(__it)>(std::ranges::iter_move(__it))
373#define _GLIBCXX_ITER_MOVE(__it) _GLIBCXX_MOVE(*__it)
376_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