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_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.
Marking output iterators.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Traits class for iterators.