31#ifndef ETL_ITERATOR_INCLUDED
32#define ETL_ITERATOR_INCLUDED
39#if ETL_USING_STL || defined(ETL_IN_UNIT_TEST)
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;
86 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
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;
249 template <
typename TOther>
251 : current(
other.base())
255 template<
class TOther>
258 current =
other.base();
268 ETL_NODISCARD ETL_CONSTEXPR14 reference operator*()
const
275 ETL_NODISCARD ETL_CONSTEXPR14 pointer operator->()
const
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& >
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;
420 typedef value_type&& reference;
431 template <
typename U>
433 : current(itr.base())
437 template <
typename U>
440 current = itr.current;
444 iterator_type base()
const
449 pointer operator ->()
const
454 reference operator *()
const
456 return etl::move(*current);
507 reference operator [](difference_type
n)
const
509 return etl::move(current[
n]);
517 template <
typename TIterator>
521 return lhs.base() == rhs.base();
524 template <
typename TIterator>
528 return !(lhs == rhs);
531 template <
typename TIterator>
535 return lhs.base() < rhs.base();
538 template <
typename TIterator>
545 template <
typename TIterator>
552 template <
typename TIterator>
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>
588 template <
typename TContainer>
608 container->push_back(value);
619 container->push_back(etl::move(value));
657 template <
typename TContainer>
672 template <
typename TContainer>
692 container->push_front(value);
702 container->push_front(etl::move(value));
739 template <
typename TContainer>
754 template <
typename TContainer>
774 container->push(value);
785 container->push(etl::move(value));
823 template <
typename TContainer>
834 template <
typename T>
840 template <
typename T>
843 template <
typename T>
849 template <
typename T>
852 template <
typename T>
858 template <
typename T>
861 template <
typename T>
867 template <
typename T>
871 template <
typename T>
877 template <
typename T>
880 template <
typename T>
886 template <
typename T>
889 template <
typename T>
898 template <
typename T>
901 template <
typename T>
910 template <
typename T>
913 template <
typename T>
921 template <
typename T>
924 template <
typename T>
931 template <
typename T>
935 template <
typename T>
942 template <
typename T>
946 template <
typename T>
953 template <
typename T>
956#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
961 template<
typename TContainer>
964 return container.begin();
971 template<
typename TContainer>
974 return container.begin();
981 template<
typename TContainer>
984 return container.cbegin();
991 template<
typename TContainer>
994 return container.end();
1001 template<
typename TContainer>
1002 ETL_CONSTEXPR
typename TContainer::const_iterator
end(
const TContainer& container)
1004 return container.end();
1011 template<
typename TContainer>
1014 return container.cend();
1021 template<
typename TValue,
size_t Array_Size>
1031 template<
typename TValue,
size_t Array_Size>
1041 template<
typename TValue,
size_t Array_Size>
1051 template<
typename TValue,
size_t Array_Size>
1054 return &data[Array_Size];
1061 template<
typename TValue,
size_t Array_Size>
1064 return &data[Array_Size];
1071 template<
typename TValue,
size_t Array_Size>
1074 return &data[Array_Size];
1078#if ETL_NOT_USING_STL || ETL_CPP14_NOT_SUPPORTED
1083 template<
typename TContainer>
1086 return container.rbegin();
1093 template<
typename TContainer>
1096 return container.rbegin();
1103 template<
typename TContainer>
1106 return container.crbegin();
1113 template<
typename TContainer>
1116 return container.rend();
1123 template<
typename TContainer>
1124 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
rend(
const TContainer& container)
1126 return container.rend();
1133 template<
typename TContainer>
1134 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
crend(
const TContainer& container)
1136 return container.crend();
1143 template<
typename TValue,
size_t Array_Size>
1146 return ETL_OR_STD::reverse_iterator<TValue*>(&data[Array_Size]);
1153 template<
typename TValue,
size_t Array_Size>
1154 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crbegin(
const TValue(&data)[Array_Size])
1156 return ETL_OR_STD::reverse_iterator<const TValue*>(&data[Array_Size]);
1163 template<
typename TValue,
size_t Array_Size>
1164 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<TValue*>
rend(
TValue(&data)[Array_Size])
1166 return ETL_OR_STD::reverse_iterator<TValue*>(&data[0]);
1173 template<
typename TValue,
size_t Array_Size>
1174 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crend(
const TValue(&data)[Array_Size])
1176 return ETL_OR_STD::reverse_iterator<const TValue*>(&data[0]);
1180#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1186 template<
typename TContainer>
1189 return container.size();
1196 template<
typename TValue,
size_t Array_Size>
1197 ETL_CONSTEXPR
size_t size(TValue(&)[Array_Size])
1210 template <
typename T,
size_t Array_Size>
1213#define ETL_ARRAY_SIZE(a) sizeof(etl::array_size(a))
Turns assignment into push_back.
Definition iterator.h:590
ETL_CONSTEXPR14 back_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:636
ETL_CONSTEXPR14 back_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:598
ETL_CONSTEXPR14 back_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:606
ETL_NODISCARD ETL_CONSTEXPR14 back_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:628
Turns assignment into a push_front.
Definition iterator.h:674
ETL_CONSTEXPR14 front_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:682
ETL_CONSTEXPR14 front_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:718
ETL_NODISCARD ETL_CONSTEXPR14 front_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:710
ETL_CONSTEXPR14 front_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:690
Turns assignment into a push.
Definition iterator.h:756
ETL_NODISCARD ETL_CONSTEXPR14 push_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:794
ETL_CONSTEXPR14 push_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:772
ETL_CONSTEXPR14 push_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:802
ETL_CONSTEXPR14 push_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:764
Definition iterator.h:228
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
bitset_ext
Definition absolute.h:38
ETL_CONSTEXPR TContainer::reverse_iterator rend(TContainer &container)
Definition iterator.h:1114
ETL_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1104
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:693
ETL_NODISCARD ETL_CONSTEXPR14 etl::push_insert_iterator< TContainer > push_inserter(TContainer &container)
Creates a push_insert_iterator from a container.
Definition iterator.h:826
ETL_NODISCARD ETL_CONSTEXPR14 etl::front_insert_iterator< TContainer > front_inserter(TContainer &container)
Creates a front_insert_iterator from a container.
Definition iterator.h:742
char(& array_size(T(&array)[Array_Size]))[Array_Size]
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1084
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:705
ETL_CONSTEXPR TContainer::const_iterator cbegin(const TContainer &container)
Definition iterator.h:982
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:654
ETL_NODISCARD ETL_CONSTEXPR14 etl::back_insert_iterator< TContainer > back_inserter(TContainer &container)
Creates a back_insert_iterator from a container.
Definition iterator.h:660
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:642
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
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:1134
ETL_CONSTEXPR TContainer::const_iterator cend(const TContainer &container)
Definition iterator.h:1012
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:666
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:681
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
Definition iterator.h:926
Definition iterator.h:863
Definition iterator.h:915
Definition iterator.h:854
Definition iterator.h:903
Definition iterator.h:845
Definition iterator.h:948
Definition iterator.h:882
Definition iterator.h:937
Definition iterator.h:873
iterator
Definition iterator.h:399
pair holds two objects of arbitrary type
Definition utility.h:164
ETL_CONSTEXPR pair()
Default constructor.
Definition utility.h:176