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
76 template <
typename>
struct _List_iterator;
77 template <
typename>
struct _List_const_iterator;
78_GLIBCXX_END_NAMESPACE_CONTAINER
80 template<
typename _InputIterator>
81 inline _GLIBCXX14_CONSTEXPR
82 typename iterator_traits<_InputIterator>::difference_type
83 __distance(_InputIterator __first, _InputIterator __last,
87 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
89 typename iterator_traits<_InputIterator>::difference_type __n = 0;
90 while (__first != __last)
98 template<
typename _RandomAccessIterator>
99 __attribute__((__always_inline__))
100 inline _GLIBCXX14_CONSTEXPR
101 typename iterator_traits<_RandomAccessIterator>::difference_type
102 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
103 random_access_iterator_tag)
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>
130 __distance(_OutputIterator, _OutputIterator, output_iterator_tag) =
delete;
146 template<
typename _InputIterator>
147 _GLIBCXX_NODISCARD __attribute__((__always_inline__))
148 inline _GLIBCXX17_CONSTEXPR
149 typename iterator_traits<_InputIterator>::difference_type
150 distance(_InputIterator __first, _InputIterator __last)
153 return std::__distance(__first, __last,
157 template<
typename _InputIterator,
typename _Distance>
158 inline _GLIBCXX14_CONSTEXPR
void
159 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
162 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
163 __glibcxx_assert(__n >= 0);
168 template<
typename _B
idirectionalIterator,
typename _Distance>
169 inline _GLIBCXX14_CONSTEXPR
void
170 __advance(_BidirectionalIterator& __i, _Distance __n,
171 bidirectional_iterator_tag)
174 __glibcxx_function_requires(_BidirectionalIteratorConcept<
175 _BidirectionalIterator>)
184 template<typename _RandomAccessIterator, typename _Distance>
185 inline _GLIBCXX14_CONSTEXPR
void
186 __advance(_RandomAccessIterator& __i, _Distance __n,
187 random_access_iterator_tag)
190 __glibcxx_function_requires(_RandomAccessIteratorConcept<
191 _RandomAccessIterator>)
192 if (__builtin_constant_p(__n) && __n == 1)
194 else if (__builtin_constant_p(__n) && __n == -1)
200#if __cplusplus >= 201103L
202 template<
typename _OutputIterator,
typename _Distance>
204 __advance(_OutputIterator&, _Distance, output_iterator_tag) =
delete;
219 template<
typename _InputIterator,
typename _Distance>
220 __attribute__((__always_inline__))
221 inline _GLIBCXX17_CONSTEXPR
void
229#if __cplusplus >= 201103L
231 template<
typename _InputIterator>
232 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
233 inline _GLIBCXX17_CONSTEXPR _InputIterator
234 next(_InputIterator __x,
typename
235 iterator_traits<_InputIterator>::difference_type __n = 1)
238 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
243 template<
typename _B
idirectionalIterator>
244 _GLIBCXX_NODISCARD [[__gnu__::__always_inline__]]
245 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
246 prev(_BidirectionalIterator __x,
typename
247 iterator_traits<_BidirectionalIterator>::difference_type __n = 1)
250 __glibcxx_function_requires(_BidirectionalIteratorConcept<
251 _BidirectionalIterator>)
258_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.