37 #ifndef EASTL_ITERATOR_H 38 #define EASTL_ITERATOR_H 41 #include <stk_util/util/config_eastl.h> 44 #pragma warning(push, 0) 56 #if EASTL_STD_ITERATOR_CATEGORY_ENABLED 58 #pragma warning(push, 0) 68 #pragma warning(push) // VC++ generates a bogus warning that you cannot code away. 69 #pragma warning(disable: 4619) // There is no warning number 'number'. 70 #pragma warning(disable: 4217) // Member template functions cannot be used for copy-assignment or copy-construction. 71 #elif defined(__SNC__) 72 #pragma control %push diag 73 #pragma diag_suppress=187 // Pointless comparison of unsigned integer with zero 108 #if !EASTL_STD_ITERATOR_CATEGORY_ENABLED // If we are to use our own iterator category definitions... 109 struct input_iterator_tag { };
110 struct output_iterator_tag { };
111 struct forward_iterator_tag :
public input_iterator_tag { };
112 struct bidirectional_iterator_tag :
public forward_iterator_tag { };
113 struct random_access_iterator_tag :
public bidirectional_iterator_tag { };
114 struct contiguous_iterator_tag :
public random_access_iterator_tag { };
119 template <
typename Category,
typename T,
typename Distance = ptrdiff_t,
120 typename Pointer = T*,
typename Reference = T&>
123 typedef Category iterator_category;
124 typedef T value_type;
125 typedef Distance difference_type;
126 typedef Pointer pointer;
127 typedef Reference reference;
132 template <
typename Iterator>
133 struct iterator_traits
135 typedef typename Iterator::iterator_category iterator_category;
136 typedef typename Iterator::value_type value_type;
137 typedef typename Iterator::difference_type difference_type;
138 typedef typename Iterator::pointer pointer;
139 typedef typename Iterator::reference reference;
142 template <
typename T>
143 struct iterator_traits<T*>
145 typedef EASTL_ITC_NS::random_access_iterator_tag iterator_category;
146 typedef T value_type;
147 typedef ptrdiff_t difference_type;
149 typedef T& reference;
152 template <
typename T>
153 struct iterator_traits<const T*>
155 typedef EASTL_ITC_NS::random_access_iterator_tag iterator_category;
156 typedef T value_type;
157 typedef ptrdiff_t difference_type;
158 typedef const T* pointer;
159 typedef const T& reference;
179 template <
typename Iterator>
180 class reverse_iterator :
public iterator<typename eastl::iterator_traits<Iterator>::iterator_category,
181 typename eastl::iterator_traits<Iterator>::value_type,
182 typename eastl::iterator_traits<Iterator>::difference_type,
183 typename eastl::iterator_traits<Iterator>::pointer,
184 typename eastl::iterator_traits<Iterator>::reference>
187 typedef Iterator iterator_type;
188 typedef typename eastl::iterator_traits<Iterator>::pointer pointer;
189 typedef typename eastl::iterator_traits<Iterator>::reference reference;
190 typedef typename eastl::iterator_traits<Iterator>::difference_type difference_type;
203 : mIterator(ri.mIterator) { }
205 template <
typename U>
207 : mIterator(ri.base()) { }
212 template <
typename U>
214 { mIterator = ri.base();
return *
this; }
216 iterator_type base()
const 217 {
return mIterator; }
219 reference operator*()
const 221 iterator_type i(mIterator);
225 pointer operator->()
const 226 {
return &(operator*()); }
229 { --mIterator;
return *
this; }
239 { ++mIterator;
return *
this; }
252 { mIterator -= n;
return *
this; }
258 { mIterator += n;
return *
this; }
260 reference operator[](difference_type n)
const 261 {
return mIterator[-n - 1]; }
269 template <
typename Iterator1,
typename Iterator2>
272 {
return a.base() == b.base(); }
275 template <
typename Iterator1,
typename Iterator2>
277 operator<(const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
278 {
return a.base() > b.base(); }
281 template <
typename Iterator1,
typename Iterator2>
283 operator!=(
const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
284 {
return a.base() != b.base(); }
287 template <
typename Iterator1,
typename Iterator2>
289 operator>(
const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
290 {
return a.base() < b.base(); }
293 template <
typename Iterator1,
typename Iterator2>
295 operator<=(const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
296 {
return a.base() >= b.base(); }
299 template <
typename Iterator1,
typename Iterator2>
301 operator>=(
const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
302 {
return a.base() <= b.base(); }
305 template <
typename Iterator1,
typename Iterator2>
306 inline typename reverse_iterator<Iterator1>::difference_type
307 operator-(
const reverse_iterator<Iterator1>& a,
const reverse_iterator<Iterator2>& b)
308 {
return b.base() - a.base(); }
311 template <
typename Iterator>
312 inline reverse_iterator<Iterator>
313 operator+(
typename reverse_iterator<Iterator>::difference_type n,
const reverse_iterator<Iterator>& a)
314 {
return reverse_iterator<Iterator>(a.base() - n); }
327 template <
typename Container>
331 typedef Container container_type;
332 typedef typename Container::const_reference const_reference;
335 Container& container;
342 { container.push_back(value);
return *
this; }
359 template <
typename Container>
372 template <
typename Container>
376 typedef Container container_type;
377 typedef typename Container::const_reference const_reference;
380 Container& container;
387 { container.push_front(value);
return *
this; }
404 template <
typename Container>
428 template <
typename Container>
429 class insert_iterator :
public iterator<EASTL_ITC_NS::output_iterator_tag, void, void, void, void>
432 typedef Container container_type;
433 typedef typename Container::iterator iterator_type;
434 typedef typename Container::const_reference const_reference;
437 Container& container;
446 EASTL_ASSERT(&x.container == &container);
452 : container(x), it(itNew) {}
456 it = container.insert(it, value);
477 template <
typename Container,
typename Iterator>
481 typedef typename Container::iterator iterator;
495 template <
typename InputIterator>
496 inline typename eastl::iterator_traits<InputIterator>::difference_type
497 distance_impl(InputIterator first, InputIterator last, EASTL_ITC_NS::input_iterator_tag)
499 typename eastl::iterator_traits<InputIterator>::difference_type n = 0;
509 template <
typename RandomAccessIterator>
510 inline typename eastl::iterator_traits<RandomAccessIterator>::difference_type
511 distance_impl(RandomAccessIterator first, RandomAccessIterator last, EASTL_ITC_NS::random_access_iterator_tag)
534 template <
typename InputIterator>
535 inline typename eastl::iterator_traits<InputIterator>::difference_type
536 distance(InputIterator first, InputIterator last)
538 typedef typename eastl::iterator_traits<InputIterator>::iterator_category IC;
553 template <
typename InputIterator,
typename Distance>
555 advance_impl(InputIterator& i, Distance n, EASTL_ITC_NS::input_iterator_tag)
561 template <
typename B
idirectionalIterator,
typename Distance>
563 advance_impl(BidirectionalIterator& i, Distance n, EASTL_ITC_NS::bidirectional_iterator_tag)
577 template <
typename RandomAccessIterator,
typename Distance>
579 advance_impl(RandomAccessIterator& i, Distance n, EASTL_ITC_NS::random_access_iterator_tag)
596 template <
typename InputIterator,
typename Distance>
598 advance(InputIterator& i, Distance n)
600 typedef typename eastl::iterator_traits<InputIterator>::iterator_category IC;
609 #if defined(_MSC_VER) 611 #elif defined(__SNC__) 612 #pragma control %pop diag 616 #endif // Header include guard eastl::insert_iterator< Container > inserter(Container &x, Iterator i)
The iterator is valid and points to the same element it did when created. For example, if an iterator points to vector::begin() but an element is inserted at the front, the iterator is valid but not current. Modification of elements in place do not make iterators non-current.
front_insert_iterator< Container > front_inserter(Container &x)
back_insert_iterator< Container > back_inserter(Container &x)
eastl::iterator_traits< InputIterator >::difference_type distance_impl(InputIterator first, InputIterator last, EASTL_ITC_NS::input_iterator_tag)
void advance_impl(InputIterator &i, Distance n, EASTL_ITC_NS::input_iterator_tag)
The iterator is valid, which means it is in the range of [begin, end].
This is called none and not called invalid because it is not strictly the opposite of invalid...
EA Standard Template Library.