59 #ifndef _STL_ITERATOR_BASE_TYPES_H
60 #define _STL_ITERATOR_BASE_TYPES_H 1
62 #pragma GCC system_header
66 #if __cplusplus >= 201103L
67 # include <type_traits>
70 namespace std _GLIBCXX_VISIBILITY(default)
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
116 template<
typename _Category,
typename _Tp,
typename _Distance = ptrdiff_t,
117 typename _Pointer = _Tp*,
typename _Reference = _Tp&>
140 #if __cplusplus >= 201103L
142 _GLIBCXX_HAS_NESTED_TYPE(iterator_category)
144 template<typename _Iterator,
145 bool = __has_iterator_category<_Iterator>::value>
146 struct __iterator_traits { };
148 template<
typename _Iterator>
149 struct __iterator_traits<_Iterator, true>
151 typedef typename _Iterator::iterator_category iterator_category;
152 typedef typename _Iterator::value_type value_type;
153 typedef typename _Iterator::difference_type difference_type;
154 typedef typename _Iterator::pointer pointer;
155 typedef typename _Iterator::reference reference;
158 template<
typename _Iterator>
159 struct iterator_traits
160 :
public __iterator_traits<_Iterator> { };
162 template<
typename _Iterator>
163 struct iterator_traits
165 typedef typename _Iterator::iterator_category iterator_category;
166 typedef typename _Iterator::value_type value_type;
167 typedef typename _Iterator::difference_type difference_type;
168 typedef typename _Iterator::pointer pointer;
169 typedef typename _Iterator::reference reference;
174 template<
typename _Tp>
175 struct iterator_traits<_Tp*>
178 typedef _Tp value_type;
179 typedef ptrdiff_t difference_type;
180 typedef _Tp* pointer;
181 typedef _Tp& reference;
185 template<
typename _Tp>
186 struct iterator_traits<const _Tp*>
189 typedef _Tp value_type;
190 typedef ptrdiff_t difference_type;
191 typedef const _Tp* pointer;
192 typedef const _Tp& reference;
199 template<
typename _Iter>
200 inline typename iterator_traits<_Iter>::iterator_category
202 {
return typename iterator_traits<_Iter>::iterator_category(); }
208 template<
typename _Iterator,
bool _HasBase>
211 typedef _Iterator iterator_type;
212 static iterator_type _S_base(_Iterator __it)
216 template<
typename _Iterator>
217 struct _Iter_base<_Iterator, true>
219 typedef typename _Iterator::iterator_type iterator_type;
220 static iterator_type _S_base(_Iterator __it)
221 {
return __it.base(); }
224 #if __cplusplus >= 201103L
225 template<
typename _InIter>
226 using _RequireInputIter =
typename
227 enable_if<is_convertible<
typename
228 iterator_traits<_InIter>::iterator_category,
229 input_iterator_tag>::value>::type;
232 _GLIBCXX_END_NAMESPACE_VERSION
_Pointer pointer
This type represents a pointer-to-value_type.
_Distance difference_type
Distance between iterators is represented as this type.
Forward iterators support a superset of input iterator operations.
ISO C++ entities toplevel namespace is std.
_Reference reference
This type represents a reference-to-value_type.
_Tp value_type
The type "pointed to" by the iterator.
Bidirectional iterators support a superset of forward iterator operations.
iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
Marking output iterators.
Random-access iterators support a superset of bidirectional iterator operations.
_Category iterator_category
One of the tag types.