59#ifndef _STL_ITERATOR_BASE_FUNCS_H
60#define _STL_ITERATOR_BASE_FUNCS_H 1
62#pragma GCC system_header
68namespace std _GLIBCXX_VISIBILITY(default)
70_GLIBCXX_BEGIN_NAMESPACE_VERSION
72_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
74 template <
typename>
struct _List_iterator;
75 template <
typename>
struct _List_const_iterator;
76_GLIBCXX_END_NAMESPACE_CONTAINER
78 template<
typename _InputIterator>
79 inline _GLIBCXX14_CONSTEXPR
80 typename iterator_traits<_InputIterator>::difference_type
81 __distance(_InputIterator __first, _InputIterator __last,
85 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
87 typename iterator_traits<_InputIterator>::difference_type __n = 0;
88 while (__first != __last)
96 template<
typename _RandomAccessIterator>
97 __attribute__((__always_inline__))
98 inline _GLIBCXX14_CONSTEXPR
99 typename iterator_traits<_RandomAccessIterator>::difference_type
100 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
101 random_access_iterator_tag)
104 __glibcxx_function_requires(_RandomAccessIteratorConcept<
105 _RandomAccessIterator>)
106 return __last - __first;
109#if _GLIBCXX_USE_CXX11_ABI
111 template<
typename _Tp>
113 __distance(_GLIBCXX_STD_C::_List_iterator<_Tp>,
114 _GLIBCXX_STD_C::_List_iterator<_Tp>,
117 template<
typename _Tp>
119 __distance(_GLIBCXX_STD_C::_List_const_iterator<_Tp>,
120 _GLIBCXX_STD_C::_List_const_iterator<_Tp>,
124#if __cplusplus >= 201103L
126 template<
typename _OutputIterator>
128 __distance(_OutputIterator, _OutputIterator, output_iterator_tag) =
delete;
144 template<
typename _InputIterator>
145 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
146 inline _GLIBCXX17_CONSTEXPR
147 typename iterator_traits<_InputIterator>::difference_type
148 distance(_InputIterator __first, _InputIterator __last)
151 return std::__distance(__first, __last,
155 template<
typename _InputIterator,
typename _Distance>
156 inline _GLIBCXX14_CONSTEXPR
void
157 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
160 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
161 __glibcxx_assert(__n >= 0);
166 template<
typename _B
idirectionalIterator,
typename _Distance>
167 inline _GLIBCXX14_CONSTEXPR
void
168 __advance(_BidirectionalIterator& __i, _Distance __n,
169 bidirectional_iterator_tag)
172 __glibcxx_function_requires(_BidirectionalIteratorConcept<
173 _BidirectionalIterator>)
182 template<typename _RandomAccessIterator, typename _Distance>
183 inline _GLIBCXX14_CONSTEXPR
void
184 __advance(_RandomAccessIterator& __i, _Distance __n,
185 random_access_iterator_tag)
188 __glibcxx_function_requires(_RandomAccessIteratorConcept<
189 _RandomAccessIterator>)
190 if (__builtin_constant_p(__n) && __n == 1)
192 else if (__builtin_constant_p(__n) && __n == -1)
198#if __cplusplus >= 201103L
200 template<
typename _OutputIterator,
typename _Distance>
202 __advance(_OutputIterator&, _Distance, output_iterator_tag) =
delete;
217 template<
typename _InputIterator,
typename _Distance>
218 __attribute__((__always_inline__))
219 inline _GLIBCXX17_CONSTEXPR
void
227#if __cplusplus >= 201103L
229 template<
typename _InputIterator>
230 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
231 inline _GLIBCXX17_CONSTEXPR _InputIterator
232 next(_InputIterator __x,
typename
233 iterator_traits<_InputIterator>::difference_type __n = 1)
236 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
241 template<
typename _B
idirectionalIterator>
242 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
243 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
244 prev(_BidirectionalIterator __x,
typename
245 iterator_traits<_BidirectionalIterator>::difference_type __n = 1)
248 __glibcxx_function_requires(_BidirectionalIteratorConcept<
249 _BidirectionalIterator>)
256_GLIBCXX_END_NAMESPACE_VERSION
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.
Traits class for iterators.