59 #ifndef _STL_ITERATOR_BASE_FUNCS_H
60 #define _STL_ITERATOR_BASE_FUNCS_H 1
62 #pragma GCC system_header
67 namespace std _GLIBCXX_VISIBILITY(default)
69 _GLIBCXX_BEGIN_NAMESPACE_VERSION
71 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
73 template <
typename>
struct _List_iterator;
74 template <
typename>
struct _List_const_iterator;
75 _GLIBCXX_END_NAMESPACE_CONTAINER
77 template<
typename _InputIterator>
78 inline _GLIBCXX14_CONSTEXPR
79 typename iterator_traits<_InputIterator>::difference_type
80 __distance(_InputIterator __first, _InputIterator __last,
84 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
86 typename iterator_traits<_InputIterator>::difference_type __n = 0;
87 while (__first != __last)
95 template<
typename _RandomAccessIterator>
96 inline _GLIBCXX14_CONSTEXPR
97 typename iterator_traits<_RandomAccessIterator>::difference_type
98 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
99 random_access_iterator_tag)
102 __glibcxx_function_requires(_RandomAccessIteratorConcept<
103 _RandomAccessIterator>)
104 return __last - __first;
107 #if _GLIBCXX_USE_CXX11_ABI
109 template<
typename _Tp>
111 __distance(_GLIBCXX_STD_C::_List_iterator<_Tp>,
112 _GLIBCXX_STD_C::_List_iterator<_Tp>,
115 template<
typename _Tp>
117 __distance(_GLIBCXX_STD_C::_List_const_iterator<_Tp>,
118 _GLIBCXX_STD_C::_List_const_iterator<_Tp>,
122 #if __cplusplus >= 201103L
124 template<
typename _OutputIterator>
126 __distance(_OutputIterator, _OutputIterator, output_iterator_tag) =
delete;
142 template<
typename _InputIterator>
144 inline _GLIBCXX17_CONSTEXPR
145 typename iterator_traits<_InputIterator>::difference_type
146 distance(_InputIterator __first, _InputIterator __last)
149 return std::__distance(__first, __last,
153 template<
typename _InputIterator,
typename _Distance>
154 inline _GLIBCXX14_CONSTEXPR
void
155 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
158 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
159 __glibcxx_assert(__n >= 0);
164 template<
typename _B
idirectionalIterator,
typename _Distance>
165 inline _GLIBCXX14_CONSTEXPR
void
166 __advance(_BidirectionalIterator& __i, _Distance __n,
167 bidirectional_iterator_tag)
170 __glibcxx_function_requires(_BidirectionalIteratorConcept<
171 _BidirectionalIterator>)
180 template<typename _RandomAccessIterator, typename _Distance>
181 inline _GLIBCXX14_CONSTEXPR
void
182 __advance(_RandomAccessIterator& __i, _Distance __n,
183 random_access_iterator_tag)
186 __glibcxx_function_requires(_RandomAccessIteratorConcept<
187 _RandomAccessIterator>)
188 if (__builtin_constant_p(__n) && __n == 1)
190 else if (__builtin_constant_p(__n) && __n == -1)
196 #if __cplusplus >= 201103L
198 template<
typename _OutputIterator,
typename _Distance>
200 __advance(_OutputIterator&, _Distance, output_iterator_tag) =
delete;
215 template<
typename _InputIterator,
typename _Distance>
216 inline _GLIBCXX17_CONSTEXPR
void
224 #if __cplusplus >= 201103L
226 template<
typename _InputIterator>
228 inline _GLIBCXX17_CONSTEXPR _InputIterator
229 next(_InputIterator __x,
typename
230 iterator_traits<_InputIterator>::difference_type __n = 1)
233 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
238 template<
typename _B
idirectionalIterator>
240 inline _GLIBCXX17_CONSTEXPR _BidirectionalIterator
241 prev(_BidirectionalIterator __x,
typename
242 iterator_traits<_BidirectionalIterator>::difference_type __n = 1)
245 __glibcxx_function_requires(_BidirectionalIteratorConcept<
246 _BidirectionalIterator>)
253 _GLIBCXX_END_NAMESPACE_VERSION