31#ifndef ETL_ITERATOR_INCLUDED
32#define ETL_ITERATOR_INCLUDED
40#if ETL_USING_STL || defined(ETL_IN_UNIT_TEST)
75 template <
typename TIterator,
typename =
void>
77 #if ETL_USING_STL && ETL_USING_CPP20
78 : std::iterator_traits<TIterator>
84 template <
typename TIterator>
85 struct iterator_traits<TIterator,
etl::void_t< typename TIterator::iterator_category, typename TIterator::value_type,
86 typename TIterator::difference_type, typename TIterator::pointer, typename TIterator::reference >>
88 typedef typename TIterator::iterator_category iterator_category;
89 typedef typename TIterator::value_type value_type;
90 typedef typename TIterator::difference_type difference_type;
91 typedef typename TIterator::pointer pointer;
92 typedef typename TIterator::reference reference;
95 #if ETL_USING_STL && ETL_USING_CPP20
97 template <
typename I,
typename S>
98 struct iterator_traits<std::common_iterator<I, S>, void> : std::iterator_traits<std::common_iterator<I, S>>
104 template <
typename T>
110 typedef typename etl::remove_cv<T>::type*
pointer;
115 template <
typename T>
121 typedef const typename etl::remove_cv<T>::type*
pointer;
128 template <
typename TIterator>
131 typedef typename TIterator::iterator_category iterator_category;
132 typedef typename TIterator::value_type value_type;
133 typedef typename TIterator::difference_type difference_type;
134 typedef typename TIterator::pointer pointer;
135 typedef typename TIterator::reference reference;
139 template <
typename T>
142 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
143 typedef T value_type;
144 typedef ptrdiff_t difference_type;
145 typedef typename etl::remove_cv<T>::type* pointer;
146 typedef T& reference;
150 template <
typename T>
153 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
154 typedef T value_type;
155 typedef ptrdiff_t difference_type;
156 typedef const typename etl::remove_cv<T>::type* pointer;
157 typedef const T& reference;
164 template <
typename TIterator,
typename TDistance>
165 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::input_iterator_tag)
173 template <
typename TIterator,
typename TDistance>
174 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::output_iterator_tag)
182 template <
typename TIterator,
typename TDistance>
183 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::forward_iterator_tag)
191 template <
typename TIterator,
typename TDistance>
192 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::bidirectional_iterator_tag)
210 template <
typename TIterator,
typename TDistance>
211 ETL_CONSTEXPR14
void advance_helper(TIterator& itr, TDistance n, ETL_OR_STD::random_access_iterator_tag)
213 typedef typename etl::iterator_traits<TIterator>::difference_type diff_t;
214 itr +=
static_cast<diff_t
>(n);
217 template <
typename TIterator,
typename TDistance>
218 ETL_CONSTEXPR14
void advance(TIterator& itr, TDistance n)
220 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
222 advance_helper(itr, n, tag());
227 template <
typename TIterator>
228 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last, ETL_OR_STD::input_iterator_tag)
230 typename etl::iterator_traits<TIterator>::difference_type d = 0;
232 while (first != last)
241 template <
typename TIterator>
242 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
243 ETL_OR_STD::forward_iterator_tag)
245 typename etl::iterator_traits<TIterator>::difference_type d = 0;
247 while (first != last)
256 template <
typename TIterator>
257 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
258 ETL_OR_STD::bidirectional_iterator_tag)
260 typename etl::iterator_traits<TIterator>::difference_type d = 0;
262 while (first != last)
271 template <
typename TIterator>
272 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance_helper(TIterator first, TIterator last,
273 ETL_OR_STD::random_access_iterator_tag)
278 template <
typename TIterator>
279 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, TIterator last)
281 typedef typename etl::iterator_traits<TIterator>::iterator_category tag;
283 return distance_helper(first, last, tag());
288 template <
typename TIterator>
289 ETL_CONSTEXPR14 TIterator prev(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
291 etl::advance(itr, -n);
298 template <
typename TIterator>
299 ETL_CONSTEXPR14 TIterator next(TIterator itr,
typename etl::iterator_traits<TIterator>::difference_type n = 1)
301 etl::advance(itr, n);
308 template <
typename TIterator>
309 class reverse_iterator
313 typedef typename iterator_traits<TIterator>::iterator_category iterator_category;
314 typedef typename iterator_traits<TIterator>::value_type value_type;
315 typedef typename iterator_traits<TIterator>::difference_type difference_type;
316 typedef typename iterator_traits<TIterator>::pointer pointer;
317 typedef typename iterator_traits<TIterator>::reference reference;
319 typedef TIterator iterator_type;
321 ETL_CONSTEXPR14 reverse_iterator()
326 ETL_CONSTEXPR14
explicit reverse_iterator(TIterator itr)
331 template <
typename TOther>
332 ETL_CONSTEXPR14 reverse_iterator(
const reverse_iterator<TOther>& other)
333 : current(other.base())
337 template <
class TOther>
338 ETL_CONSTEXPR14 reverse_iterator& operator=(
const reverse_iterator<TOther>& other)
340 current = other.base();
345 ETL_CONSTEXPR14 TIterator base()
const
350 ETL_NODISCARD ETL_CONSTEXPR14 reference operator*()
const
352 TIterator temp = current;
357 ETL_NODISCARD ETL_CONSTEXPR14 pointer operator->()
const
359 TIterator temp = current;
364 ETL_CONSTEXPR14 reverse_iterator& operator++()
371 ETL_CONSTEXPR14 reverse_iterator operator++(
int)
373 reverse_iterator temp = *
this;
379 ETL_CONSTEXPR14 reverse_iterator& operator--()
386 ETL_CONSTEXPR14 reverse_iterator operator--(
int)
388 reverse_iterator temp = *
this;
394 ETL_CONSTEXPR14 reverse_iterator& operator+=(
const difference_type offset)
401 ETL_CONSTEXPR14 reverse_iterator& operator-=(
const difference_type offset)
408 ETL_NODISCARD ETL_CONSTEXPR14 reverse_iterator operator+(
const difference_type offset)
const
410 return reverse_iterator(current - offset);
413 ETL_NODISCARD ETL_CONSTEXPR14 reverse_iterator operator-(
const difference_type offset)
const
415 return (reverse_iterator(current + offset));
418 ETL_NODISCARD ETL_CONSTEXPR14 reference operator[](
const difference_type offset)
const
420 return (*(*
this + offset));
428 template <
typename TIterator>
431 return lhs.base() == rhs.base();
434 template <
typename TIterator>
435 ETL_CONSTEXPR14
bool operator!=(
const reverse_iterator<TIterator>& lhs,
const reverse_iterator<TIterator>& rhs)
437 return !(lhs == rhs);
440 template <
typename TIterator>
443 return rhs.base() < lhs.base();
446 template <
typename TIterator>
452 template <
typename TIterator>
458 template <
typename TIterator>
464 template <
typename TIterator>
468 return rhs.base() - lhs.base();
471 template <
typename TIterator,
class TDifference>
474 return itr.operator+(n);
480 template <
typename TCategory,
typename T,
typename TDistance = ptrdiff_t,
typename TPo
inter = T*,
typename TReference = T& >
483 typedef T value_type;
484 typedef TDistance difference_type;
485 typedef TPointer pointer;
486 typedef TReference reference;
487 typedef TCategory iterator_category;
493 template <
typename TIterator>
498 typedef typename iterator_traits<TIterator>::iterator_category
iterator_category;
499 typedef typename iterator_traits<TIterator>::value_type
value_type;
500 typedef typename iterator_traits<TIterator>::difference_type
difference_type;
501 typedef TIterator iterator_type;
505 ETL_CONSTEXPR move_iterator()
510 ETL_CONSTEXPR
explicit move_iterator(TIterator itr)
515 template <
typename U>
516 ETL_CONSTEXPR move_iterator(
const move_iterator<U>& itr)
517 : current(itr.base())
521 template <
typename U>
522 ETL_CONSTEXPR14 move_iterator& operator=(
const move_iterator<U>& itr)
524 current = itr.current;
528 ETL_CONSTEXPR iterator_type base()
const
533 ETL_CONSTEXPR pointer operator->()
const
538 ETL_CONSTEXPR reference
operator*()
const
540 return etl::move(*current);
543 ETL_CONSTEXPR14 move_iterator& operator++()
549 ETL_CONSTEXPR14 move_iterator& operator--()
555 ETL_CONSTEXPR14 move_iterator operator++(
int)
557 move_iterator temp = *
this;
562 ETL_CONSTEXPR14 move_iterator operator--(
int)
564 move_iterator temp = *
this;
569 ETL_CONSTEXPR move_iterator
operator+(difference_type n)
const
571 return move_iterator(current + n);
574 ETL_CONSTEXPR move_iterator
operator-(difference_type n)
const
576 return move_iterator(current - n);
579 ETL_CONSTEXPR14 move_iterator& operator+=(difference_type n)
585 ETL_CONSTEXPR14 move_iterator& operator-=(difference_type n)
591 ETL_CONSTEXPR reference operator[](difference_type n)
const
593 return etl::move(current[n]);
601 template <
typename TIterator>
602 ETL_CONSTEXPR
bool operator==(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
604 return lhs.base() == rhs.base();
607 template <
typename TIterator>
608 ETL_CONSTEXPR
bool operator!=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
610 return !(lhs == rhs);
613 template <
typename TIterator>
614 ETL_CONSTEXPR
bool operator<(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
616 return lhs.base() < rhs.base();
619 template <
typename TIterator>
620 ETL_CONSTEXPR
bool operator<=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
625 template <
typename TIterator>
626 ETL_CONSTEXPR
bool operator>(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
631 template <
typename TIterator>
632 ETL_CONSTEXPR
bool operator>=(
const etl::move_iterator<TIterator>& lhs,
const etl::move_iterator<TIterator>& rhs)
637 template <
typename TIterator>
638 ETL_CONSTEXPR move_iterator<TIterator>
operator+(
typename move_iterator<TIterator>::difference_type n,
const move_iterator<TIterator>& rhs)
643 template <
typename TIterator1,
typename TIterator2 >
644 ETL_CONSTEXPR
auto operator-(
const move_iterator<TIterator1>& lhs,
const move_iterator<TIterator2>& rhs) ->
decltype(lhs.base() - rhs.base())
646 return lhs.base() - rhs.base();
649 template <
typename TIterator>
650 ETL_CONSTEXPR etl::move_iterator<TIterator> make_move_iterator(TIterator itr)
652 return etl::move_iterator<TIterator>(itr);
664 template <
typename TContainer>
669 typedef TContainer container_type;
684 container->push_back(value);
695 container->push_back(etl::move(value));
727 TContainer* container;
733 template <
typename TContainer>
746 template <
typename TContainer>
751 typedef TContainer container_type;
766 container->push_front(value);
776 container->push_front(etl::move(value));
807 TContainer* container;
813 template <
typename TContainer>
826 template <
typename TContainer>
831 typedef TContainer container_type;
846 container->push(value);
857 container->push(etl::move(value));
889 TContainer* container;
895 template <
typename TContainer>
904 template <
typename T>
907 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::input_iterator_tag>::value;
910 template <
typename T>
911 ETL_CONSTANT
bool is_input_iterator<T>::value;
913 template <
typename T>
916 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::output_iterator_tag>::value;
919 template <
typename T>
920 ETL_CONSTANT
bool is_output_iterator<T>::value;
922 template <
typename T>
925 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::forward_iterator_tag>::value;
928 template <
typename T>
929 ETL_CONSTANT
bool is_forward_iterator<T>::value;
931 template <
typename T>
934 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::bidirectional_iterator_tag>::value;
937 template <
typename T>
938 ETL_CONSTANT
bool is_bidirectional_iterator<T>::value;
941 template <
typename T>
944 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::random_access_iterator_tag>::value;
947 template <
typename T>
948 ETL_CONSTANT
bool is_random_iterator<T>::value;
950 template <
typename T>
953 static ETL_CONSTANT
bool value = etl::is_same<typename etl::iterator_traits<T>::iterator_category, ETL_OR_STD::random_access_iterator_tag>::value;
956 template <
typename T>
957 ETL_CONSTANT
bool is_random_access_iterator<T>::value;
959 template <
typename T>
963 ETL_CONSTANT
bool value = etl::is_input_iterator<T>::value || etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value
964 || etl::is_random_iterator<T>::value;
967 template <
typename T>
968 ETL_CONSTANT
bool is_input_iterator_concept<T>::value;
970 template <
typename T>
974 ETL_CONSTANT
bool value = etl::is_output_iterator<T>::value || etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value
975 || etl::is_random_iterator<T>::value;
978 template <
typename T>
979 ETL_CONSTANT
bool is_output_iterator_concept<T>::value;
981 template <
typename T>
985 ETL_CONSTANT
bool value = etl::is_forward_iterator<T>::value || etl::is_bidirectional_iterator<T>::value || etl::is_random_iterator<T>::value;
988 template <
typename T>
989 ETL_CONSTANT
bool is_forward_iterator_concept<T>::value;
991 template <
typename T>
994 static ETL_CONSTANT
bool value = etl::is_bidirectional_iterator<T>::value || etl::is_random_iterator<T>::value;
997 template <
typename T>
998 ETL_CONSTANT
bool is_bidirectional_iterator_concept<T>::value;
1001 template <
typename T>
1004 static ETL_CONSTANT
bool value = etl::is_random_iterator<T>::value;
1008 template <
typename T>
1009 ETL_CONSTANT
bool is_random_iterator_concept<T>::value;
1012 template <
typename T>
1015 static ETL_CONSTANT
bool value = etl::is_random_access_iterator<T>::value;
1019 template <
typename T>
1020 ETL_CONSTANT
bool is_random_access_iterator_concept<T>::value;
1028 namespace private_iterator
1031 template <
typename T,
typename =
void>
1036 template <
typename T>
1037 struct has_iterator_category<T,
etl::void_t<typename T::iterator_category>> : etl::true_type
1042 template <
typename T,
typename =
void>
1047 template <
typename T>
1048 struct is_container<
1049 T, etl::void_t< typename T::iterator, typename T::const_iterator, decltype(etl::declval<T&>().begin()), decltype(etl::declval<T&>().end()) >>
1050 : etl::bool_constant<!has_iterator_category<T>::value>
1056#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
1067 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<TContainer&>().begin())> >
1068 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::iterator>::type
1069 begin(TContainer& container)
1071 return container.begin();
1078 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().begin())> >
1079 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_iterator>::type
1080 begin(
const TContainer& container)
1082 return container.begin();
1089 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().cbegin())> >
1090 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_iterator>::type
1091 cbegin(
const TContainer& container)
1093 return container.cbegin();
1100 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<TContainer&>().end())> >
1101 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::iterator>::type
end(TContainer& container)
1103 return container.end();
1110 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().end())> >
1111 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_iterator>::type
1112 end(
const TContainer& container)
1114 return container.end();
1121 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().cend())> >
1122 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_iterator>::type
1123 cend(
const TContainer& container)
1125 return container.cend();
1135 template <
typename TContainer>
1136 typename TContainer::iterator
begin(TContainer& container)
1138 return container.begin();
1145 template <
typename TContainer>
1146 typename TContainer::const_iterator
begin(
const TContainer& container)
1148 return container.begin();
1155 template <
typename TContainer>
1156 typename TContainer::const_iterator
cbegin(
const TContainer& container)
1158 return container.cbegin();
1165 template <
typename TContainer>
1166 typename TContainer::iterator
end(TContainer& container)
1168 return container.end();
1175 template <
typename TContainer>
1176 typename TContainer::const_iterator
end(
const TContainer& container)
1178 return container.end();
1185 template <
typename TContainer>
1186 typename TContainer::const_iterator
cend(
const TContainer& container)
1188 return container.cend();
1196 template <
typename TValue,
size_t Array_Size>
1206 template <
typename TValue,
size_t Array_Size>
1207 ETL_CONSTEXPR
const TValue*
begin(
const TValue (&
data)[Array_Size])
1216 template <
typename TValue,
size_t Array_Size>
1217 ETL_CONSTEXPR
const TValue*
cbegin(
const TValue (&
data)[Array_Size])
1226 template <
typename TValue,
size_t Array_Size>
1227 ETL_CONSTEXPR TValue*
end(TValue (&
data)[Array_Size])
1229 return &
data[Array_Size];
1236 template <
typename TValue,
size_t Array_Size>
1237 ETL_CONSTEXPR
const TValue*
end(
const TValue (&
data)[Array_Size])
1239 return &
data[Array_Size];
1246 template <
typename TValue,
size_t Array_Size>
1247 ETL_CONSTEXPR
const TValue*
cend(
const TValue (&
data)[Array_Size])
1249 return &
data[Array_Size];
1253#if ETL_NOT_USING_STL || ETL_CPP14_NOT_SUPPORTED
1260 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<TContainer&>().rbegin())> >
1261 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::reverse_iterator>
::type
1262 rbegin(TContainer& container)
1264 return container.rbegin();
1271 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().rbegin())> >
1272 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_reverse_iterator>::type
1273 rbegin(
const TContainer& container)
1275 return container.rbegin();
1282 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().crbegin())> >
1283 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_reverse_iterator>::type
1284 crbegin(
const TContainer& container)
1286 return container.crbegin();
1293 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<TContainer&>().rend())> >
1294 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::reverse_iterator>::type
1295 rend(TContainer& container)
1297 return container.rend();
1304 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().rend())> >
1305 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_reverse_iterator>::type
1306 rend(
const TContainer& container)
1308 return container.rend();
1315 template <typename TContainer, typename = etl::void_t<decltype(etl::declval<const TContainer&>().crend())> >
1316 ETL_CONSTEXPR
typename etl::enable_if<private_iterator::is_container<TContainer>::value,
typename TContainer::const_reverse_iterator>::type
1317 crend(
const TContainer& container)
1319 return container.crend();
1329 template <
typename TContainer>
1330 typename TContainer::reverse_iterator
rbegin(TContainer& container)
1332 return container.rbegin();
1339 template <
typename TContainer>
1340 typename TContainer::const_reverse_iterator
rbegin(
const TContainer& container)
1342 return container.rbegin();
1349 template <
typename TContainer>
1350 typename TContainer::const_reverse_iterator
crbegin(
const TContainer& container)
1352 return container.crbegin();
1359 template <
typename TContainer>
1360 typename TContainer::reverse_iterator
rend(TContainer& container)
1362 return container.rend();
1369 template <
typename TContainer>
1370 typename TContainer::const_reverse_iterator
rend(
const TContainer& container)
1372 return container.rend();
1379 template <
typename TContainer>
1380 typename TContainer::const_reverse_iterator
crend(
const TContainer& container)
1382 return container.crend();
1390 template <
typename TValue,
size_t Array_Size>
1391 ETL_OR_STD::reverse_iterator<TValue*>
rbegin(TValue (&
data)[Array_Size])
1393 return ETL_OR_STD::reverse_iterator<TValue*>(&
data[Array_Size]);
1400 template <
typename TValue,
size_t Array_Size>
1401 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crbegin(
const TValue (&
data)[Array_Size])
1403 return ETL_OR_STD::reverse_iterator<const TValue*>(&
data[Array_Size]);
1410 template <
typename TValue,
size_t Array_Size>
1411 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<TValue*>
rend(TValue (&
data)[Array_Size])
1413 return ETL_OR_STD::reverse_iterator<TValue*>(&
data[0]);
1420 template <
typename TValue,
size_t Array_Size>
1421 ETL_CONSTEXPR ETL_OR_STD::reverse_iterator<const TValue*>
crend(
const TValue (&
data)[Array_Size])
1423 return ETL_OR_STD::reverse_iterator<const TValue*>(&
data[0]);
1427#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1433 template <
typename TContainer>
1434 ETL_CONSTEXPR
typename TContainer::size_type
size(
const TContainer& container)
1436 return container.size();
1444 template <
typename TValue,
size_t Array_Size>
1445 ETL_CONSTEXPR
size_t size(TValue (&)[Array_Size])
1458 template <
typename T,
size_t Array_Size>
1461#define ETL_ARRAY_SIZE(a) sizeof(etl::array_size(a))
1463#if ETL_NOT_USING_STL || ETL_CPP17_NOT_SUPPORTED
1469 template <
typename TContainer>
1470 ETL_CONSTEXPR
typename TContainer::pointer
data(TContainer& container)
1472 return container.data();
1480 template <
typename TContainer>
1481 ETL_CONSTEXPR
typename TContainer::const_pointer
data(
const TContainer& container)
1483 return container.data();
1491 template <
typename TValue,
size_t Array_Size>
1492 ETL_CONSTEXPR TValue*
data(TValue (&a)[Array_Size])
1502 template <
typename TValue,
size_t Array_Size>
1503 ETL_CONSTEXPR
const TValue*
data(
const TValue (&a)[Array_Size])
1514 using iter_reference_t =
decltype(*etl::declval<T&>());
1518 using iter_const_reference_t =
typename etl::common_reference_t<const etl::iter_value_t<T>&&, etl::iter_reference_t<T>>;
1524 template <
class I,
class Proj>
1525 using projected_value_t = etl::remove_cvref_t<etl::invoke_result_t<Proj&, etl::iter_reference_t<I>>>;
1529 namespace private_ranges
1534 constexpr auto operator()(T& t)
const
1536 return ETL_OR_STD::begin(t);
1543 constexpr auto operator()(T& t)
const
1545 return ETL_OR_STD::end(t);
1552 constexpr auto operator()(T& t)
const
1554 return ETL_OR_STD::cbegin(t);
1561 constexpr auto operator()(T& t)
const
1563 return ETL_OR_STD::cend(t);
1570 constexpr auto operator()(T& t)
const
1572 return ETL_OR_STD::rbegin(t);
1579 constexpr auto operator()(T& t)
const
1581 return ETL_OR_STD::rend(t);
1588 constexpr auto operator()(T& t)
const
1590 return ETL_OR_STD::crbegin(t);
1597 constexpr auto operator()(T& t)
const
1599 return ETL_OR_STD::crend(t);
1603 template <
class T,
class =
void>
1609 struct has_size_member< T, etl::void_t<decltype(etl::declval<const T&>().size())>> : etl::true_type
1613 template <
class T,
class =
void>
1619 struct has_empty_member< T, etl::void_t<decltype(etl::declval<const T&>().empty())>> : etl::true_type
1626 template <typename I, typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1627 constexpr etl::iter_difference_t<I> operator()(I first, I last)
const
1629 if constexpr (etl::is_random_access_iterator_concept<I>::value)
1631 return last - first;
1635 etl::iter_difference_t<I> n = 0;
1636 while (!(first == last))
1646 template <
typename I,
typename S,
1647 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1648 && !etl::is_same<I, S>::value>>
1649 constexpr etl::iter_difference_t<I>
operator()(I first, S last)
const
1651 etl::iter_difference_t<I> n = 0;
1652 while (!(first == last))
1664 constexpr size_t operator()(T&& t)
const
1666 using U = etl::remove_cvref_t<T>;
1668 if constexpr (has_size_member<U>::value)
1670 return static_cast<size_t>(t.size());
1674 using iter_type =
decltype(ETL_OR_STD::begin(t));
1675 static_assert(etl::is_forward_iterator_concept<iter_type>::value,
"ranges::size requires a sized range or at least a forward range; "
1676 "single-pass input ranges are not supported");
1677 return static_cast<size_t>(distance{}(ETL_OR_STD::begin(t), ETL_OR_STD::end(t)));
1685 constexpr auto operator()(T&& t)
const
1687 using U = etl::remove_cvref_t<T>;
1689 if constexpr (has_size_member<U>::value)
1691 return static_cast<ptrdiff_t
>(t.size());
1695 using iter_type =
decltype(ETL_OR_STD::begin(t));
1696 static_assert(etl::is_forward_iterator_concept<iter_type>::value,
"ranges::ssize requires a sized range or at least a forward range; "
1697 "single-pass input ranges are not supported");
1698 return static_cast<ptrdiff_t
>(distance{}(ETL_OR_STD::begin(t), ETL_OR_STD::end(t)));
1706 constexpr auto operator()(T&& t)
const
1708 using U = etl::remove_cvref_t<T>;
1710 if constexpr (has_empty_member<U>::value)
1716 return ETL_OR_STD::cbegin(t) == ETL_OR_STD::cend(t);
1724 constexpr auto operator()(T& t)
const
1726 return ETL_OR_STD::data(t);
1733 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
1735 return ETL_OR_STD::data(t);
1740 inline constexpr private_ranges::begin
begin;
1741 inline constexpr private_ranges::end
end;
1742 inline constexpr private_ranges::cbegin
cbegin;
1743 inline constexpr private_ranges::cend
cend;
1744 inline constexpr private_ranges::rbegin
rbegin;
1745 inline constexpr private_ranges::rend
rend;
1746 inline constexpr private_ranges::crbegin
crbegin;
1747 inline constexpr private_ranges::crend
crend;
1748 inline constexpr private_ranges::size
size;
1749 inline constexpr private_ranges::ssize ssize;
1750 inline constexpr private_ranges::empty empty;
1751 inline constexpr private_ranges::data
data;
1752 inline constexpr private_ranges::cdata cdata;
1753 inline constexpr private_ranges::distance distance;
1760 using iterator_t =
decltype(etl::ranges::begin(etl::declval<T&>()));
1763 using const_iterator_t =
decltype(etl::ranges::cbegin(etl::declval<T&>()));
1766 using sentinel_t =
decltype(etl::ranges::end(etl::declval<T&>()));
1769 using const_sentinel_t =
decltype(etl::ranges::cend(etl::declval<T&>()));
1772 using range_size_t =
decltype(etl::ranges::size(etl::declval<T&>()));
1775 using range_difference_t = etl::iter_difference_t<etl::ranges::iterator_t<T>>;
1778 using range_value_t = etl::iter_value_t<etl::ranges::iterator_t<T>>;
1781 using range_reference_t = etl::iter_reference_t<ranges::iterator_t<T>>;
1785 template <
typename I,
typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1786 && etl::is_
integral<etl::iter_difference_t<I>>::value>>
1787 constexpr void operator()(I& i, etl::iter_difference_t<I> n)
const
1789 if constexpr (etl::is_random_access_iterator_concept<I>::value)
1801 if constexpr (etl::is_bidirectional_iterator_concept<I>::value)
1812 template <
typename I,
typename S,
1813 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1814 && !etl::is_integral<S>::value>>
1815 constexpr void operator()(I& i, S bound)
const
1817 if constexpr (etl::is_assignable_v<I&, S>)
1819 i = etl::move(bound);
1821 else if constexpr (etl::is_same_v<S, I> && etl::is_random_access_iterator_concept<I>::value)
1823 (*this)(i, bound - i);
1827 while (!(i == bound))
1834 template <
typename I,
typename S,
1835 typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1836 constexpr etl::iter_difference_t<I> operator()(I& i, etl::iter_difference_t<I> n, S bound)
const
1838 if constexpr (etl::is_same_v<S, I> && etl::is_random_access_iterator_concept<I>::value)
1840 const auto dist = bound - i;
1842 if ((n >= 0 && dist >= 0 && n >= dist) || (n <= 0 && dist <= 0 && n <= dist))
1853 while (n > 0 && !(i == bound))
1859 if constexpr (etl::is_bidirectional_iterator_concept<I>::value)
1861 while (n < 0 && !(i == bound))
1873 inline constexpr auto advance = advance_fn();
1877 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1878 constexpr I operator()(I i)
const
1884 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1885 constexpr I operator()(I i, etl::iter_difference_t<I> n)
const
1887 ranges::advance(i, -n);
1891 template <typename I, typename = etl::enable_if_t< etl::is_bidirectional_iterator_concept<I>::value>>
1892 constexpr I operator()(I i, etl::iter_difference_t<I> n, I bound)
const
1894 ranges::advance(i, -n, bound);
1899 inline constexpr auto prev = prev_fn();
1903 template <typename I, typename = etl::enable_if_t< etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value>>
1904 constexpr I operator()(I i)
const
1910 template <
typename I,
typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1911 && etl::is_
integral<etl::iter_difference_t<I>>::value>>
1912 constexpr I operator()(I i, etl::iter_difference_t<I> n)
const
1914 ranges::advance(i, n);
1918 template <
typename I,
typename S,
1919 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1920 && !etl::is_integral<S>::value>>
1921 constexpr I
operator()(I i, S bound)
const
1923 ranges::advance(i, bound);
1927 template <
typename I,
typename S,
1928 typename = etl::enable_if_t< (etl::is_input_iterator_concept<I>::value || etl::is_output_iterator_concept<I>::value)
1929 && !etl::is_integral<S>::value>>
1930 constexpr I
operator()(I i, etl::iter_difference_t<I> n, S bound)
const
1932 ranges::advance(i, n, bound);
1937 inline constexpr auto next = next_fn();
1940 struct unreachable_sentinel_t
1944 inline constexpr unreachable_sentinel_t unreachable_sentinel{};
1946 template <
typename I>
1947 constexpr bool operator==(unreachable_sentinel_t,
const I&)
noexcept
1952 template <
typename I>
1953 constexpr bool operator==(
const I&, unreachable_sentinel_t)
noexcept
1958 template <
typename I>
1959 constexpr bool operator!=(unreachable_sentinel_t,
const I& i)
noexcept
1961 return !(unreachable_sentinel_t{} == i);
1964 template <
typename I>
1965 constexpr bool operator!=(
const I& i, unreachable_sentinel_t)
noexcept
1967 return !(i == unreachable_sentinel_t{});
1970 struct default_sentinel_t
1974 inline constexpr default_sentinel_t default_sentinel{};
1976 namespace private_iterator
1978 template <
typename T,
typename =
void>
1983 template <
typename T>
1984 struct has_arrow_operator< T, etl::void_t<decltype(etl::declval<const T&>().operator->())>> : etl::true_type
1994 template <
typename TValue>
1999 constexpr arrow_proxy(TValue value)
2000 : stored(etl::move(value))
2003 constexpr const TValue* operator->() const noexcept
2011 class counted_iterator
2014 friend class counted_iterator;
2018 using iterator_type = I;
2021 using iterator_category =
typename etl::iterator_traits<iterator_type>::iterator_category;
2022 using pointer =
typename etl::iterator_traits<iterator_type>::pointer;
2023 using reference =
typename etl::iterator_traits<iterator_type>::reference;
2025 constexpr counted_iterator() =
default;
2027 constexpr counted_iterator(I x, etl::iter_difference_t<I> n)
2028 : current(etl::move(x))
2034 constexpr counted_iterator(
const counted_iterator<I2>& other)
2035 : current(other.current)
2036 , length(other.length)
2041 constexpr counted_iterator& operator=(
const counted_iterator<I2>& other)
2043 current = other.current;
2044 length = other.length;
2048 constexpr const I& base() const& noexcept
2053 constexpr I base() &&
2055 return etl::move(current);
2058 constexpr etl::iter_difference_t<I> count() const noexcept
2063 constexpr decltype(
auto)
operator*()
const
2069 template <
typename J = I, etl::enable_if_t<(etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
2070 && private_iterator::has_arrow_operator<J>::value,
2072 constexpr auto operator->() const noexcept
2074 return current.operator->();
2078 template <
typename J = I, etl::enable_if_t<(etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
2079 && !private_iterator::has_arrow_operator<J>::value && etl::is_po
inter<J>::value,
2081 constexpr auto operator->() const noexcept
2088 template <
typename J = I, etl::enable_if_t< (etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
2089 && !private_iterator::has_arrow_operator<J>::value && !etl::is_po
inter<J>::value
2090 && etl::is_lvalue_reference< decltype(*etl::declval<const J&>())>::value,
2092 constexpr auto operator->() const noexcept
2100 template <
typename J = I, etl::enable_if_t< (etl::is_input_iterator_concept<J>::value || etl::is_output_iterator_concept<J>::value)
2101 && !private_iterator::has_arrow_operator<J>::value && !etl::is_po
inter<J>::value
2102 && !etl::is_lvalue_reference< decltype(*etl::declval<const J&>())>::value,
2104 constexpr auto operator->()
const
2106 return private_iterator::arrow_proxy<value_type>{*current};
2109 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2110 constexpr decltype(
auto)
operator[](etl::iter_difference_t<I> n)
const
2115 constexpr counted_iterator& operator++()
2122 constexpr counted_iterator operator++(
int)
2124 counted_iterator tmp = *
this;
2130 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2131 constexpr counted_iterator& operator+=(etl::iter_difference_t<I> n)
2138 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2139 constexpr counted_iterator
operator+(etl::iter_difference_t<I> n)
const
2141 counted_iterator result{*
this};
2146 constexpr counted_iterator& operator--()
2153 constexpr counted_iterator operator--(
int)
2155 counted_iterator tmp = *
this;
2161 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2162 constexpr counted_iterator& operator-=(etl::iter_difference_t<I> n)
2169 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2170 constexpr counted_iterator
operator-(etl::iter_difference_t<I> n)
const
2172 counted_iterator result{*
this};
2177 friend constexpr bool operator==(
const counted_iterator& x,
const counted_iterator& y)
2179 return x.length == y.length;
2182 friend constexpr bool operator==(
const counted_iterator& x, etl::default_sentinel_t)
2184 return x.count() == 0;
2187 friend constexpr bool operator==(etl::default_sentinel_t,
const counted_iterator& x)
2189 return x.count() == 0;
2192 friend constexpr bool operator!=(
const counted_iterator& x, etl::default_sentinel_t)
2194 return x.count() != 0;
2197 friend constexpr bool operator!=(etl::default_sentinel_t,
const counted_iterator& y)
2199 return y.count() != 0;
2202 template < typename J = I, etl::enable_if_t<etl::is_random_access_iterator<J>::value,
int> = 0>
2203 friend constexpr counted_iterator
operator+(etl::iter_difference_t<I> n,
const counted_iterator& x)
2205 return counted_iterator(x.current + n, x.length - n);
2208 friend constexpr etl::iter_difference_t<I>
operator-(
const counted_iterator& x,
const counted_iterator& y)
2210 return y.length - x.length;
2213 friend constexpr etl::iter_difference_t<I>
operator-(
const counted_iterator& x, etl::default_sentinel_t)
2218 friend constexpr etl::iter_difference_t<I>
operator-(etl::default_sentinel_t,
const counted_iterator& y)
2229 template <
typename TIterator,
2230 typename = etl::enable_if_t<etl::is_base_of< etl::counted_iterator<typename TIterator::iterator_type>, TIterator>::value>>
2231 constexpr typename etl::iterator_traits<TIterator>::difference_type distance(TIterator first, etl::default_sentinel_t)
2233 return first.count();
2238 template <
class T,
typename =
void>
2244 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
2249 template <
typename T>
2250 inline constexpr bool is_range_v = is_range<T>::value;
Turns assignment into push_back.
Definition iterator.h:666
ETL_CONSTEXPR14 back_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:712
ETL_CONSTEXPR14 back_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:674
ETL_CONSTEXPR14 back_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:682
ETL_NODISCARD ETL_CONSTEXPR14 back_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:704
ETL_CONSTEXPR14 back_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:720
Turns assignment into a push_front.
Definition iterator.h:748
ETL_CONSTEXPR14 front_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:756
ETL_CONSTEXPR14 front_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:792
ETL_CONSTEXPR14 front_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:800
ETL_NODISCARD ETL_CONSTEXPR14 front_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:784
ETL_CONSTEXPR14 front_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:764
Turns assignment into a push.
Definition iterator.h:828
ETL_NODISCARD ETL_CONSTEXPR14 push_insert_iterator & operator*()
Dereference operator.
Definition iterator.h:866
ETL_CONSTEXPR14 push_insert_iterator & operator=(const typename TContainer::value_type &value)
Assignment operator.
Definition iterator.h:844
ETL_CONSTEXPR14 push_insert_iterator & operator++()
Pre-increment operator.
Definition iterator.h:874
ETL_CONSTEXPR14 push_insert_iterator(TContainer &c)
Constructor.
Definition iterator.h:836
ETL_CONSTEXPR14 push_insert_iterator operator++(int)
Post-increment operator.
Definition iterator.h:882
Definition iterator.h:310
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1470
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:1130
ETL_NODISCARD ETL_CONSTEXPR14 etl::push_insert_iterator< TContainer > push_inserter(TContainer &container)
Creates a push_insert_iterator from a container.
Definition iterator.h:896
TContainer::const_iterator cbegin(const TContainer &container)
Definition iterator.h:1156
ETL_NODISCARD ETL_CONSTEXPR14 etl::front_insert_iterator< TContainer > front_inserter(TContainer &container)
Creates a front_insert_iterator from a container.
Definition iterator.h:814
char(& array_size(T(&array)[Array_Size]))[Array_Size]
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:1144
TContainer::reverse_iterator rend(TContainer &container)
Definition iterator.h:1360
TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1350
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
ETL_NODISCARD ETL_CONSTEXPR14 etl::back_insert_iterator< TContainer > back_inserter(TContainer &container)
Creates a back_insert_iterator from a container.
Definition iterator.h:734
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1434
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
TContainer::iterator end(TContainer &container)
Definition iterator.h:1166
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
TContainer::const_reverse_iterator crend(const TContainer &container)
Definition iterator.h:1380
TContainer::const_iterator cend(const TContainer &container)
Definition iterator.h:1186
TContainer::iterator begin(TContainer &container)
Definition iterator.h:1136
TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1330
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1103
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1117
Definition iterator.h:993
Definition iterator.h:933
Definition iterator.h:983
Definition iterator.h:924
Definition iterator.h:972
Definition iterator.h:915
Definition iterator.h:1014
Definition iterator.h:952
Definition iterator.h:1003
Definition iterator.h:943
Definition iterator.h:130
iterator
Definition iterator.h:482