31#ifndef ETL_ITERATOR_INCLUDED
32#define ETL_ITERATOR_INCLUDED
39#if ETL_USING_STL || defined(ETL_IN_UNIT_TEST)
61 template <typename TIterator, typename = typename etl::enable_if<!etl::is_fundamental<TIterator>::value,
void>::type>
64 typedef typename TIterator::iterator_category iterator_category;
65 typedef typename TIterator::value_type value_type;
66 typedef typename TIterator::difference_type difference_type;
67 typedef typename TIterator::pointer pointer;
68 typedef typename TIterator::reference reference;
75 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
77 typedef ptrdiff_t difference_type;
78 typedef typename etl::remove_cv<T>::type* pointer;
86 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
88 typedef ptrdiff_t difference_type;
89 typedef const typename etl::remove_cv<T>::type* pointer;
90 typedef const T& reference;
95 template <
typename TIterator,
typename TDistance>
96 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::output_iterator_tag)
104 template <
typename TIterator,
typename TDistance>
105 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::forward_iterator_tag)
113 template <
typename TIterator,
typename TDistance>
114 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::bidirectional_iterator_tag)
132 template <
typename TIterator,
typename TDistance>
133 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::random_access_iterator_tag)
138 template <
typename TIterator,
typename TDistance>
139 ETL_CONSTEXPR14
void advance(TIterator& itr, TDistance n)
141 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
143 advance_helper(itr, n, tag());
148 template<
typename TIterator>
149 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::input_iterator_tag)
151 typename etl::iterator_traits<TIterator>::difference_type d = 0;
153 while (first != last)
162 template<
typename TIterator>
163 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::forward_iterator_tag)
165 typename etl::iterator_traits<TIterator>::difference_type d = 0;
167 while (first != last)
176 template<
typename TIterator>
177 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::bidirectional_iterator_tag)
179 typename etl::iterator_traits<TIterator>::difference_type d = 0;
181 while (first != last)
190 template<
typename TIterator>
191 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::random_access_iterator_tag)
196 template<
typename TIterator>
197 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, TIterator last)
199 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
201 return distance_helper(first, last, tag());
206 template<
typename TIterator>
207 ETL_CONSTEXPR14 TIterator prev(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
209 etl::advance(itr, -n);
216 template<
typename TIterator>
217 ETL_CONSTEXPR14 TIterator next(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
219 etl::advance(itr, n);
226 template <
typename TIterator>
231 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
232 typedef typename iterator_traits<TIterator>::value_type value_type;
233 typedef typename iterator_traits<TIterator>::difference_type difference_type;
234 typedef typename iterator_traits<TIterator>::pointer pointer;
235 typedef typename iterator_traits<TIterator>::reference reference;
237 typedef TIterator iterator_type;
249 template <
typename TOther>
251 : current(other.base())
255 template<
class TOther>
258 current = other.base();
263 ETL_CONSTEXPR14 TIterator base()
const
268 ETL_NODISCARD ETL_CONSTEXPR14 reference operator*()
const
270 TIterator temp = current;
275 ETL_NODISCARD ETL_CONSTEXPR14 pointer operator->()
const
277 TIterator temp = current;
326 ETL_NODISCARD ETL_CONSTEXPR14
reverse_iterator operator+(
const difference_type offset)
const
331 ETL_NODISCARD ETL_CONSTEXPR14
reverse_iterator operator-(
const difference_type offset)
const
336 ETL_NODISCARD ETL_CONSTEXPR14 reference operator[](
const difference_type offset)
const
338 return (*(*
this + offset));
346 template <
typename TIterator>
349 return lhs.base() == rhs.base();
352 template <
typename TIterator>
353 ETL_CONSTEXPR14
bool operator !=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
355 return !(lhs == rhs);
358 template <
typename TIterator>
359 ETL_CONSTEXPR14
bool operator <(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
361 return rhs.base() < lhs.base();
364 template <
typename TIterator>
365 ETL_CONSTEXPR14
bool operator >(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
370 template <
typename TIterator>
371 ETL_CONSTEXPR14
bool operator <=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
376 template <
typename TIterator>
377 ETL_CONSTEXPR14
bool operator >=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
382 template <
typename TIterator>
383 ETL_CONSTEXPR14
typename reverse_iterator<TIterator>::difference_type
operator -(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
385 return rhs.base() - lhs.base();
388 template <
typename TIterator,
class TDifference>
389 ETL_CONSTEXPR14 reverse_iterator<TIterator>
operator +(TDifference n,
const reverse_iterator<TIterator>& itr)
391 return itr.operator +(n);
397 template <
typename TCategory,
typename T,
typename TDistance = ptrdiff_t,
typename TPo
inter = T* ,
typename TReference = T& >
400 typedef T value_type;
401 typedef TDistance difference_type;
402 typedef TPointer pointer;
403 typedef TReference reference;
404 typedef TCategory iterator_category;
410 template <
typename TIterator>
415 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
416 typedef typename iterator_traits<TIterator>::value_type value_type;
417 typedef typename iterator_traits<TIterator>::difference_type difference_type;
418 typedef TIterator iterator_type;
419 typedef TIterator pointer;
420 typedef value_type&& reference;
426 explicit move_iterator(TIterator itr)
431 template <
typename U>
432 move_iterator(
const move_iterator<U>& itr)
433 : current(itr.base())
437 template <
typename U>
438 move_iterator& operator =(
const move_iterator<U>& itr)
440 current = itr.current;
444 iterator_type base()
const
449 pointer operator ->()
const
454 reference operator *()
const
456 return etl::move(*current);
459 move_iterator& operator++()
465 move_iterator& operator--()
471 move_iterator operator++(
int)
473 move_iterator temp = *
this;
478 move_iterator operator--(
int)
480 move_iterator temp = *
this;
485 move_iterator
operator +(difference_type n)
const
487 return move_iterator(current + n);
490 move_iterator
operator -(difference_type n)
const
492 return move_iterator(current - n);
495 move_iterator operator +=(difference_type n)
501 move_iterator operator -=(difference_type n)
507 reference operator [](difference_type n)
const
509 return etl::move(current[n]);
517 template <
typename TIterator>
518 bool operator ==(
const etl::move_iterator<TIterator>& lhs,
519 const etl::move_iterator<TIterator>& rhs)
521 return lhs.base() == rhs.base();
524 template <
typename TIterator>
525 bool operator !=(
const etl::move_iterator<TIterator>& lhs,
526 const etl::move_iterator<TIterator>& rhs)
528 return !(lhs == rhs);
531 template <
typename TIterator>
532 bool operator <(
const etl::move_iterator<TIterator>& lhs,
533 const etl::move_iterator<TIterator>& rhs)
535 return lhs.base() < rhs.base();
538 template <
typename TIterator>
539 bool operator <=(
const etl::move_iterator<TIterator>& lhs,
540 const etl::move_iterator<TIterator>& rhs)
545 template <
typename TIterator>
546 bool operator >(
const etl::move_iterator<TIterator>& lhs,
547 const etl::move_iterator<TIterator>& rhs)
552 template <
typename TIterator>
553 bool operator >=(
const etl::move_iterator<TIterator>& lhs,
554 const etl::move_iterator<TIterator>& rhs)
559 template <
typename TIterator>
560 move_iterator<TIterator>
operator +(
typename move_iterator<TIterator>::difference_type n,
561 const move_iterator<TIterator>& rhs)
566 template <
typename TIterator1,
typename TIterator2 >
567 auto operator -(
const move_iterator<TIterator1>& lhs,
568 const move_iterator<TIterator2>& rhs) ->
decltype(lhs.base() - rhs.base())
570 return lhs.base() - rhs.base();
573 template <
typename TIterator>
574 etl::move_iterator<TIterator> make_move_iterator(TIterator itr)
576 return etl::move_iterator<TIterator>(itr);
593 template <
typename TContainer>
619 container->push_back(value);
630 container->push_back(etl::move(value));
665 TContainer* container;
679 template <
typename TContainer>
703 template <
typename TContainer>
733 container->push_front(value);
743 container->push_front(etl::move(value));
777 TContainer* container;
792 template <
typename TContainer>
803 template <
typename T>
809 template <
typename T>
812 template <
typename T>
818 template <
typename T>
821 template <
typename T>
827 template <
typename T>
830 template <
typename T>
836 template <
typename T>
840 template <
typename T>
846 template <
typename T>
849 template <
typename T>
855 template <
typename T>
858 template <
typename T>
867 template <
typename T>
870 template <
typename T>
879 template <
typename T>
882 template <
typename T>
890 template <
typename T>
893 template <
typename T>
900 template <
typename T>
904 template <
typename T>
911 template <
typename T>
915 template <
typename T>
922 template <
typename T>
925#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
930 template<
typename TContainer>
931 ETL_CONSTEXPR
typename TContainer::iterator
begin(TContainer& container)
933 return container.begin();
940 template<
typename TContainer>
941 ETL_CONSTEXPR
typename TContainer::const_iterator
begin(
const TContainer& container)
943 return container.begin();
950 template<
typename TContainer>
951 ETL_CONSTEXPR
typename TContainer::const_iterator
cbegin(
const TContainer& container)
953 return container.cbegin();
960 template<
typename TContainer>
961 ETL_CONSTEXPR
typename TContainer::iterator
end(TContainer& container)
963 return container.end();
970 template<
typename TContainer>
971 ETL_CONSTEXPR
typename TContainer::const_iterator
end(
const TContainer& container)
973 return container.end();
980 template<
typename TContainer>
981 ETL_CONSTEXPR
typename TContainer::const_iterator
cend(
const TContainer& container)
983 return container.cend();
990 template<
typename TValue,
size_t Array_Size>
991 ETL_CONSTEXPR TValue*
begin(TValue(&data)[Array_Size])
1000 template<
typename TValue,
size_t Array_Size>
1001 ETL_CONSTEXPR
const TValue*
begin(
const TValue(&data)[Array_Size])
1010 template<
typename TValue,
size_t Array_Size>
1011 ETL_CONSTEXPR
const TValue*
cbegin(
const TValue(&data)[Array_Size])
1020 template<
typename TValue,
size_t Array_Size>
1021 ETL_CONSTEXPR TValue*
end(TValue(&data)[Array_Size])
1023 return &data[Array_Size];
1030 template<
typename TValue,
size_t Array_Size>
1031 ETL_CONSTEXPR
const TValue*
end(
const TValue(&data)[Array_Size])
1033 return &data[Array_Size];
1040 template<
typename TValue,
size_t Array_Size>
1041 ETL_CONSTEXPR
const TValue*
cend(
const TValue(&data)[Array_Size])
1043 return &data[Array_Size];
1047#if ETL_NOT_USING_STL || ETL_CPP14_NOT_SUPPORTED
1052 template<
typename TContainer>
1053 ETL_CONSTEXPR
typename TContainer::reverse_iterator
rbegin(TContainer& container)
1055 return container.rbegin();
1062 template<
typename TContainer>
1063 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
rbegin(
const TContainer& container)
1065 return container.rbegin();
1072 template<
typename TContainer>
1073 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
crbegin(
const TContainer& container)
1075 return container.crbegin();
1082 template<
typename TContainer>
1083 ETL_CONSTEXPR
typename TContainer::reverse_iterator
rend(TContainer& container)
1085 return container.rend();
1092 template<
typename TContainer>
1093 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
rend(
const TContainer& container)
1095 return container.rend();
1102 template<
typename TContainer>
1103 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
crend(
const TContainer& container)
1105 return container.crend();
1112 template<
typename TValue,
size_t Array_Size>
1113 ETL_OR_STD::reverse_iterator<TValue*>
rbegin(TValue(&data)[Array_Size])
1115 return ETL_OR_STD::reverse_iterator<TValue*>(&data[Array_Size]);
1122 template<
typename TValue,
size_t Array_Size>
1123 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crbegin(
const TValue(&data)[Array_Size])
1125 return ETL_OR_STD::reverse_iterator<const TValue*>(&data[Array_Size]);
1132 template<
typename TValue,
size_t Array_Size>
1133 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<TValue*>
rend(TValue(&data)[Array_Size])
1135 return ETL_OR_STD::reverse_iterator<TValue*>(&data[0]);
1142 template<
typename TValue,
size_t Array_Size>
1143 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crend(
const TValue(&data)[Array_Size])
1145 return ETL_OR_STD::reverse_iterator<const TValue*>(&data[0]);
1149#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1155 template<
typename TContainer>
1156 ETL_CONSTEXPR
typename TContainer::size_type size(
const TContainer& container)
1158 return container.size();
1165 template<
typename TValue,
size_t Array_Size>
1166 ETL_CONSTEXPR
size_t size(TValue(&)[Array_Size])
1179 template <
typename T,
size_t Array_Size>
1180 char(&array_size(T(&array)[Array_Size]))[Array_Size];
1182#define ETL_ARRAY_SIZE(a) sizeof(etl::array_size(a))
Turns assignment into insertion.
Definition: iterator.h:595
TContainer container_type
A nested typedef for the type of whatever container you used.
Definition: iterator.h:599
ETL_CONSTEXPR14 back_insert_iterator & operator++()
Definition: iterator.h:649
ETL_CONSTEXPR14 back_insert_iterator(TContainer &c)
The only way to create this iterator is with a container.
Definition: iterator.h:602
ETL_CONSTEXPR14 back_insert_iterator & operator=(const typename TContainer::value_type &value)
Definition: iterator.h:617
ETL_NODISCARD ETL_CONSTEXPR14 back_insert_iterator & operator*()
Definition: iterator.h:640
Turns assignment into insertion.
Definition: iterator.h:705
ETL_CONSTEXPR14 front_insert_iterator(TContainer &c)
Definition: iterator.h:715
ETL_CONSTEXPR14 front_insert_iterator & operator++()
Definition: iterator.h:761
TContainer container_type
A nested typedef for the type of whatever container you used.
Definition: iterator.h:709
ETL_NODISCARD ETL_CONSTEXPR14 front_insert_iterator & operator*()
Definition: iterator.h:752
ETL_CONSTEXPR14 front_insert_iterator & operator=(const typename TContainer::value_type &value)
Definition: iterator.h:731
Definition: iterator.h:228
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
is_same
Definition: type_traits_generator.h:1041
bitset_ext
Definition: absolute.h:38
ETL_CONSTEXPR TContainer::reverse_iterator rend(TContainer &container)
Definition: iterator.h:1083
ETL_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition: iterator.h:1073
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator-(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:672
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:684
ETL_NODISCARD ETL_CONSTEXPR14 etl::front_insert_iterator< TContainer > front_inserter(TContainer &container)
Definition: iterator.h:795
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition: iterator.h:1053
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:696
ETL_CONSTEXPR TContainer::const_iterator cbegin(const TContainer &container)
Definition: iterator.h:951
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
ETL_NODISCARD ETL_CONSTEXPR14 etl::back_insert_iterator< TContainer > back_inserter(TContainer &container)
Definition: iterator.h:682
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition: iterator.h:931
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator+(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:659
ETL_CONSTEXPR TContainer::const_reverse_iterator crend(const TContainer &container)
Definition: iterator.h:1103
ETL_CONSTEXPR TContainer::const_iterator cend(const TContainer &container)
Definition: iterator.h:981
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:657
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:672
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition: iterator.h:961
Definition: iterator.h:53
Definition: iterator.h:52
Definition: iterator.h:895
Definition: iterator.h:832
Definition: iterator.h:884
Definition: iterator.h:823
Definition: iterator.h:872
Definition: iterator.h:814
Definition: iterator.h:917
Definition: iterator.h:851
Definition: iterator.h:906
Definition: iterator.h:842
Definition: iterator.h:63
iterator
Definition: iterator.h:399
Definition: iterator.h:51
Definition: iterator.h:54