31 #ifndef ETL_ITERATOR_INCLUDED
32 #define ETL_ITERATOR_INCLUDED
38 #if ETL_USING_STL || defined(ETL_IN_UNIT_TEST)
57 template <
typename TIterator>
60 typedef typename TIterator::iterator_category iterator_category;
61 typedef typename TIterator::value_type value_type;
62 typedef typename TIterator::difference_type difference_type;
63 typedef typename TIterator::pointer pointer;
64 typedef typename TIterator::reference reference;
70 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
72 typedef ptrdiff_t difference_type;
80 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
82 typedef ptrdiff_t difference_type;
83 typedef const T* pointer;
84 typedef const T& reference;
91 template <
typename TIterator,
typename TDistance>
92 ETL_CONSTEXPR17
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::output_iterator_tag)
100 template <
typename TIterator,
typename TDistance>
101 ETL_CONSTEXPR17
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::forward_iterator_tag)
109 template <
typename TIterator,
typename TDistance>
110 ETL_CONSTEXPR17
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::bidirectional_iterator_tag)
128 template <
typename TIterator,
typename TDistance>
129 ETL_CONSTEXPR17
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::random_access_iterator_tag)
134 template <
typename TIterator,
typename TDistance>
135 ETL_CONSTEXPR17
void advance(TIterator& itr, TDistance n)
137 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
139 advance_helper(itr, n, tag());
144 template <
typename TIterator,
typename TDistance>
145 ETL_CONSTEXPR17
void advance(TIterator& itr, TDistance n)
147 std::advance(itr, n);
154 #if ETL_NOT_USING_STL
155 template<
typename TIterator>
156 ETL_CONSTEXPR17
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::input_iterator_tag)
158 typename etl::iterator_traits<TIterator>::difference_type d = 0;
160 while (first != last)
169 template<
typename TIterator>
170 ETL_CONSTEXPR17
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::forward_iterator_tag)
172 typename etl::iterator_traits<TIterator>::difference_type d = 0;
174 while (first != last)
183 template<
typename TIterator>
184 ETL_CONSTEXPR17
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::bidirectional_iterator_tag)
186 typename etl::iterator_traits<TIterator>::difference_type d = 0;
188 while (first != last)
197 template<
typename TIterator>
198 ETL_CONSTEXPR17
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::random_access_iterator_tag)
203 template<
typename TIterator>
204 ETL_CONSTEXPR17
typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, TIterator last)
206 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
208 return distance_helper(first, last, tag());
213 template<
typename TIterator>
214 ETL_CONSTEXPR17
typename std::iterator_traits<TIterator>::difference_type distance(TIterator first, TIterator last)
216 return std::distance(first, last);
223 template<
typename TIterator>
224 ETL_CONSTEXPR17 TIterator prev(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
226 #if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
227 etl::advance(itr, -n);
229 std::advance(itr, -n);
236 template<
typename TIterator>
237 ETL_CONSTEXPR17 TIterator next(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
239 #if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
240 etl::advance(itr, n);
242 std::advance(itr, n);
249 template <
typename TIterator>
254 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
255 typedef typename iterator_traits<TIterator>::value_type value_type;
256 typedef typename iterator_traits<TIterator>::difference_type difference_type;
257 typedef typename iterator_traits<TIterator>::pointer pointer;
258 typedef typename iterator_traits<TIterator>::reference reference;
260 typedef TIterator iterator_type;
272 template <
typename TOther>
274 : current(other.base())
278 template<
class TOther>
281 current = other.base();
286 ETL_CONSTEXPR17 TIterator base()
const
291 ETL_NODISCARD ETL_CONSTEXPR17 reference operator*()
const
293 TIterator temp = current;
298 ETL_NODISCARD ETL_CONSTEXPR17 pointer operator->()
const
300 TIterator temp = current;
349 ETL_NODISCARD ETL_CONSTEXPR17
reverse_iterator operator+(
const difference_type offset)
const
354 ETL_NODISCARD ETL_CONSTEXPR17
reverse_iterator operator-(
const difference_type offset)
const
359 ETL_NODISCARD ETL_CONSTEXPR17 reference operator[](
const difference_type offset)
const
361 return (*(*
this + offset));
369 template <
class TIterator>
372 return lhs.base() == rhs.base();
375 template <
class TIterator>
376 inline ETL_CONSTEXPR17
bool operator !=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
378 return !(lhs == rhs);
381 template <
class TIterator>
382 inline ETL_CONSTEXPR17
bool operator <(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
384 return rhs.base() < lhs.base();
387 template <
class TIterator>
388 inline ETL_CONSTEXPR17
bool operator >(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
393 template <
class TIterator>
394 inline ETL_CONSTEXPR17
bool operator <=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
399 template <
class TIterator>
400 inline ETL_CONSTEXPR17
bool operator >=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
405 template <
class TIterator>
406 inline ETL_CONSTEXPR17
typename reverse_iterator<TIterator>::difference_type
operator -(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
408 return rhs.base() - lhs.base();
411 template <
class TIterator,
class TDifference>
412 inline ETL_CONSTEXPR17 reverse_iterator<TIterator>
operator +(TDifference n,
const reverse_iterator<TIterator>& itr)
414 return itr.operator +(n);
420 template <
typename TCategory,
typename T,
typename TDistance = ptrdiff_t,
typename TPo
inter = T* ,
typename TReference = T& >
423 typedef T value_type;
424 typedef TDistance difference_type;
425 typedef TPointer pointer;
426 typedef TReference reference;
427 typedef TCategory iterator_category;
430 #if ETL_CPP11_SUPPORTED
433 template <
typename TIterator>
438 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
439 typedef typename iterator_traits<TIterator>::value_type value_type;
440 typedef typename iterator_traits<TIterator>::difference_type difference_type;
441 typedef TIterator iterator_type;
442 typedef TIterator pointer;
443 typedef value_type&& reference;
449 explicit move_iterator(TIterator itr)
454 template <
typename U>
455 move_iterator(
const move_iterator<U>& itr)
456 : current(itr.base())
460 template <
typename U>
461 move_iterator& operator =(
const move_iterator<U>& itr)
463 current = itr.current;
467 iterator_type base()
const
472 pointer operator ->()
const
477 reference operator *()
const
479 return etl::move(*current);
482 move_iterator& operator++()
488 move_iterator& operator--()
494 move_iterator operator++(
int)
496 move_iterator temp = *
this;
501 move_iterator operator--(
int)
503 move_iterator temp = *
this;
508 move_iterator
operator +(difference_type n)
const
510 return move_iterator(current + n);
513 move_iterator
operator -(difference_type n)
const
515 return move_iterator(current - n);
518 move_iterator operator +=(difference_type n)
524 move_iterator operator -=(difference_type n)
530 reference operator [](difference_type n)
const
532 return etl::move(current[n]);
540 template <
typename TIterator>
541 bool operator ==(
const etl::move_iterator<TIterator>& lhs,
542 const etl::move_iterator<TIterator>& rhs)
544 return lhs.base() == rhs.base();
547 template <
typename TIterator>
548 bool operator !=(
const etl::move_iterator<TIterator>& lhs,
549 const etl::move_iterator<TIterator>& rhs)
551 return !(lhs == rhs);
554 template <
typename TIterator>
555 bool operator <(
const etl::move_iterator<TIterator>& lhs,
556 const etl::move_iterator<TIterator>& rhs)
558 return lhs.base() < rhs.base();
561 template <
typename TIterator>
562 bool operator <=(
const etl::move_iterator<TIterator>& lhs,
563 const etl::move_iterator<TIterator>& rhs)
568 template <
typename TIterator>
569 bool operator >(
const etl::move_iterator<TIterator>& lhs,
570 const etl::move_iterator<TIterator>& rhs)
575 template <
typename TIterator>
576 bool operator >=(
const etl::move_iterator<TIterator>& lhs,
577 const etl::move_iterator<TIterator>& rhs)
582 template <
typename TIterator>
583 move_iterator<TIterator>
operator +(
typename move_iterator<TIterator>::difference_type n,
584 const move_iterator<TIterator>& rhs)
589 template <
typename TIterator1,
typename TIterator2 >
590 auto operator -(
const move_iterator<TIterator1>& lhs,
591 const move_iterator<TIterator2>& rhs) -> decltype(lhs.base() - rhs.base())
593 return lhs.base() - rhs.base();
596 template <
typename TIterator>
597 etl::move_iterator<TIterator> make_move_iterator(TIterator itr)
599 return etl::move_iterator<TIterator>(itr);
607 template <
typename T>
613 template <
typename T>
619 template <
typename T>
625 template <
typename T>
631 template <
typename T>
637 template <
typename T>
646 template <
typename T>
655 template <
typename T>
663 template <
typename T>
670 template <
typename T>
Definition: iterator.h:251
is_same
Definition: type_traits_generator.h:981
Definition: absolute.h:37
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
etl::fixed_iterator< TIterator > & operator-(etl::fixed_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type)
Definition: fixed_iterator.h:193
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:594
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:582
etl::fixed_iterator< TIterator > & operator+(etl::fixed_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type)
Definition: fixed_iterator.h:183
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:606
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:621
Definition: iterator.h:52
Definition: iterator.h:51
Definition: iterator.h:665
Definition: iterator.h:627
Definition: iterator.h:657
Definition: iterator.h:621
Definition: iterator.h:648
Definition: iterator.h:615
Definition: iterator.h:672
Definition: iterator.h:633
Definition: iterator.h:59
iterator
Definition: iterator.h:422
Definition: iterator.h:50
Definition: iterator.h:53