31#ifndef ETL_ITERATOR_INCLUDED
32#define ETL_ITERATOR_INCLUDED
40#if ETL_USING_STL || defined(ETL_IN_UNIT_TEST)
72 template <typename TIterator, typename = typename etl::enable_if< !etl::is_fundamental<TIterator>::value,
void>
::type>
75 typedef typename TIterator::iterator_category iterator_category;
76 typedef typename TIterator::value_type value_type;
77 typedef typename TIterator::difference_type difference_type;
78 typedef typename TIterator::pointer pointer;
79 typedef typename TIterator::reference reference;
86 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
88 typedef ptrdiff_t difference_type;
89 typedef typename etl::remove_cv<T>::type* pointer;
97 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
99 typedef ptrdiff_t difference_type;
100 typedef const typename etl::remove_cv<T>::type* pointer;
101 typedef const T& reference;
106 template <
typename TIterator,
typename TDistance>
107 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::input_iterator_tag)
115 template <
typename TIterator,
typename TDistance>
116 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::output_iterator_tag)
124 template <
typename TIterator,
typename TDistance>
125 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::forward_iterator_tag)
133 template <
typename TIterator,
typename TDistance>
134 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::bidirectional_iterator_tag)
152 template <
typename TIterator,
typename TDistance>
153 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::random_access_iterator_tag)
155 typedef typename etl::iterator_traits<TIterator>::difference_type diff_t;
156 itr +=
static_cast<diff_t
>(n);
159 template <
typename TIterator,
typename TDistance>
160 ETL_CONSTEXPR14
void advance(TIterator& itr, TDistance n)
162 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
164 advance_helper(itr, n, tag());
169 template <
typename TIterator>
170 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::input_iterator_tag)
172 typename etl::iterator_traits<TIterator>::difference_type d = 0;
174 while (first != last)
183 template <
typename TIterator>
184 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
185 ETL_OR_STD::forward_iterator_tag)
187 typename etl::iterator_traits<TIterator>::difference_type d = 0;
189 while (first != last)
198 template <
typename TIterator>
199 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
200 ETL_OR_STD::bidirectional_iterator_tag)
202 typename etl::iterator_traits<TIterator>::difference_type d = 0;
204 while (first != last)
213 template <
typename TIterator>
214 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
215 ETL_OR_STD::random_access_iterator_tag)
220 template <
typename TIterator>
221 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, TIterator last)
223 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
225 return distance_helper(first, last, tag());
230 template <
typename TIterator>
231 ETL_CONSTEXPR14 TIterator prev(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
233 etl::advance(itr, -n);
240 template <
typename TIterator>
241 ETL_CONSTEXPR14 TIterator next(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
243 etl::advance(itr, n);
250 template <
typename TIterator>
251 class reverse_iterator
255 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
256 typedef typename iterator_traits<TIterator>::value_type value_type;
257 typedef typename iterator_traits<TIterator>::difference_type difference_type;
258 typedef typename iterator_traits<TIterator>::pointer pointer;
259 typedef typename iterator_traits<TIterator>::reference reference;
261 typedef TIterator iterator_type;
263 ETL_CONSTEXPR14 reverse_iterator()
268 ETL_CONSTEXPR14
explicit reverse_iterator(TIterator itr)
273 template <
typename TOther>
274 ETL_CONSTEXPR14 reverse_iterator(
const reverse_iterator<TOther>& other)
275 : current(other.base())
279 template <
class TOther>
280 ETL_CONSTEXPR14 reverse_iterator& operator=(
const reverse_iterator<TOther>& other)
282 current = other.base();
287 ETL_CONSTEXPR14 TIterator base()
const
292 ETL_NODISCARD ETL_CONSTEXPR14 reference operator*()
const
294 TIterator temp = current;
299 ETL_NODISCARD ETL_CONSTEXPR14 pointer operator->()
const
301 TIterator temp = current;
306 ETL_CONSTEXPR14 reverse_iterator& operator++()
313 ETL_CONSTEXPR14 reverse_iterator operator++(
int)
315 reverse_iterator temp = *
this;
321 ETL_CONSTEXPR14 reverse_iterator& operator--()
328 ETL_CONSTEXPR14 reverse_iterator operator--(
int)
330 reverse_iterator temp = *
this;
336 ETL_CONSTEXPR14 reverse_iterator& operator+=(
const difference_type offset)
343 ETL_CONSTEXPR14 reverse_iterator& operator-=(
const difference_type offset)
350 ETL_NODISCARD ETL_CONSTEXPR14 reverse_iterator operator+(
const difference_type offset)
const
352 return reverse_iterator(current - offset);
355 ETL_NODISCARD ETL_CONSTEXPR14 reverse_iterator operator-(
const difference_type offset)
const
357 return (reverse_iterator(current + offset));
360 ETL_NODISCARD ETL_CONSTEXPR14 reference operator[](
const difference_type offset)
const
362 return (*(*
this + offset));
370 template <
typename TIterator>
373 return lhs.base() == rhs.base();
376 template <
typename TIterator>
377 ETL_CONSTEXPR14
bool operator!=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
379 return !(lhs == rhs);
382 template <
typename TIterator>
385 return rhs.base() < lhs.base();
388 template <
typename TIterator>
394 template <
typename TIterator>
400 template <
typename TIterator>
406 template <
typename TIterator>
410 return rhs.base() - lhs.base();
413 template <
typename TIterator,
class TDifference>
416 return itr.operator+(n);
422 template <
typename TCategory,
typename T,
typename TDistance = ptrdiff_t,
typename TPo
inter = T*,
typename TReference = T& >
425 typedef T value_type;
426 typedef TDistance difference_type;
427 typedef TPointer pointer;
428 typedef TReference reference;
429 typedef TCategory iterator_category;
435 template <
typename TIterator>
440 typedef typename iterator_traits<TIterator>::iterator_category
iterator_category;
441 typedef typename iterator_traits<TIterator>::value_type
value_type;
442 typedef typename iterator_traits<TIterator>::difference_type
difference_type;
443 typedef TIterator iterator_type;
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
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,
const etl::move_iterator<TIterator>& rhs)
543 return lhs.base() == rhs.base();
546 template <
typename TIterator>
547 bool operator!=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
549 return !(lhs == rhs);
552 template <
typename TIterator>
553 bool operator<(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
555 return lhs.base() < rhs.base();
558 template <
typename TIterator>
559 bool operator<=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
564 template <
typename TIterator>
565 bool operator>(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
570 template <
typename TIterator>
571 bool operator>=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
576 template <
typename TIterator>
577 move_iterator<TIterator>
operator+(
typename move_iterator<TIterator>::difference_type n,
const move_iterator<TIterator>& rhs)
582 template <
typename TIterator1,
typename TIterator2 >
583 auto operator-(
const move_iterator<TIterator1>& lhs,
const move_iterator<TIterator2>& rhs) ->
decltype(lhs.base() - rhs.base())
585 return lhs.base() - rhs.base();
588 template <
typename TIterator>
589 etl::move_iterator<TIterator> make_move_iterator(TIterator itr)
591 return etl::move_iterator<TIterator>(itr);
603 template <
typename TContainer>
608 typedef TContainer container_type;
623 container->push_back(value);
634 container->push_back(etl::move(value));
666 TContainer* container;
672 template <
typename TContainer>
685 template <
typename TContainer>
690 typedef TContainer container_type;
705 container->push_front(value);
715 container->push_front(etl::move(value));
746 TContainer* container;
752 template <
typename TContainer>
765 template <
typename TContainer>
770 typedef TContainer container_type;
785 container->push(value);
796 container->push(etl::move(value));
828 TContainer* container;
834 template <
typename TContainer>
843 template <
typename T>
846 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::input_iterator_tag>::value;
849 template <
typename T>
850 ETL_CONSTANT
bool is_input_iterator<T>::value;
852 template <
typename T>
855 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::output_iterator_tag>::value;
858 template <
typename T>
859 ETL_CONSTANT
bool is_output_iterator<T>::value;
861 template <
typename T>
864 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::forward_iterator_tag>::value;
867 template <
typename T>
868 ETL_CONSTANT
bool is_forward_iterator<T>::value;
870 template <
typename T>
873 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::bidirectional_iterator_tag>::value;
876 template <
typename T>
877 ETL_CONSTANT
bool is_bidirectional_iterator<T>::value;
880 template <
typename T>
883 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::random_access_iterator_tag>::value;
886 template <
typename T>
887 ETL_CONSTANT
bool is_random_iterator<T>::value;
889 template <
typename T>
892 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::random_access_iterator_tag>::value;
895 template <
typename T>
896 ETL_CONSTANT
bool is_random_access_iterator<T>::value;
898 template <
typename T>
902 ETL_CONSTANT
bool value = etl::is_input_iterator<T>::value || etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value
903 || etl::is_random_iterator<T>::value;
906 template <
typename T>
907 ETL_CONSTANT
bool is_input_iterator_concept<T>::value;
909 template <
typename T>
913 ETL_CONSTANT
bool value = etl::is_output_iterator<T>::value || etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value
914 || etl::is_random_iterator<T>::value;
917 template <
typename T>
918 ETL_CONSTANT
bool is_output_iterator_concept<T>::value;
920 template <
typename T>
924 ETL_CONSTANT
bool value = etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value || etl::is_random_iterator<T>::value;
927 template <
typename T>
928 ETL_CONSTANT
bool is_forward_iterator_concept<T>::value;
930 template <
typename T>
933 static ETL_CONSTANT
bool value = etl::is_bidirectional_iterator<T>::value || etl::is_random_iterator<T>::value;
936 template <
typename T>
937 ETL_CONSTANT
bool is_bidirectional_iterator_concept<T>::value;
940 template <
typename T>
943 static ETL_CONSTANT
bool value = etl::is_random_iterator<T>::value;
947 template <
typename T>
948 ETL_CONSTANT
bool is_random_iterator_concept<T>::value;
951 template <
typename T>
954 static ETL_CONSTANT
bool value = etl::is_random_access_iterator<T>::value;
958 template <
typename T>
959 ETL_CONSTANT
bool is_random_access_iterator_concept<T>::value;
961#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
966 template <
typename TContainer>
967 ETL_CONSTEXPR
typename TContainer::iterator
begin(TContainer& container)
969 return container.begin();
976 template <
typename TContainer>
977 ETL_CONSTEXPR
typename TContainer::const_iterator
begin(
const TContainer& container)
979 return container.begin();
986 template <
typename TContainer>
987 ETL_CONSTEXPR
typename TContainer::const_iterator
cbegin(
const TContainer& container)
989 return container.cbegin();
996 template <
typename TContainer>
997 ETL_CONSTEXPR
typename TContainer::iterator
end(TContainer& container)
999 return container.end();
1006 template <
typename TContainer>
1007 ETL_CONSTEXPR
typename TContainer::const_iterator
end(
const TContainer& container)
1009 return container.end();
1016 template <
typename TContainer>
1017 ETL_CONSTEXPR
typename TContainer::const_iterator
cend(
const TContainer& container)
1019 return container.cend();
1026 template <
typename TValue,
size_t Array_Size>
1036 template <
typename TValue,
size_t Array_Size>
1037 ETL_CONSTEXPR
const TValue*
begin(
const TValue (&
data)[Array_Size])
1046 template <
typename TValue,
size_t Array_Size>
1047 ETL_CONSTEXPR
const TValue*
cbegin(
const TValue (&
data)[Array_Size])
1056 template <
typename TValue,
size_t Array_Size>
1057 ETL_CONSTEXPR TValue*
end(TValue (&
data)[Array_Size])
1059 return &
data[Array_Size];
1066 template <
typename TValue,
size_t Array_Size>
1067 ETL_CONSTEXPR
const TValue*
end(
const TValue (&
data)[Array_Size])
1069 return &
data[Array_Size];
1076 template <
typename TValue,
size_t Array_Size>
1077 ETL_CONSTEXPR
const TValue*
cend(
const TValue (&
data)[Array_Size])
1079 return &
data[Array_Size];
1083#if ETL_NOT_USING_STL || ETL_CPP14_NOT_SUPPORTED
1088 template <
typename TContainer>
1089 ETL_CONSTEXPR
typename TContainer::reverse_iterator
rbegin(TContainer& container)
1091 return container.rbegin();
1098 template <
typename TContainer>
1099 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
rbegin(
const TContainer& container)
1101 return container.rbegin();
1108 template <
typename TContainer>
1109 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
crbegin(
const TContainer& container)
1111 return container.crbegin();
1118 template <
typename TContainer>
1119 ETL_CONSTEXPR
typename TContainer::reverse_iterator
rend(TContainer& container)
1121 return container.rend();
1128 template <
typename TContainer>
1129 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
rend(
const TContainer& container)
1131 return container.rend();
1138 template <
typename TContainer>
1139 ETL_CONSTEXPR
typename TContainer::const_reverse_iterator
crend(
const TContainer& container)
1141 return container.crend();
1148 template <
typename TValue,
size_t Array_Size>
1149 ETL_OR_STD::reverse_iterator<TValue*>
rbegin(TValue (&
data)[Array_Size])
1151 return ETL_OR_STD::reverse_iterator<TValue*>(&
data[Array_Size]);
1158 template <
typename TValue,
size_t Array_Size>
1159 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crbegin(
const TValue (&
data)[Array_Size])
1161 return ETL_OR_STD::reverse_iterator<const TValue*>(&
data[Array_Size]);
1168 template <
typename TValue,
size_t Array_Size>
1169 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<TValue*>
rend(TValue (&
data)[Array_Size])
1171 return ETL_OR_STD::reverse_iterator<TValue*>(&
data[0]);
1178 template <
typename TValue,
size_t Array_Size>
1179 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crend(
const TValue (&
data)[Array_Size])
1181 return ETL_OR_STD::reverse_iterator<const TValue*>(&
data[0]);
1185#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1191 template <
typename TContainer>
1192 ETL_CONSTEXPR
typename TContainer::size_type
size(
const TContainer& container)
1194 return container.size();
1202 template <
typename TValue,
size_t Array_Size>
1203 ETL_CONSTEXPR
size_t size(TValue (&)[Array_Size])
1216 template <
typename T,
size_t Array_Size>
1219#define ETL_ARRAY_SIZE(a) sizeof(etl::array_size(a))
1221#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1227 template <
typename TContainer>
1228 ETL_CONSTEXPR
typename TContainer::pointer
data(TContainer& container)
1230 return container.data();
1238 template <
typename TContainer>
1239 ETL_CONSTEXPR
typename TContainer::const_pointer
data(
const TContainer& container)
1241 return container.data();
1249 template <
typename TValue,
size_t Array_Size>
1250 ETL_CONSTEXPR TValue*
data(TValue (&a)[Array_Size])
1260 template <
typename TValue,
size_t Array_Size>
1261 ETL_CONSTEXPR
const TValue*
data(
const TValue (&a)[Array_Size])
1272 using iter_reference_t =
decltype(*etl::declval<T&>());
1276 using iter_const_reference_t =
typename etl::common_reference_t<const etl::iter_value_t<T>&&, etl::iter_reference_t<T>>;
1282 template <
class I,
class Proj>
1283 using projected_value_t = etl::remove_cvref_t<etl::invoke_result_t<Proj&, etl::iter_reference_t<I>>>;
1287 namespace private_ranges
1292 constexpr auto operator()(T& t)
const
1294 return ETL_OR_STD::begin(t);
1301 constexpr auto operator()(T& t)
const
1303 return ETL_OR_STD::end(t);
1310 constexpr auto operator()(T& t)
const
1312 return ETL_OR_STD::cbegin(t);
1319 constexpr auto operator()(T& t)
const
1321 return ETL_OR_STD::cend(t);
1328 constexpr auto operator()(T& t)
const
1330 return ETL_OR_STD::rbegin(t);
1337 constexpr auto operator()(T& t)
const
1339 return ETL_OR_STD::rend(t);
1346 constexpr auto operator()(T& t)
const
1348 return ETL_OR_STD::crbegin(t);
1355 constexpr auto operator()(T& t)
const
1357 return ETL_OR_STD::crend(t);
1361 template <
class T,
class =
void>
1367 struct has_size_member< T, etl::void_t<decltype(etl::declval<const T&>().size())>> : etl::true_type
1371 template <
class T,
class =
void>
1377 struct has_empty_member< T, etl::void_t<decltype(etl::declval<const T&>().empty())>> : etl::true_type
1384 template <typename I, typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1385 constexpr etl::iter_difference_t<I> operator()(I first, I last)
const
1387 if constexpr (etl::is_random_access_iterator_concept<I>::value)
1389 return last - first;
1393 etl::iter_difference_t<I> n = 0;
1394 while (!(first == last))
1404 template <
typename I,
typename S,
1405 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1406 && !etl::is_same<I, S>::value>>
1407 constexpr etl::iter_difference_t<I>
operator()(I first, S last)
const
1409 etl::iter_difference_t<I> n = 0;
1410 while (!(first == last))
1422 constexpr size_t operator()(T&& t)
const
1424 using U = etl::remove_cvref_t<T>;
1426 if constexpr (has_size_member<U>::value)
1428 return static_cast<size_t>(t.size());
1432 using iter_type =
decltype(ETL_OR_STD::begin(t));
1433 static_assert(etl::is_forward_iterator_concept<iter_type>::value,
"ranges::size requires a sized range or at least a forward range; "
1434 "single-pass input ranges are not supported");
1435 return static_cast<size_t>(distance{}(ETL_OR_STD::begin(t), ETL_OR_STD::end(t)));
1443 constexpr auto operator()(T&& t)
const
1445 using U = etl::remove_cvref_t<T>;
1447 if constexpr (has_size_member<U>::value)
1449 return static_cast<ptrdiff_t
>(t.size());
1453 using iter_type =
decltype(ETL_OR_STD::begin(t));
1454 static_assert(etl::is_forward_iterator_concept<iter_type>::value,
"ranges::ssize requires a sized range or at least a forward range; "
1455 "single-pass input ranges are not supported");
1456 return static_cast<ptrdiff_t
>(distance{}(ETL_OR_STD::begin(t), ETL_OR_STD::end(t)));
1464 constexpr auto operator()(T&& t)
const
1466 using U = etl::remove_cvref_t<T>;
1468 if constexpr (has_empty_member<U>::value)
1474 return ETL_OR_STD::cbegin(t) == ETL_OR_STD::cend(t);
1482 constexpr auto operator()(T& t)
const
1484 return ETL_OR_STD::data(t);
1491 constexpr etl::add_pointer_t< etl::add_const_t<etl::remove_pointer_t< decltype(ETL_OR_STD::data(etl::declval<T&>()))>>> operator()(T& t)
const
1493 return ETL_OR_STD::data(t);
1498 inline constexpr private_ranges::begin
begin;
1499 inline constexpr private_ranges::end
end;
1500 inline constexpr private_ranges::cbegin
cbegin;
1501 inline constexpr private_ranges::cend
cend;
1502 inline constexpr private_ranges::rbegin
rbegin;
1503 inline constexpr private_ranges::rend
rend;
1504 inline constexpr private_ranges::crbegin
crbegin;
1505 inline constexpr private_ranges::crend
crend;
1506 inline constexpr private_ranges::size
size;
1507 inline constexpr private_ranges::ssize ssize;
1508 inline constexpr private_ranges::empty empty;
1509 inline constexpr private_ranges::data
data;
1510 inline constexpr private_ranges::cdata cdata;
1511 inline constexpr private_ranges::distance distance;
1518 using iterator_t =
decltype(etl::ranges::begin(etl::declval<T&>()));
1521 using const_iterator_t =
decltype(etl::ranges::cbegin(etl::declval<T&>()));
1524 using sentinel_t =
decltype(etl::ranges::end(etl::declval<T&>()));
1527 using const_sentinel_t =
decltype(etl::ranges::cend(etl::declval<T&>()));
1530 using range_size_t =
decltype(etl::ranges::size(etl::declval<T&>()));
1533 using range_difference_t = etl::iter_difference_t<etl::ranges::iterator_t<T>>;
1536 using range_value_t = etl::iter_value_t<etl::ranges::iterator_t<T>>;
1539 using range_reference_t = etl::iter_reference_t<ranges::iterator_t<T>>;
1543 template <
typename I,
typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1544 && etl::is_
integral<etl::iter_difference_t<I>>::value>>
1545 constexpr void operator()(I& i, etl::iter_difference_t<I> n)
const
1547 if constexpr (etl::is_random_access_iterator_concept<I>::value)
1559 if constexpr (etl::is_bidirectional_iterator_concept<I>::value)
1570 template <
typename I,
typename S,
1571 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1572 && !etl::is_integral<S>::value>>
1573 constexpr void operator()(I& i, S bound)
const
1575 if constexpr (etl::is_assignable_v<I&, S>)
1577 i = etl::move(bound);
1579 else if constexpr (etl::is_same_v<S, I> && etl::is_random_access_iterator_concept<I>::value)
1581 (*this)(i, bound - i);
1585 while (!(i == bound))
1592 template <
typename I,
typename S,
1593 typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1594 constexpr etl::iter_difference_t<I> operator()(I& i, etl::iter_difference_t<I> n, S bound)
const
1596 if constexpr (etl::is_same_v<S, I> && etl::is_random_access_iterator_concept<I>::value)
1598 const auto dist = bound - i;
1600 if ((n >= 0 && dist >= 0 && n >= dist) || (n <= 0 && dist <= 0 && n <= dist))
1611 while (n > 0 && !(i == bound))
1617 if constexpr (etl::is_bidirectional_iterator_concept<I>::value)
1619 while (n < 0 && !(i == bound))
1631 inline constexpr auto advance = advance_fn();
1635 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1636 constexpr I operator()(I i)
const
1642 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1643 constexpr I operator()(I i, etl::iter_difference_t<I> n)
const
1645 ranges::advance(i, -n);
1649 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1650 constexpr I operator()(I i, etl::iter_difference_t<I> n, I bound)
const
1652 ranges::advance(i, -n, bound);
1657 inline constexpr auto prev = prev_fn();
1661 template <typename I, typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1662 constexpr I operator()(I i)
const
1668 template <
typename I,
typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1669 && etl::is_
integral<etl::iter_difference_t<I>>::value>>
1670 constexpr I operator()(I i, etl::iter_difference_t<I> n)
const
1672 ranges::advance(i, n);
1676 template <
typename I,
typename S,
1677 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1678 && !etl::is_integral<S>::value>>
1679 constexpr I
operator()(I i, S bound)
const
1681 ranges::advance(i, bound);
1685 template <
typename I,
typename S,
1686 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1687 && !etl::is_integral<S>::value>>
1688 constexpr I
operator()(I i, etl::iter_difference_t<I> n, S bound)
const
1690 ranges::advance(i, n, bound);
1695 inline constexpr auto next = next_fn();
1698 struct unreachable_sentinel_t
1702 inline constexpr unreachable_sentinel_t unreachable_sentinel{};
1704 template <
typename I>
1705 constexpr bool operator==(unreachable_sentinel_t,
const I&)
noexcept
1710 template <
typename I>
1711 constexpr bool operator==(
const I&, unreachable_sentinel_t)
noexcept
1716 template <
typename I>
1717 constexpr bool operator!=(unreachable_sentinel_t,
const I& i)
noexcept
1719 return !(unreachable_sentinel_t{} == i);
1722 template <
typename I>
1723 constexpr bool operator!=(
const I& i, unreachable_sentinel_t)
noexcept
1725 return !(i == unreachable_sentinel_t{});
1728 struct default_sentinel_t
1732 inline constexpr default_sentinel_t default_sentinel{};
1734 namespace private_iterator
1736 template <
typename T,
typename =
void>
1741 template <
typename T>
1742 struct has_arrow_operator< T, etl::void_t<decltype(etl::declval<const T&>().operator->())>> : etl::true_type
1752 template <
typename TValue>
1757 constexpr arrow_proxy(TValue value)
1758 : stored(etl::move(value))
1761 constexpr const TValue* operator->() const noexcept
1769 class counted_iterator
1772 friend class counted_iterator;
1776 using iterator_type = I;
1779 using iterator_category =
typename etl::iterator_traits<iterator_type>::iterator_category;
1780 using pointer =
typename etl::iterator_traits<iterator_type>::pointer;
1781 using reference =
typename etl::iterator_traits<iterator_type>::reference;
1783 constexpr counted_iterator() =
default;
1785 constexpr counted_iterator(I x, etl::iter_difference_t<I> n)
1786 : current(etl::move(x))
1792 constexpr counted_iterator(
const counted_iterator<I2>& other)
1793 : current(other.current)
1794 , length(other.length)
1799 constexpr counted_iterator& operator=(
const counted_iterator<I2>& other)
1801 current = other.current;
1802 length = other.length;
1806 constexpr const I& base() const& noexcept
1811 constexpr I base() &&
1813 return etl::move(current);
1816 constexpr etl::iter_difference_t<I> count() const noexcept
1821 constexpr decltype(
auto)
operator*()
const
1827 template <
typename J = I, etl::enable_if_t<(etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
1828 && private_iterator::has_arrow_operator<J>::value,
1830 constexpr auto operator->() const noexcept
1832 return current.operator->();
1836 template <
typename J = I, etl::enable_if_t<(etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
1837 && !private_iterator::has_arrow_operator<J>::value && etl::is_po
inter<J>::value,
1839 constexpr auto operator->() const noexcept
1846 template <
typename J = I, etl::enable_if_t< (etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
1847 && !private_iterator::has_arrow_operator<J>::value && !etl::is_po
inter<J>::value
1848 && etl::is_lvalue_reference< decltype(*etl::declval<const J&>())>::value,
1850 constexpr auto operator->() const noexcept
1858 template <
typename J = I, etl::enable_if_t< (etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
1859 && !private_iterator::has_arrow_operator<J>::value && !etl::is_po
inter<J>::value
1860 && !etl::is_lvalue_reference< decltype(*etl::declval<const J&>())>::value,
1862 constexpr auto operator->()
const
1864 return private_iterator::arrow_proxy<value_type>{*current};
1867 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1868 constexpr decltype(
auto)
operator[](etl::iter_difference_t<I> n)
const
1873 constexpr counted_iterator& operator++()
1880 constexpr counted_iterator operator++(
int)
1882 counted_iterator tmp = *
this;
1888 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1889 constexpr counted_iterator& operator+=(etl::iter_difference_t<I> n)
1896 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1897 constexpr counted_iterator
operator+(etl::iter_difference_t<I> n)
const
1899 counted_iterator result{*
this};
1904 constexpr counted_iterator& operator--()
1911 constexpr counted_iterator operator--(
int)
1913 counted_iterator tmp = *
this;
1919 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1920 constexpr counted_iterator& operator-=(etl::iter_difference_t<I> n)
1927 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1928 constexpr counted_iterator
operator-(etl::iter_difference_t<I> n)
const
1930 counted_iterator result{*
this};
1935 friend constexpr bool operator==(
const counted_iterator& x,
const counted_iterator& y)
1937 return x.length == y.length;
1940 friend constexpr bool operator==(
const counted_iterator& x, etl::default_sentinel_t)
1942 return x.count() == 0;
1945 friend constexpr bool operator==(etl::default_sentinel_t,
const counted_iterator& x)
1947 return x.count() == 0;
1950 friend constexpr bool operator!=(
const counted_iterator& x, etl::default_sentinel_t)
1952 return x.count() != 0;
1955 friend constexpr bool operator!=(etl::default_sentinel_t,
const counted_iterator& y)
1957 return y.count() != 0;
1960 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
1961 friend constexpr counted_iterator
operator+(etl::iter_difference_t<I> n,
const counted_iterator& x)
1963 return counted_iterator(x.current + n, x.length - n);
1966 friend constexpr etl::iter_difference_t<I>
operator-(
const counted_iterator& x,
const counted_iterator& y)
1968 return y.length - x.length;
1971 friend constexpr etl::iter_difference_t<I>
operator-(
const counted_iterator& x, etl::default_sentinel_t)
1976 friend constexpr etl::iter_difference_t<I>
operator-(etl::default_sentinel_t,
const counted_iterator& y)
1987 template <
typename TIterator,
1988 typename = etl::enable_if_t<etl::is_base_of< etl::counted_iterator<typename TIterator::iterator_type>, TIterator>::value>>
1989 constexpr typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, etl::default_sentinel_t)
1991 return first.count();
1996 template <
class T,
typename =
void>
2002 struct is_range< T, etl::void_t<decltype(ETL_OR_STD::begin(etl::declval<T&>())), decltype(ETL_OR_STD::end(etl::declval<T&>()))>> : etl::true_type
2007 template <
typename T>
2008 inline constexpr bool is_range_v = is_range<T>::value;
Turns assignment into push_back.
Definition iterator.h:605
ETL_CONSTEXPR14 back_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:651
ETL_CONSTEXPR14 back_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:613
ETL_CONSTEXPR14 back_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:621
ETL_NODISCARD ETL_CONSTEXPR14 back_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:643
ETL_CONSTEXPR14 back_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:659
Turns assignment into a push_front.
Definition iterator.h:687
ETL_CONSTEXPR14 front_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:695
ETL_CONSTEXPR14 front_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:731
ETL_CONSTEXPR14 front_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:739
ETL_NODISCARD ETL_CONSTEXPR14 front_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:723
ETL_CONSTEXPR14 front_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:703
Turns assignment into a push.
Definition iterator.h:767
ETL_NODISCARD ETL_CONSTEXPR14 push_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:805
ETL_CONSTEXPR14 push_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:783
ETL_CONSTEXPR14 push_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:813
ETL_CONSTEXPR14 push_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:775
ETL_CONSTEXPR14 push_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:821
Definition iterator.h:252
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:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
ETL_CONSTEXPR TContainer::reverse_iterator rend(TContainer &container)
Definition iterator.h:1119
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1228
ETL_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1109
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator-(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition circular_iterator.h:675
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1133
ETL_NODISCARD ETL_CONSTEXPR14 etl::push_insert_iterator< TContainer > push_inserter(TContainer &container)
Creates a push_insert_iterator from a container.
Definition iterator.h:835
ETL_NODISCARD ETL_CONSTEXPR14 etl::front_insert_iterator< TContainer > front_inserter(TContainer &container)
Creates a front_insert_iterator from a container.
Definition iterator.h:753
char(& array_size(T(&array)[Array_Size]))[Array_Size]
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1089
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1147
ETL_CONSTEXPR TContainer::const_iterator cbegin(const TContainer &container)
Definition iterator.h:987
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
ETL_NODISCARD ETL_CONSTEXPR14 etl::back_insert_iterator< TContainer > back_inserter(TContainer &container)
Creates a back_insert_iterator from a container.
Definition iterator.h:673
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:967
ETL_CONSTEXPR14 enable_if<!etl::is_specialization< TRep2, etl::chrono::duration >::value, etl::chrono::duration< typenameetl::common_type< TRep1, TRep2 >::type, TPeriod1 > >::type operator*(const etl::chrono::duration< TRep1, TPeriod1 > &lhs, const TRep2 &rhs) ETL_NOEXCEPT
Operator *.
Definition duration.h:541
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator+(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition circular_iterator.h:662
ETL_CONSTEXPR TContainer::const_reverse_iterator crend(const TContainer &container)
Definition iterator.h:1139
ETL_CONSTEXPR TContainer::const_iterator cend(const TContainer &container)
Definition iterator.h:1017
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1106
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1120
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997
Definition iterator.h:932
Definition iterator.h:872
Definition iterator.h:922
Definition iterator.h:863
Definition iterator.h:911
Definition iterator.h:854
Definition iterator.h:953
Definition iterator.h:891
Definition iterator.h:942
Definition iterator.h:882
iterator
Definition iterator.h:424