59#ifndef _STL_ITERATOR_BASE_TYPES_H
60#define _STL_ITERATOR_BASE_TYPES_H 1
63#pragma GCC system_header
68#if __cplusplus >= 201103L
74#if __cplusplus > 201703L && __cpp_concepts >= 201907L
78namespace std _GLIBCXX_VISIBILITY(default)
80_GLIBCXX_BEGIN_NAMESPACE_VERSION
113#if __cplusplus > 201703L
132 template<
typename _Category,
typename _Tp,
typename _Distance = ptrdiff_t,
133 typename _Pointer = _Tp*,
typename _Reference = _Tp&>
156 template<
typename _Iterator>
159#if __cplusplus >= 201103L
162 template<
typename _Iterator,
typename = __
void_t<>>
163 struct __iterator_traits { };
165#if ! __cpp_lib_concepts
167 template<
typename _Iterator>
168 struct __iterator_traits<_Iterator,
169 __void_t<typename _Iterator::iterator_category,
170 typename _Iterator::value_type,
171 typename _Iterator::difference_type,
172 typename _Iterator::pointer,
173 typename _Iterator::reference>>
175 typedef typename _Iterator::iterator_category iterator_category;
176 typedef typename _Iterator::value_type value_type;
177 typedef typename _Iterator::difference_type difference_type;
178 typedef typename _Iterator::pointer pointer;
179 typedef typename _Iterator::reference reference;
183 template<
typename _Iterator>
185 :
public __iterator_traits<_Iterator> { };
188 template<
typename _Iterator>
191 typedef typename _Iterator::iterator_category iterator_category;
192 typedef typename _Iterator::value_type
value_type;
194 typedef typename _Iterator::pointer pointer;
195 typedef typename _Iterator::reference reference;
199#if __cplusplus > 201703L
201 template<
typename _Tp>
202#if __cpp_concepts >= 201907L
203 requires is_object_v<_Tp>
209 using value_type = remove_cv_t<_Tp>;
210 using difference_type = ptrdiff_t;
211 using pointer = _Tp*;
212 using reference = _Tp&;
216 template<
typename _Tp>
222 typedef _Tp* pointer;
223 typedef _Tp& reference;
227 template<
typename _Tp>
228 struct iterator_traits<const _Tp*>
230 typedef random_access_iterator_tag iterator_category;
231 typedef _Tp value_type;
232 typedef ptrdiff_t difference_type;
233 typedef const _Tp* pointer;
234 typedef const _Tp& reference;
243 template<
typename _Iter>
244 __attribute__((__always_inline__))
245 inline _GLIBCXX_CONSTEXPR
247 __iterator_category(
const _Iter&)
250#if __cplusplus >= 201103L
251 template<
typename _Iter>
252 using __iter_category_t
255 template<
typename _InIter>
256 using _RequireInputIter =
257 __enable_if_t<is_convertible<__iter_category_t<_InIter>,
261 template<
typename _InIter>
262 concept __has_input_iter_cat
265#ifdef __cpp_lib_concepts
267 template<
typename _InIterator>
268 concept __any_input_iterator
269 = input_iterator<_InIterator> || __has_input_iter_cat<_InIterator>;
273 template<
typename _It,
274 typename _Cat = __iter_category_t<_It>>
275 struct __is_random_access_iter
276 :
is_base_of<random_access_iterator_tag, _Cat>
278 typedef is_base_of<random_access_iterator_tag, _Cat> _Base;
279 enum { __value = _Base::value };
282 template<
typename _It,
typename _Traits = iterator_traits<_It>,
283 typename _Cat =
typename _Traits::iterator_category>
284 struct __is_random_access_iter
285 {
enum { __value = __is_base_of(random_access_iterator_tag, _Cat) }; };
288#pragma GCC diagnostic push
289#pragma GCC diagnostic ignored "-Wc++14-extensions"
290 template<
typename _Iter,
typename =
void>
291 const bool __enable_for_each_segment =
false;
293 template<
typename _Iter>
294 const bool __enable_for_each_segment<_Iter,
295#if __cplusplus >= 201103L
296 __enable_if_t<_Iter::_S_enable_for_each_segment>
298 typename __gnu_cxx::__enable_if<_Iter::_S_enable_for_each_segment, void>::__type
301#pragma GCC diagnostic pop
303#if __cpp_lib_concepts
304 template<
typename _Iter>
305 concept __segmented_iterator = __enable_for_each_segment<_Iter>;
311_GLIBCXX_END_NAMESPACE_VERSION
314#if __glibcxx_algorithm_default_value_type
315# define _GLIBCXX26_DEF_VAL_T(T) = T
316# define _GLIBCXX26_ALGO_DEF_VAL_T(_Iterator) \
317 = typename iterator_traits<_Iterator>::value_type
319# define _GLIBCXX26_DEF_VAL_T(T)
320# define _GLIBCXX26_ALGO_DEF_VAL_T(_Iterator)
ISO C++ entities toplevel namespace is std.
Traits class for iterators.
Marking output iterators.
Forward iterators support a superset of input iterator operations.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Contiguous iterators point to objects stored contiguously in memory.
_Category iterator_category
One of the tag types.
_Pointer pointer
This type represents a pointer-to-value_type.
_Distance difference_type
Distance between iterators is represented as this type.
_Reference reference
This type represents a reference-to-value_type.
_Tp value_type
The type "pointed to" by the iterator.