31#ifndef ETL_RANGES_INCLUDED
32#define ETL_RANGES_INCLUDED
54 namespace private_ranges
56 template <
typename T,
typename Enable =
void>
57 struct iterator_trait;
60 struct iterator_trait<T, etl::enable_if_t<etl::is_class_v<T>>>
62 using iterator =
typename etl::conditional_t< etl::is_const_v<T>,
typename T::const_iterator,
typename T::iterator>;
63 using const_iterator =
typename T::const_iterator;
65 using value_type =
typename etl::iterator_traits<const_iterator>::value_type;
66 using difference_type =
typename etl::iterator_traits<const_iterator>::difference_type;
67 using pointer =
typename etl::iterator_traits<const_iterator>::pointer;
68 using reference =
typename etl::iterator_traits<const_iterator>::reference;
72 struct iterator_trait< T, etl::enable_if_t<etl::is_reference_v<T> && !etl::is_array_v<etl::remove_reference_t<T>>>>
75 typename etl::conditional_t< etl::is_const_v<etl::remove_reference_t<T>>,
typename etl::remove_reference<T>::type::const_iterator,
76 typename etl::remove_reference<T>::type::iterator>;
77 using const_iterator =
typename etl::remove_reference<T>::type::const_iterator;
79 using value_type =
typename etl::iterator_traits<iterator>::value_type;
80 using difference_type =
typename etl::iterator_traits<iterator>::difference_type;
81 using pointer =
typename etl::iterator_traits<iterator>::pointer;
82 using reference =
typename etl::iterator_traits<iterator>::reference;
86 struct iterator_trait< T, etl::enable_if_t<etl::is_array_v<etl::remove_reference_t<T>>>>
88 using value_type =
typename etl::remove_all_extents<etl::remove_reference_t<T>>::type;
89 using iterator = value_type*;
90 using const_iterator =
const value_type*;
91 using difference_type = ptrdiff_t;
92 using pointer =
const value_type*;
93 using reference =
const value_type&;
102 view_interface() =
default;
104 constexpr bool empty()
const
111 return static_cast<const D*
>(
this)->
begin();
116 return static_cast<const D*
>(
this)->
end();
119 operator bool()
const
126 return static_cast<size_t>(etl::distance(
cbegin(),
cend()));
129 constexpr decltype(
auto) front()
131 return *(
static_cast<D*
>(
this)->begin());
134 constexpr decltype(
auto) front()
const
139 template <
typename D2 = D,
140 etl::enable_if_t< etl::is_bidirectional_iterator_concept< decltype(etl::declval<const D2&>().begin())>::value,
int> = 0>
141 constexpr decltype(
auto) back()
143 return *(
static_cast<D*
>(
this)->end() - 1);
146 template <
typename D2 = D,
147 etl::enable_if_t< etl::is_bidirectional_iterator_concept< decltype(etl::declval<const D2&>().begin())>::value,
int> = 0>
148 constexpr decltype(
auto) back()
const
150 return *etl::prev(
cend());
153 constexpr decltype(
auto)
operator[](
size_t i)
155 auto it{
static_cast<D*
>(
this)->
begin()};
160 template < typename D2 = D, etl::enable_if_t<etl::is_random_access_iterator< decltype(etl::declval<const D2&>().begin())>::value,
int> = 0>
161 constexpr decltype(
auto) operator[](
size_t i)
163 return static_cast<D*
>(
this)->
begin()[i];
166 template < typename D2 = D, etl::enable_if_t<etl::is_random_access_iterator< decltype(etl::declval<const D2&>().begin())>::value,
int> = 0>
167 constexpr decltype(
auto) operator[](
size_t i)
const
180 return **(
static_cast<const I*
>(
this));
184 template <
class I,
class S = I>
185 class subrange :
public etl::ranges::view_interface<subrange<I, S>>
195 constexpr I
begin()
const
200 constexpr S
end()
const
205 constexpr subrange& advance(etl::iter_difference_t<I> n)
207 etl::advance(_begin, n);
211 constexpr subrange prev(etl::iter_difference_t<I> n = 1)
213 auto result = subrange{_begin, _end};
218 constexpr subrange next(etl::iter_difference_t<I> n = 1)
220 auto result = subrange{_begin, _end};
231 template <
class I,
class S>
232 subrange(I, S) -> subrange<I, S>;
235 class empty_view :
public etl::ranges::view_interface<empty_view<T>>
241 constexpr empty_view() =
default;
243 static constexpr iterator
begin() noexcept
248 static constexpr iterator
end() noexcept
253 static constexpr T*
data() noexcept
258 static constexpr size_t size() noexcept
263 static constexpr bool empty() noexcept
271 constexpr dangling() noexcept = default;
273 template <class... Args>
274 constexpr dangling(Args&&...) noexcept
280 constexpr bool enable_borrowed_range =
false;
283 struct is_borrowed_range
285 static constexpr bool value = etl::is_range_v<T> || etl::ranges::enable_borrowed_range<T>;
288 template <
typename T>
289 inline constexpr bool is_borrowed_range_v = is_borrowed_range<T>::value;
292 using borrowed_iterator_t = etl::conditional_t<etl::ranges::is_borrowed_range_v<T>, etl::ranges::iterator_t<T>, etl::ranges::dangling>;
295 using borrowed_subrange_t =
296 etl::conditional_t<etl::ranges::is_borrowed_range_v<T>, etl::ranges::subrange<etl::ranges::iterator_t<T>>, etl::ranges::dangling>;
301 constexpr empty_view<T> empty{};
305 class single_view :
public etl::ranges::view_interface<single_view<T>>
309 using value_type = T;
310 using iterator = value_type*;
311 using const_iterator =
const value_type*;
313 constexpr single_view(
const T& t) noexcept
318 constexpr single_view(T&& t) noexcept
319 : _value(etl::move(t))
323 constexpr single_view(
const single_view<T>& other)
324 : _value(other._value)
328 constexpr single_view(single_view<T>&& other)
329 : _value(etl::move(other._value))
333 constexpr single_view& operator=(
const single_view<T>& other)
335 _value = other._value;
339 constexpr single_view& operator=(single_view<T>&& other)
341 _value = etl::move(other._value);
345 constexpr iterator
begin() noexcept
350 constexpr const_iterator
begin() const noexcept
355 constexpr iterator
end() noexcept
360 constexpr const_iterator
end() const noexcept
365 constexpr const T*
data() const noexcept
370 constexpr T*
data() noexcept
375 constexpr size_t size() const noexcept
380 constexpr bool empty() const noexcept
391 single_view(T) -> single_view<T>;
395 namespace private_views
399 template <
typename T>
400 constexpr auto operator()(T&& t)
const
402 return etl::ranges::single_view(t);
407 inline constexpr private_views::single single;
410 template <
typename T>
411 struct iota_iterator :
public range_iterator<iota_iterator<T>>
415 using value_type = T;
416 using difference_type = ptrdiff_t;
418 using reference = T&;
420 using iterator_category = ETL_OR_STD::random_access_iterator_tag;
422 constexpr explicit iota_iterator(T i)
427 constexpr iota_iterator(
const iota_iterator& other)
432 iota_iterator& operator++()
438 iota_iterator operator++(
int)
440 iota_iterator tmp = *
this;
445 iota_iterator& operator--()
451 iota_iterator operator--(
int)
453 iota_iterator tmp = *
this;
458 iota_iterator& operator+=(difference_type n)
464 iota_iterator
operator+(difference_type n)
const
466 return iota_iterator{
static_cast<value_type
>(_i + n)};
469 iota_iterator
operator-(difference_type n)
const
471 return iota_iterator{
static_cast<value_type
>(_i - n)};
474 difference_type
operator-(iota_iterator other)
const
476 return _i - other._i;
479 iota_iterator& operator=(
const iota_iterator& other)
485 constexpr bool operator==(
const iota_iterator& other)
const
487 return _i == other._i;
490 constexpr bool operator!=(
const iota_iterator& other)
const
492 return _i != other._i;
511 class iota_view :
public etl::ranges::view_interface<iota_view<T>>
515 using iterator = iota_iterator<T>;
516 using const_iterator = iota_iterator<T>;
518 iota_view() =
default;
520 constexpr explicit iota_view(T value, T bound = etl::numeric_limits<T>::max())
526 constexpr iterator
begin() const noexcept
528 return iterator(_value);
531 constexpr iterator
end() const noexcept
533 return iterator(_bound);
536 constexpr size_t size() const noexcept
538 if (_bound == etl::numeric_limits<T>::max())
540 return etl::numeric_limits<T>::max();
542 return static_cast<size_t>(_bound - _value);
545 constexpr bool empty() const noexcept
547 return _value == _bound;
557 iota_view(T) -> iota_view<T>;
561 namespace private_views
565 template <
typename T,
typename B>
566 constexpr auto operator()(T&& t, B&& b)
const
568 return etl::ranges::iota_view(t, b);
573 inline constexpr private_views::iota
iota;
576 template <
typename T,
typename B = T>
577 struct repeat_iterator :
public range_iterator<repeat_iterator<T, B>>
581 using value_type = T;
582 using difference_type = ptrdiff_t;
584 using reference = T&;
586 using iterator_category = ETL_OR_STD::random_access_iterator_tag;
588 constexpr explicit repeat_iterator(T value, B i = etl::numeric_limits<B>::max())
594 constexpr repeat_iterator(
const repeat_iterator& other) =
default;
596 repeat_iterator& operator++()
602 repeat_iterator operator++(
int)
604 repeat_iterator tmp(*
this);
609 repeat_iterator& operator--()
615 repeat_iterator operator--(
int)
617 repeat_iterator tmp(*
this);
622 repeat_iterator& operator+=(difference_type n)
624 _i -=
static_cast<B
>(n);
628 repeat_iterator
operator+(difference_type n)
const
630 return repeat_iterator{_value,
static_cast<B
>(_i -
static_cast<B
>(n))};
633 repeat_iterator
operator-(difference_type n)
const
635 return repeat_iterator{_value,
static_cast<B
>(_i +
static_cast<B
>(n))};
638 difference_type
operator-(repeat_iterator other)
const
640 return other._i - _i;
643 repeat_iterator& operator=(
const repeat_iterator& other)
646 _value = other._value;
650 constexpr bool operator==(
const repeat_iterator& other)
const
652 return _i == other._i;
655 constexpr bool operator!=(
const repeat_iterator& other)
const
657 return _i != other._i;
676 template <
class T,
class B = T>
677 class repeat_view :
public etl::ranges::view_interface<repeat_view<T>>
681 using iterator = repeat_iterator<T, B>;
682 using const_iterator = repeat_iterator<T, B>;
684 repeat_view() =
default;
686 constexpr explicit repeat_view(T value, B bound = etl::numeric_limits<B>::max())
692 constexpr iterator
begin() const noexcept
694 return iterator(_value, _bound);
697 constexpr iterator
end() const noexcept
699 return iterator(_value, 0);
702 constexpr size_t size() const noexcept
704 return static_cast<size_t>(_bound);
707 constexpr bool empty() const noexcept
718 template <
class T,
class B = T>
719 repeat_view(T, B = B()) -> repeat_view<T, B>;
723 namespace private_views
727 template <
typename T,
typename B>
728 constexpr auto operator()(T&& t, B&& b)
const
730 return etl::ranges::repeat_view(t, b);
735 inline constexpr private_views::repeat repeat;
738 template <
class Range>
739 class range_adapter_closure
743 template <
class Range>
744 class ref_view :
public etl::ranges::view_interface<ref_view<Range>>
748 using iterator =
typename etl::ranges::private_ranges::iterator_trait<Range>::iterator;
749 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
750 using pointer =
typename etl::ranges::private_ranges::iterator_trait<Range>::pointer;
757 constexpr Range& base()
const
762 constexpr iterator
begin()
const
764 return iterator(ETL_OR_STD::begin(*_r));
767 constexpr iterator
end()
const
769 return iterator(ETL_OR_STD::end(*_r));
772 constexpr bool empty()
const
777 constexpr size_t size()
const
779 return static_cast<size_t>(etl::distance(
begin(),
end()));
782 constexpr pointer
data()
const
792 template <
class Range>
793 ref_view(Range&) -> ref_view<Range>;
795 struct ref_range_adapter_closure :
public range_adapter_closure<ref_range_adapter_closure>
797 template <
typename Range>
798 using target_view_type = ref_view<Range>;
800 ref_range_adapter_closure() =
default;
802 template <
typename Range>
803 ref_view<Range> operator()(Range& r)
805 return ref_view<Range>(r);
811 namespace private_views
815 template <
class Range>
816 constexpr auto operator()(Range& r)
const
818 return ranges::ref_view(r);
821 constexpr auto operator()()
const
823 return ranges::ref_range_adapter_closure();
828 inline constexpr private_views::ref ref;
831 template <
class Range>
832 class owning_view :
public etl::ranges::view_interface<owning_view<Range>>
836 using iterator =
typename etl::ranges::private_ranges::iterator_trait<Range>::iterator;
837 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
838 using pointer =
typename etl::ranges::private_ranges::iterator_trait<Range>::pointer;
840 owning_view() =
default;
842 owning_view(owning_view&& other) =
default;
844 constexpr owning_view(Range&& r)
849 owning_view& operator=(
const owning_view&) =
delete;
851 owning_view& operator=(owning_view&& other)
853 _r = etl::move(other._r);
857 constexpr Range& base() noexcept
862 constexpr iterator
begin()
const
864 return iterator(ETL_OR_STD::begin(_r));
867 constexpr iterator
end()
const
869 return iterator(ETL_OR_STD::end(_r));
872 constexpr bool empty()
const
877 constexpr size_t size()
const
879 return static_cast<size_t>(etl::distance(
begin(),
end()));
882 constexpr pointer
data()
892 template <
class Range>
893 owning_view(Range&&) -> owning_view<Range>;
895 struct owning_range_adapter_closure :
public range_adapter_closure<owning_range_adapter_closure>
897 template <
typename Range,
typename CleanRange = etl::remove_reference_t<Range>>
898 using target_view_type = owning_view<CleanRange>;
900 owning_range_adapter_closure() =
default;
902 template <
typename Range,
typename CleanRange = etl::remove_reference_t<Range>>
903 owning_view<CleanRange> operator()(Range&& r)
905 return owning_view<CleanRange>(etl::move(r));
911 namespace private_views
915 template <
class Range>
916 constexpr auto operator()(Range&& r)
const
918 return ranges::owning_view(etl::forward<Range>(r));
921 constexpr auto operator()()
const
923 return ranges::owning_range_adapter_closure();
928 inline constexpr private_views::owning owning;
933 namespace private_views
937 template <
class Range,
938 etl::enable_if_t<etl::is_base_of_v< etl::ranges::view_interface<etl::decay_t<Range>>, etl::decay_t<Range>>,
int> = 0>
939 constexpr etl::decay_t<Range> operator()(Range&& r)
const
944 template <
class Range,
945 etl::enable_if_t<!etl::is_base_of_v< etl::ranges::view_interface<etl::decay_t<Range>>, etl::decay_t<Range>>,
int> = 0>
946 constexpr auto operator()(Range&& r)
const
948 if constexpr (etl::is_lvalue_reference_v<Range>)
950 return etl::ranges::ref_view(etl::forward<Range>(r));
954 return etl::ranges::owning_view(etl::forward<Range>(r));
960 inline constexpr private_views::all all;
962 template <
typename R>
963 using all_t =
decltype(views::all(etl::declval<R>()));
966 template <
class Range,
class Pred>
967 class filter_iterator
971 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
973 using iterator =
typename trait::iterator;
974 using const_iterator =
typename trait::const_iterator;
975 using value_type =
typename trait::value_type;
976 using difference_type =
typename trait::difference_type;
977 using pointer =
typename trait::pointer;
978 using reference =
typename trait::reference;
980 using iterator_category = ETL_OR_STD::bidirectional_iterator_tag;
982 filter_iterator(const_iterator it, const_iterator it_end,
const Pred& p)
988 while (_it != _it_end && !_p(*_it))
994 filter_iterator(
const filter_iterator& other)
996 , _it_begin{other._it_begin}
997 , _it_end{other._it_end}
1000 while (_it != _it_end && !_p(*_it))
1006 filter_iterator& operator++()
1009 while (_it != _it_end && !_p(*_it))
1016 filter_iterator operator++(
int)
1018 filter_iterator tmp = *
this;
1021 while (_it != _it_end && !_p(*_it))
1029 filter_iterator& operator--()
1032 while (_it != _it_begin && !_p(*_it))
1039 filter_iterator operator--(
int)
1041 filter_iterator tmp = *
this;
1044 while (_it != _it_begin && !_p(*_it))
1052 filter_iterator& operator+=(
size_t n)
1054 for (
size_t i = 0; i < n; i++)
1065 filter_iterator& operator-=(
size_t n)
1067 for (
size_t i = 0; i < n; i++)
1069 if (_it != _it_begin)
1078 filter_iterator& operator=(
const filter_iterator& other)
1081 _it_begin = other._it_begin;
1082 _it_end = other._it_end;
1083 ETL_ASSERT(&_p == &other._p, ETL_ERROR_GENERIC(
"Predicates need to be the same"));
1092 bool operator==(
const filter_iterator& other)
const
1094 return other._it == _it;
1097 bool operator!=(
const filter_iterator& other)
const
1099 return !(*
this == other);
1105 const_iterator _it_begin;
1106 const_iterator _it_end;
1110 template <
class Range,
class Pred>
1111 constexpr typename filter_iterator<Range, Pred>::difference_type
operator-(
const filter_iterator<Range, Pred>& lhs,
1112 const filter_iterator<Range, Pred>& rhs)
1114 typename filter_iterator<Range, Pred>::difference_type result{0};
1115 filter_iterator<Range, Pred> it_up{rhs};
1116 while (it_up != lhs)
1124 template <
class Range,
typename Pred>
1125 class filter_view :
public etl::ranges::view_interface<filter_view<Range, Pred>>
1129 using iterator = filter_iterator<Range, Pred>;
1130 using const_iterator = filter_iterator<Range, Pred>;
1132 filter_view(Range&& r,
const Pred& pred)
1138 constexpr Range& base() const&
1143 constexpr const Pred& pred()
const
1148 constexpr const_iterator
begin()
const
1150 return const_iterator(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r), _pred);
1153 constexpr const_iterator
end()
const
1155 return const_iterator(ETL_OR_STD::cend(_r), ETL_OR_STD::cend(_r), _pred);
1164 template <
class Range,
typename Pred>
1165 filter_view(Range&&, Pred) -> filter_view<views::all_t<Range>, Pred>;
1167 template <
typename Pred>
1168 struct filter_range_adapter_closure :
public range_adapter_closure<filter_range_adapter_closure<Pred>>
1170 template <
typename Range>
1171 using target_view_type = filter_view<Range, Pred>;
1173 filter_range_adapter_closure(
const Pred& p)
1178 template <
typename Range>
1179 constexpr auto operator()(Range&& r)
1181 return filter_view(views::all(etl::forward<Range>(r)), _p);
1189 namespace private_views
1193 template <
class Range,
typename Pred>
1194 constexpr auto operator()(Range&& r,
const Pred& p)
const
1196 return filter_view(views::all(etl::forward<Range>(r)), p);
1199 template <
typename Pred>
1200 constexpr auto operator()(
const Pred& p)
const
1202 return ranges::filter_range_adapter_closure<Pred>(p);
1207 inline constexpr private_views::filter filter;
1210 template <
class Range,
class Fun>
1211 class transform_iterator
1215 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
1217 using iterator =
typename trait::iterator;
1218 using const_iterator =
typename trait::const_iterator;
1219 using value_type =
typename trait::value_type;
1220 using difference_type =
typename trait::difference_type;
1221 using pointer =
typename trait::pointer;
1222 using reference =
typename trait::reference;
1224 using iterator_category = ETL_OR_STD::forward_iterator_tag;
1226 transform_iterator(const_iterator it,
const Fun& f)
1232 transform_iterator(
const transform_iterator& other)
1238 transform_iterator& operator++()
1244 transform_iterator operator++(
int)
1246 transform_iterator tmp = *
this;
1251 transform_iterator& operator=(
const transform_iterator& other)
1254 ETL_ASSERT(&_f == &other._f, ETL_ERROR_GENERIC(
"Transform functions need to be the same"));
1260 return static_cast<value_type
>(_f(*_it));
1263 bool operator==(
const transform_iterator& other)
const
1265 return other._it == _it;
1268 bool operator!=(
const transform_iterator& other)
const
1270 return !(*
this == other);
1279 template <
class Range,
typename Fun>
1280 class transform_view :
public etl::ranges::view_interface<transform_view<Range, Fun>>
1284 using iterator = transform_iterator<Range, Fun>;
1285 using const_iterator = transform_iterator<Range, Fun>;
1287 transform_view(Range&& r,
const Fun& fun)
1293 constexpr Range& base() const&
1298 constexpr const_iterator
begin()
const
1300 return const_iterator(ETL_OR_STD::begin(_r), _fun);
1303 constexpr const_iterator
end()
const
1305 return const_iterator(ETL_OR_STD::end(_r), _fun);
1308 constexpr size_t size()
const
1310 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
1319 template <
class Range,
typename Fun>
1320 transform_view(Range&&, Fun) -> transform_view<views::all_t<Range>, Fun>;
1322 template <
typename Fun>
1323 struct transform_range_adapter_closure :
public range_adapter_closure<transform_range_adapter_closure<Fun>>
1325 template <
typename Range>
1326 using target_view_type = transform_view<Range, Fun>;
1328 transform_range_adapter_closure(
const Fun& f)
1333 template <
typename Range>
1334 constexpr auto operator()(Range&& r)
1336 return transform_view(views::all(etl::forward<Range>(r)), _f);
1344 namespace private_views
1348 template <
class Range,
typename Fun>
1349 constexpr auto operator()(Range&& r,
const Fun& f)
const
1351 return transform_view(views::all(etl::forward<Range>(r)), f);
1354 template <
typename Fun>
1355 constexpr auto operator()(
const Fun& f)
const
1357 return ranges::transform_range_adapter_closure<Fun>(f);
1362 inline constexpr private_views::transform transform;
1365 template <
class Range>
1366 class as_rvalue_view :
public etl::ranges::view_interface<as_rvalue_view<Range>>
1370 using iterator =
typename etl::move_iterator< typename etl::ranges::private_ranges::iterator_trait<Range>::iterator>;
1372 as_rvalue_view(
const as_rvalue_view& other) =
default;
1374 as_rvalue_view(Range&& r)
1379 constexpr Range& base()
const
1384 constexpr iterator
begin()
const
1386 return iterator(ETL_OR_STD::begin(_r));
1389 constexpr iterator
end()
const
1391 return iterator(ETL_OR_STD::end(_r));
1394 constexpr size_t size()
const
1396 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
1404 template <
class Range>
1405 as_rvalue_view(Range&&) -> as_rvalue_view<views::all_t<Range>>;
1407 struct as_rvalue_range_adapter_closure :
public range_adapter_closure<as_rvalue_range_adapter_closure>
1409 template <
typename Range>
1410 using target_view_type = as_rvalue_view<Range>;
1412 as_rvalue_range_adapter_closure() =
default;
1414 template <
typename Range>
1415 constexpr auto operator()(Range&& r)
1417 return as_rvalue_view(views::all(etl::forward<Range>(r)));
1423 namespace private_views
1427 template <
class Range>
1428 constexpr auto operator()(Range&& r)
const
1430 return as_rvalue_view(views::all(etl::forward<Range>(r)));
1433 constexpr auto operator()()
const
1435 return ranges::as_rvalue_range_adapter_closure();
1440 inline constexpr private_views::as_rvalue as_rvalue;
1443 template <
class Range>
1444 class as_const_view :
public etl::ranges::view_interface<as_const_view<Range>>
1448 using iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
1449 using const_iterator = iterator;
1451 as_const_view(
const as_const_view& other) =
default;
1453 as_const_view(Range&& r)
1458 constexpr Range& base()
const
1463 constexpr iterator
begin()
const
1465 return ETL_OR_STD::cbegin(_r);
1468 constexpr iterator
end()
const
1470 return ETL_OR_STD::cend(_r);
1473 constexpr size_t size()
const
1475 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
1483 template <
class Range>
1484 as_const_view(Range&&) -> as_const_view<views::all_t<Range>>;
1486 struct as_const_range_adapter_closure :
public range_adapter_closure<as_const_range_adapter_closure>
1488 template <
typename Range>
1489 using target_view_type = as_const_view<Range>;
1491 as_const_range_adapter_closure() =
default;
1493 template <
typename Range>
1494 constexpr auto operator()(Range&& r)
1496 return as_const_view(views::all(etl::forward<Range>(r)));
1502 namespace private_views
1506 template <
class Range>
1507 constexpr auto operator()(Range&& r)
const
1509 return as_const_view(views::all(etl::forward<Range>(r)));
1512 constexpr auto operator()()
const
1514 return ranges::as_const_range_adapter_closure();
1519 inline constexpr private_views::as_const
as_const;
1527 namespace private_ranges
1529 template <
typename T>
1530 struct cache_latest_cache
1532 cache_latest_cache()
1538 cache_latest_cache(
const cache_latest_cache&) =
delete;
1539 cache_latest_cache& operator=(
const cache_latest_cache&) =
delete;
1541 bool has_value()
const
1546 void set(
const T& v)
1570 template <
class Range>
1571 class cache_latest_iterator
1575 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
1577 using iterator =
typename trait::iterator;
1578 using const_iterator =
typename trait::const_iterator;
1579 using value_type =
typename trait::value_type;
1580 using difference_type =
typename trait::difference_type;
1581 using pointer = value_type*;
1582 using reference = value_type&;
1584 using iterator_category = ETL_OR_STD::forward_iterator_tag;
1586 cache_latest_iterator() =
default;
1588 cache_latest_iterator(const_iterator it, private_ranges::cache_latest_cache<value_type>* cache)
1594 cache_latest_iterator(
const cache_latest_iterator& other)
1596 , _cache(other._cache)
1600 cache_latest_iterator& operator++()
1610 cache_latest_iterator operator++(
int)
1612 cache_latest_iterator tmp = *
this;
1617 cache_latest_iterator& operator=(
const cache_latest_iterator& other)
1620 _cache = other._cache;
1626 if (_cache && !_cache->has_value())
1630 return _cache->value();
1633 pointer operator->()
const
1638 bool operator==(
const cache_latest_iterator& other)
const
1640 return other._it == _it;
1643 bool operator!=(
const cache_latest_iterator& other)
const
1645 return !(*
this == other);
1650 mutable const_iterator _it;
1651 private_ranges::cache_latest_cache<value_type>* _cache;
1660 template <
class Range>
1661 class cache_latest_view :
public etl::ranges::view_interface<cache_latest_view<Range>>
1665 using iterator = cache_latest_iterator<Range>;
1666 using const_iterator = cache_latest_iterator<Range>;
1667 using value_type =
typename etl::ranges::private_ranges::iterator_trait<Range>::value_type;
1669 cache_latest_view(Range&& r)
1675 cache_latest_view(
const cache_latest_view& other)
1681 constexpr Range& base() const&
1686 constexpr iterator
begin()
const
1689 return iterator(ETL_OR_STD::begin(_r), &_cache);
1692 constexpr iterator
end()
const
1694 return iterator(ETL_OR_STD::end(_r), &_cache);
1697 constexpr size_t size()
const
1699 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
1705 mutable private_ranges::cache_latest_cache<value_type> _cache;
1708 template <
class Range>
1709 cache_latest_view(Range&&) -> cache_latest_view<views::all_t<Range>>;
1711 struct cache_latest_range_adapter_closure :
public range_adapter_closure<cache_latest_range_adapter_closure>
1713 template <
typename Range>
1714 using target_view_type = cache_latest_view<Range>;
1716 cache_latest_range_adapter_closure() =
default;
1718 template <
typename Range>
1719 constexpr auto operator()(Range&& r)
1721 return cache_latest_view(views::all(etl::forward<Range>(r)));
1727 namespace private_views
1731 template <
class Range>
1732 constexpr auto operator()(Range&& r)
const
1734 return cache_latest_view(views::all(etl::forward<Range>(r)));
1737 constexpr auto operator()()
const
1739 return ranges::cache_latest_range_adapter_closure();
1744 inline constexpr private_views::cache_latest cache_latest;
1747 template <
class Range>
1748 class reverse_view :
public etl::ranges::view_interface<reverse_view<Range>>
1752 using iterator = ETL_OR_STD::reverse_iterator< typename etl::ranges::private_ranges::iterator_trait<Range>::iterator>;
1753 using const_iterator = ETL_OR_STD::reverse_iterator< typename etl::ranges::private_ranges::iterator_trait<Range>::const_iterator>;
1754 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
1756 constexpr reverse_view(Range&& r)
1761 reverse_view(
const reverse_view& other) =
default;
1763 constexpr Range base() const&
1768 constexpr iterator
begin()
const
1770 return iterator(ETL_OR_STD::end(_r));
1773 constexpr iterator
end()
const
1775 return iterator(ETL_OR_STD::begin(_r));
1778 constexpr size_t size()
const
1780 return static_cast<size_t>(etl::distance(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r)));
1788 template <
class Range>
1789 reverse_view(Range&&) -> reverse_view<views::all_t<Range>>;
1791 template <
typename T>
1796 template <
typename Range>
1797 struct is_reverse_view<reverse_view<Range>> : etl::true_type
1803 namespace private_views
1807 template <
class Range>
1808 constexpr auto operator()(Range&& r)
const
1810 if constexpr (is_reverse_view<etl::remove_cv_t< etl::remove_reference_t<Range>>>::value)
1816 return reverse_view(views::all(etl::forward<Range>(r)));
1822 inline constexpr private_views::reverse reverse;
1825 template <
class Range>
1826 class drop_view :
public etl::ranges::view_interface<drop_view<Range>>
1830 using iterator =
typename etl::ranges::private_ranges::iterator_trait<Range>::iterator;
1831 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
1832 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
1834 constexpr drop_view(Range&& r,
size_t drop_n)
1837 , _begin_cache{ETL_OR_STD::
end(_r)}
1838 , _begin_cache_valid{false}
1842 drop_view(
const drop_view& other) =
default;
1844 constexpr Range base() const&
1849 constexpr iterator
begin()
const
1851 if (!_begin_cache_valid)
1853 _begin_cache = drop_begin();
1854 _begin_cache_valid =
true;
1856 return _begin_cache;
1859 constexpr iterator
end()
const
1861 return iterator(ETL_OR_STD::end(_r));
1864 constexpr size_t size()
const
1866 if (!_begin_cache_valid)
1868 _begin_cache = drop_begin();
1869 _begin_cache_valid =
true;
1871 return static_cast<size_t>(etl::distance(_begin_cache, ETL_OR_STD::end(_r)));
1876 constexpr iterator drop_begin()
const
1878 iterator result{ETL_OR_STD::end(_r)};
1879 if (
static_cast<difference_type
>(_drop_n) < etl::distance(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r)))
1881 result = ETL_OR_STD::begin(_r);
1882 etl::advance(result, _drop_n);
1889 mutable iterator _begin_cache;
1890 mutable bool _begin_cache_valid;
1893 template <
class Range>
1894 drop_view(Range&&) -> drop_view<views::all_t<Range>>;
1896 struct drop_range_adapter_closure :
public range_adapter_closure<drop_range_adapter_closure>
1898 template <
typename Range>
1899 using target_view_type = drop_view<Range>;
1901 constexpr drop_range_adapter_closure(
size_t drop_n)
1906 template <
typename Range>
1907 constexpr auto operator()(Range&& r)
const
1909 return drop_view(views::all(etl::forward<Range>(r)), _drop_n);
1912 const size_t _drop_n;
1917 namespace private_views
1921 template <
class Range>
1922 constexpr auto operator()(Range&& r,
size_t drop_n)
const
1924 return drop_view(views::all(etl::forward<Range>(r)), drop_n);
1927 constexpr auto operator()(
size_t drop_n)
const
1929 return ranges::drop_range_adapter_closure(drop_n);
1934 inline constexpr private_views::drop drop;
1937 template <
class Range,
class Pred>
1938 class drop_while_view :
public etl::ranges::view_interface<drop_while_view<Range, Pred>>
1942 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
1943 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
1945 constexpr drop_while_view(Range&& r, Pred pred)
1949 , _begin_cache_valid{false}
1953 constexpr const Range base() const&
1958 constexpr const Pred& pred()
const
1963 constexpr const_iterator
begin()
const
1965 if (!_begin_cache_valid)
1967 const_iterator result{ETL_OR_STD::cbegin(_r)};
1968 while (result != ETL_OR_STD::cend(_r) && _pred(*result))
1972 _begin_cache = result;
1973 _begin_cache_valid =
true;
1975 return _begin_cache;
1978 constexpr const_iterator
end()
const
1980 return const_iterator(ETL_OR_STD::cend(_r));
1987 mutable const_iterator _begin_cache;
1988 mutable bool _begin_cache_valid;
1991 template <
class Range,
class Pred>
1992 drop_while_view(Range&&, Pred) -> drop_while_view<views::all_t<Range>, Pred>;
1994 template <
typename Pred>
1995 struct drop_while_range_adapter_closure :
public range_adapter_closure<drop_while_range_adapter_closure<Pred>>
1997 template <
typename Range>
1998 using target_view_type = drop_while_view<Range, Pred>;
2000 constexpr drop_while_range_adapter_closure(Pred& pred)
2005 template <
typename Range>
2006 constexpr auto operator()(Range&& r)
const
2008 return drop_while_view(views::all(etl::forward<Range>(r)), _pred);
2016 namespace private_views
2020 template <
class Range,
class Pred>
2021 constexpr auto operator()(Range&& r, Pred pred)
const
2023 return drop_while_view(views::all(etl::forward<Range>(r)), pred);
2026 template <
class Pred>
2027 constexpr auto operator()(Pred pred)
const
2029 return ranges::drop_while_range_adapter_closure(pred);
2034 inline constexpr private_views::drop_while drop_while;
2039 namespace private_views
2041 template <
typename T>
2042 constexpr T min(T a, T b)
2044 return a < b ? a : b;
2048 template <
class Range>
2049 class take_view :
public etl::ranges::view_interface<take_view<Range>>
2053 using iterator =
typename etl::ranges::private_ranges::iterator_trait<Range>::iterator;
2054 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
2055 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
2057 constexpr take_view(Range&& r, ranges::range_difference_t<Range> take_n)
2059 , _take_n{private_views::min<ranges::range_difference_t<Range>>(take_n, etl::distance(ETL_OR_STD::
cbegin(r), ETL_OR_STD::
cend(r)))}
2063 take_view(
const take_view& other) =
default;
2065 constexpr Range base() const&
2070 constexpr iterator
begin()
const
2072 return iterator(ETL_OR_STD::begin(_r));
2075 constexpr iterator
end()
const
2077 iterator result{
begin()};
2078 etl::advance(result, _take_n);
2082 constexpr ranges::range_difference_t<Range>
size()
const
2090 ranges::range_difference_t<Range> _take_n;
2093 template <
class Range>
2094 take_view(Range&&, ranges::range_difference_t<Range>) -> take_view<views::all_t<Range>>;
2096 struct take_range_adapter_closure :
public range_adapter_closure<take_range_adapter_closure>
2098 template <
typename Range>
2099 using target_view_type = take_view<Range>;
2101 template <
class DifferenceType>
2102 constexpr take_range_adapter_closure(DifferenceType take_n)
2103 : _take_n{static_cast<size_t>(take_n)}
2107 template <
typename Range>
2108 constexpr auto operator()(Range&& r)
const
2110 return take_view(views::all(etl::forward<Range>(r)),
static_cast<ranges::range_difference_t<Range>
>(_take_n));
2113 const size_t _take_n;
2118 namespace private_views
2122 template <
class Range>
2123 constexpr auto operator()(Range&& r, ranges::range_difference_t<Range> take_n)
const
2125 return take_view(views::all(etl::forward<Range>(r)), take_n);
2128 template <
class DifferenceType>
2129 constexpr auto operator()(DifferenceType take_n)
const
2131 return ranges::take_range_adapter_closure(take_n);
2136 inline constexpr private_views::take take;
2139 template <
class Range,
class Pred>
2140 class take_while_view :
public etl::ranges::view_interface<take_while_view<Range, Pred>>
2144 using iterator =
typename etl::ranges::private_ranges::iterator_trait<Range>::iterator;
2145 using const_iterator =
typename etl::ranges::private_ranges::iterator_trait< Range>::const_iterator;
2146 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
2148 constexpr take_while_view(Range&& r, Pred pred)
2150 , _pred{etl::move(pred)}
2152 , _end_cache_valid{false}
2156 constexpr const Range base() const&
2161 constexpr const Pred& pred()
const
2166 constexpr auto begin()
const
2168 return ETL_OR_STD::begin(_r);
2171 constexpr auto end()
const
2173 if (!_end_cache_valid)
2175 iterator result{ETL_OR_STD::begin(_r)};
2176 while (result != ETL_OR_STD::end(_r) && _pred(*result))
2180 _end_cache = result;
2181 _end_cache_valid =
true;
2190 mutable iterator _end_cache;
2191 mutable bool _end_cache_valid;
2194 template <
class Range,
class Pred>
2195 take_while_view(Range&&, Pred) -> take_while_view<views::all_t<Range>, Pred>;
2197 template <
typename Pred>
2198 struct take_while_range_adapter_closure :
public range_adapter_closure<take_while_range_adapter_closure<Pred>>
2200 template <
typename Range>
2201 using target_view_type = take_while_view<Range, Pred>;
2203 constexpr take_while_range_adapter_closure(Pred pred)
2204 : _pred{etl::move(pred)}
2208 template <
typename Range>
2209 constexpr auto operator()(Range&& r)
const
2211 return take_while_view(views::all(etl::forward<Range>(r)), _pred);
2219 namespace private_views
2223 template <
class Range,
class Pred>
2224 constexpr auto operator()(Range&& r, Pred&& pred)
const
2226 return take_while_view(views::all(etl::forward<Range>(r)), etl::forward<Pred>(pred));
2229 template <
class Pred>
2230 constexpr auto operator()(Pred&& pred)
const
2232 return ranges::take_while_range_adapter_closure(etl::forward<Pred>(pred));
2237 inline constexpr private_views::take_while take_while;
2240 template <
class Range>
2245 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
2247 using iterator =
typename trait::iterator;
2248 using const_iterator =
typename trait::const_iterator;
2249 using difference_type =
typename trait::difference_type;
2251 using iterator_category = ETL_OR_STD::forward_iterator_tag;
2253 using InnerRange =
decltype(*(ETL_OR_STD::begin(etl::declval<Range>())));
2254 using inner_trait =
typename etl::ranges::private_ranges::iterator_trait<InnerRange>;
2255 using inner_iterator =
typename inner_trait::iterator;
2257 using value_type =
typename inner_trait::value_type;
2258 using pointer =
typename inner_trait::pointer;
2259 using reference =
typename inner_trait::reference;
2261 join_iterator(iterator it, iterator it_end)
2264 , _inner_it(it != it_end ? ETL_OR_STD::
begin(*it) : inner_iterator{})
2265 , _inner_it_end(it != it_end ? ETL_OR_STD::
end(*it) : inner_iterator{})
2270 join_iterator(
const join_iterator& other) =
default;
2272 join_iterator& operator++()
2274 if (_inner_it != _inner_it_end)
2284 join_iterator operator++(
int)
2286 join_iterator tmp{*
this};
2288 if (_inner_it != _inner_it_end)
2298 join_iterator& operator=(
const join_iterator& other)
2301 _it_end = other._it_end;
2302 _inner_it = other._inner_it;
2303 _inner_it_end = other._inner_it_end;
2315 constexpr bool operator==(
const join_iterator& other)
const
2317 return (_it == other._it && _inner_it == other._inner_it) || (_it == _it_end && other._it == other._it_end);
2320 constexpr bool operator!=(
const join_iterator& other)
const
2322 return !(*
this == other);
2327 void adjust_iterator()
2329 while (_it != _it_end && _inner_it == _inner_it_end)
2334 _inner_it = ETL_OR_STD::begin((*_it));
2335 _inner_it_end = ETL_OR_STD::end((*_it));
2342 inner_iterator _inner_it;
2343 inner_iterator _inner_it_end;
2346 template <
class Range>
2347 class join_view :
public etl::ranges::view_interface<join_view<Range>>
2351 using iterator = join_iterator<Range>;
2352 using const_iterator = join_iterator<Range>;
2354 join_view(Range&& r)
2359 constexpr Range base() const&
2364 constexpr iterator
begin()
const
2366 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r));
2369 constexpr iterator
end()
const
2371 return iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r));
2379 struct join_range_adapter_closure :
public range_adapter_closure<join_range_adapter_closure>
2381 template <
typename Range>
2382 using target_view_type = join_view<Range>;
2384 join_range_adapter_closure() =
default;
2386 template <
typename Range>
2387 constexpr auto operator()(Range&& r)
2389 return join_view(views::all(etl::forward<Range>(r)));
2393 template <
class Range>
2394 explicit join_view(Range&&) -> join_view<views::all_t<Range>>;
2398 namespace private_views
2402 template <
class Range>
2403 constexpr auto operator()(Range&& r)
const
2405 return join_view(views::all(etl::forward<Range>(r)));
2408 constexpr auto operator()()
const
2410 return ranges::join_range_adapter_closure();
2415 inline constexpr private_views::join join;
2418 template <
class Range,
class Pattern>
2419 class join_with_iterator
2423 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
2425 using iterator =
typename trait::iterator;
2426 using const_iterator =
typename trait::const_iterator;
2427 using difference_type =
typename trait::difference_type;
2429 using iterator_category = ETL_OR_STD::forward_iterator_tag;
2431 using InnerRange =
decltype(*(ETL_OR_STD::begin(etl::declval<Range>())));
2432 using inner_trait =
typename etl::ranges::private_ranges::iterator_trait<InnerRange>;
2433 using inner_iterator =
typename inner_trait::iterator;
2435 using value_type =
typename inner_trait::value_type;
2436 using pointer =
typename inner_trait::pointer;
2437 using reference =
typename inner_trait::reference;
2439 using pattern_trait =
typename etl::ranges::private_ranges::iterator_trait<Pattern>;
2440 using pattern_iterator =
typename pattern_trait::iterator;
2441 using pattern_const_iterator =
typename pattern_trait::const_iterator;
2443 join_with_iterator(iterator it, iterator it_end,
const Pattern& pattern)
2446 , _inner_it(it != it_end ? ETL_OR_STD::
begin(*it) : inner_iterator{})
2447 , _inner_it_end(it != it_end ? ETL_OR_STD::
end(*it) : inner_iterator{})
2449 , _pattern_it(pattern.
cend())
2450 , _pattern_it_end(pattern.
cend())
2455 join_with_iterator(
const join_with_iterator& other) =
default;
2457 join_with_iterator& operator++()
2459 if (_pattern_it != _pattern_it_end)
2463 else if (_inner_it != _inner_it_end)
2473 join_with_iterator operator++(
int)
2475 join_with_iterator tmp{*
this};
2477 if (_pattern_it != _pattern_it_end)
2481 else if (_inner_it != _inner_it_end)
2491 join_with_iterator& operator=(
const join_with_iterator& other)
2494 _it_end = other._it_end;
2495 _inner_it = other._inner_it;
2496 _inner_it_end = other._inner_it_end;
2497 _pattern_it = other._pattern_it;
2498 _pattern_it_end = other._pattern_it_end;
2507 if (_pattern_it != _pattern_it_end)
2509 return *_pattern_it;
2514 constexpr bool operator==(
const join_with_iterator& other)
const
2516 return (_it == other._it && _inner_it == other._inner_it && _pattern_it == other._pattern_it) || (_it == _it_end);
2519 constexpr bool operator!=(
const join_with_iterator& other)
const
2521 return !(*
this == other);
2526 void adjust_iterator()
2528 if (_it != _it_end && _inner_it == _inner_it_end && _pattern_it == _pattern_it_end)
2533 _pattern_it = ETL_OR_STD::cbegin(_pattern);
2534 _pattern_it_end = ETL_OR_STD::cend(_pattern);
2535 _inner_it = ETL_OR_STD::begin(*_it);
2536 _inner_it_end = ETL_OR_STD::end(*_it);
2543 inner_iterator _inner_it;
2544 inner_iterator _inner_it_end;
2545 const Pattern& _pattern;
2546 pattern_const_iterator _pattern_it;
2547 pattern_const_iterator _pattern_it_end;
2550 template <
class Range,
class Pattern>
2551 class join_with_view :
public etl::ranges::view_interface<join_with_view<Range, Pattern>>
2555 using iterator = join_with_iterator<Range, Pattern>;
2556 using const_iterator = join_with_iterator<Range, Pattern>;
2558 join_with_view(Range&& r, Pattern&& pattern)
2560 , _pattern{etl::move(pattern)}
2564 constexpr Range base() const&
2569 constexpr iterator
begin()
const
2571 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _pattern);
2574 constexpr iterator
end()
const
2576 return iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _pattern);
2586 template <
class Range,
class Pattern>
2587 join_with_view(Range&&, Pattern&&) -> join_with_view<views::all_t<Range>, views::all_t<Pattern>>;
2590 template <
class Range>
2591 join_with_view(Range&&, etl::ranges::range_value_t<etl::ranges::range_reference_t<Range>>)
2592 -> join_with_view<views::all_t<Range>, etl::ranges::single_view<etl::ranges::range_value_t< etl::ranges::range_reference_t<Range>>>>;
2594 namespace private_ranges
2596 template <
class Pattern>
2597 constexpr auto make_pattern(Pattern&& pattern)
2599 if constexpr (etl::is_base_of_v<etl::ranges::view_interface<Pattern>, Pattern>)
2601 return etl::forward<Pattern>(pattern);
2605 return etl::ranges::single_view<Pattern>(etl::forward<Pattern>(pattern));
2609 template <
class Pattern>
2610 constexpr auto make_pattern(
const Pattern& pattern)
2612 if constexpr (etl::is_array_v<etl::remove_reference_t<Pattern>> || etl::is_range_v<etl::remove_reference_t<Pattern>>)
2614 return views::all(pattern);
2618 return etl::ranges::single_view<etl::remove_reference_t<Pattern>>(pattern);
2623 template <
class Pattern>
2624 struct join_with_range_adapter_closure :
public range_adapter_closure<join_with_range_adapter_closure<Pattern>>
2626 template <
typename Range>
2627 using target_view_type = join_with_view<Range, Pattern>;
2629 join_with_range_adapter_closure(
const Pattern& pattern)
2634 template <
typename Range>
2635 constexpr auto operator()(Range&& r)
2637 return join_with_view(views::all(etl::forward<Range>(r)), private_ranges::make_pattern<Pattern>(_pattern));
2640 const Pattern& _pattern;
2645 namespace private_views
2649 template <
class Range,
class Pattern>
2650 constexpr auto operator()(Range&& r, Pattern&& pattern)
const
2652 return join_with_view(views::all(etl::forward<Range>(r)),
2653 views::all(etl::ranges::private_ranges::make_pattern<Pattern>(etl::forward<Pattern>(pattern))));
2656 template <
class Pattern>
2657 constexpr auto operator()(
const Pattern& pattern)
const
2659 return ranges::join_with_range_adapter_closure(pattern);
2664 inline constexpr private_views::join_with join_with;
2667 template <
class Range,
class Pattern>
2668 class split_iterator
2672 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
2674 using iterator =
typename trait::iterator;
2675 using const_iterator =
typename trait::const_iterator;
2676 using difference_type =
typename trait::difference_type;
2678 using iterator_category = ETL_OR_STD::forward_iterator_tag;
2680 using pattern_trait =
typename etl::ranges::private_ranges::iterator_trait<Pattern>;
2681 using pattern_const_iterator =
typename pattern_trait::const_iterator;
2683 using value_type = etl::ranges::subrange<const_iterator>;
2684 using pointer = value_type*;
2685 using reference = value_type;
2687 split_iterator(const_iterator it, const_iterator it_end,
const Pattern& pattern,
bool is_end =
false)
2691 , _next(find_next())
2692 , _trailing_empty(!is_end && _it == _it_end)
2696 split_iterator(
const split_iterator& other) =
default;
2698 split_iterator& operator++()
2705 auto pat_size = etl::distance(ETL_OR_STD::cbegin(_pattern), ETL_OR_STD::cend(_pattern));
2706 for (difference_type i = 0; i < pat_size && _it != _it_end; ++i)
2710 _next = find_next();
2713 if (_it == _it_end && !_trailing_empty)
2715 _trailing_empty =
true;
2721 _trailing_empty =
false;
2727 split_iterator operator++(
int)
2729 split_iterator tmp{*
this};
2734 split_iterator& operator=(
const split_iterator& other)
2737 _it_end = other._it_end;
2738 _next = other._next;
2739 _trailing_empty = other._trailing_empty;
2745 return value_type(_it, _next);
2748 constexpr bool operator==(
const split_iterator& other)
const
2750 if (_it == _it_end && other._it == other._it_end)
2752 return _trailing_empty == other._trailing_empty;
2754 return _it == other._it;
2757 constexpr bool operator!=(
const split_iterator& other)
const
2759 return !(*
this == other);
2764 const_iterator find_next()
const
2766 auto pat_begin = ETL_OR_STD::cbegin(_pattern);
2767 auto pat_end = ETL_OR_STD::cend(_pattern);
2768 auto pat_size = etl::distance(pat_begin, pat_end);
2774 if (result != _it_end)
2781 for (
auto search = _it; search != _it_end; ++search)
2787 while (p != pat_end)
2789 if (s == _it_end || !(*s == *p))
2807 const_iterator _it_end;
2808 const Pattern& _pattern;
2809 const_iterator _next;
2812 bool _trailing_empty;
2815 template <
class Range,
class Pattern>
2816 class split_view :
public etl::ranges::view_interface<split_view<Range, Pattern>>
2820 using iterator = split_iterator<Range, Pattern>;
2821 using const_iterator = split_iterator<Range, Pattern>;
2823 split_view(Range&& r, Pattern&& pattern)
2825 , _pattern{etl::move(pattern)}
2829 constexpr Range& base() const&
2834 constexpr const Pattern& pattern()
const
2839 constexpr iterator
begin()
const
2841 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _pattern);
2844 constexpr iterator
end()
const
2846 auto it = iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _pattern,
true);
2857 template <
class Range,
class Pattern, etl::enable_if_t<etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
2858 split_view(Range&&, Pattern&&) -> split_view<views::all_t<Range>, views::all_t<Pattern>>;
2861 template <
class Range,
class Pattern, etl::enable_if_t<!etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
2862 split_view(Range&&, Pattern&&) -> split_view<views::all_t<Range>, etl::ranges::single_view<etl::decay_t<Pattern>>>;
2864 template <
class Pattern>
2865 struct split_range_adapter_closure :
public range_adapter_closure<split_range_adapter_closure<Pattern>>
2867 template <
typename Range>
2868 using target_view_type = split_view<Range, Pattern>;
2870 split_range_adapter_closure(
const Pattern& pattern)
2875 template <
typename Range>
2876 constexpr auto operator()(Range&& r)
2879 if constexpr (etl::is_class_v<etl::decay_t<Pattern>>)
2881 return split_view(views::all(etl::forward<Range>(r)), views::all(_pattern));
2885 return split_view(views::all(etl::forward<Range>(r)), etl::ranges::single_view(_pattern));
2889 const Pattern& _pattern;
2894 namespace private_views
2899 template <
class Range,
class Pattern, etl::enable_if_t<etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
2900 constexpr auto operator()(Range&& r, Pattern&& pattern)
const
2902 return split_view(views::all(etl::forward<Range>(r)), views::all(etl::forward<Pattern>(pattern)));
2906 template <
class Range,
class Pattern, etl::enable_if_t<!etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
2907 constexpr auto operator()(Range&& r, Pattern&& pattern)
const
2909 return split_view(views::all(etl::forward<Range>(r)), etl::ranges::single_view(pattern));
2913 template <
class Pattern>
2914 constexpr auto operator()(
const Pattern& pattern)
const
2916 return ranges::split_range_adapter_closure<Pattern>(pattern);
2921 inline constexpr private_views::split split;
2932 template <
class Range,
class Pattern>
2933 class lazy_split_view;
2938 template <
class Range,
class Pattern>
2939 class lazy_split_inner_range
2943 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
2944 using const_iterator_type =
typename trait::const_iterator;
2945 using value_type =
typename trait::value_type;
2947 using pattern_trait =
typename etl::ranges::private_ranges::iterator_trait<Pattern>;
2948 using pattern_const_iterator =
typename pattern_trait::const_iterator;
2954 using value_type =
typename trait::value_type;
2955 using difference_type =
typename trait::difference_type;
2956 using pointer =
const value_type*;
2957 using reference =
const value_type&;
2958 using iterator_category = ETL_OR_STD::forward_iterator_tag;
2960 iterator() =
default;
2962 iterator(const_iterator_type current, const_iterator_type segment_end,
bool is_end)
2964 , _segment_end(segment_end)
2965 , _is_end(is_end || (current == segment_end))
2974 pointer operator->()
const
2976 return &(*_current);
2979 iterator& operator++()
2982 if (_current == _segment_end)
2989 iterator operator++(
int)
2991 iterator tmp{*
this};
2996 constexpr bool operator==(
const iterator& other)
const
2998 if (_is_end && other._is_end)
3002 if (_is_end != other._is_end)
3006 return _current == other._current;
3009 constexpr bool operator!=(
const iterator& other)
const
3011 return !(*
this == other);
3016 const_iterator_type _current{};
3017 const_iterator_type _segment_end{};
3018 bool _is_end =
true;
3021 using const_iterator = iterator;
3023 lazy_split_inner_range(const_iterator_type segment_begin, const_iterator_type segment_end)
3024 : _segment_begin(segment_begin)
3025 , _segment_end(segment_end)
3029 iterator
begin()
const
3031 return iterator(_segment_begin, _segment_end,
false);
3034 iterator
end()
const
3036 return iterator(_segment_end, _segment_end,
true);
3041 return _segment_begin == _segment_end;
3046 const_iterator_type _segment_begin;
3047 const_iterator_type _segment_end;
3053 template <
class Range,
class Pattern>
3054 class lazy_split_iterator
3058 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
3060 using source_iterator =
typename trait::iterator;
3061 using const_iterator =
typename trait::const_iterator;
3062 using difference_type =
typename trait::difference_type;
3064 using iterator_category = ETL_OR_STD::forward_iterator_tag;
3066 using pattern_trait =
typename etl::ranges::private_ranges::iterator_trait<Pattern>;
3067 using pattern_const_iterator =
typename pattern_trait::const_iterator;
3069 using value_type = lazy_split_inner_range<Range, Pattern>;
3070 using pointer = value_type*;
3071 using reference = value_type;
3073 lazy_split_iterator(const_iterator it, const_iterator it_end,
const Pattern& pattern,
bool is_end =
false)
3077 , _next(find_next())
3078 , _trailing_empty(!is_end && _it == _it_end)
3082 lazy_split_iterator(
const lazy_split_iterator& other) =
default;
3084 lazy_split_iterator& operator=(
const lazy_split_iterator& other)
3087 _it_end = other._it_end;
3088 _next = other._next;
3089 _trailing_empty = other._trailing_empty;
3093 lazy_split_iterator& operator++()
3100 auto pat_size = etl::distance(ETL_OR_STD::cbegin(_pattern), ETL_OR_STD::cend(_pattern));
3101 for (difference_type i = 0; i < pat_size && _it != _it_end; ++i)
3105 _next = find_next();
3108 if (_it == _it_end && !_trailing_empty)
3110 _trailing_empty =
true;
3116 _trailing_empty =
false;
3122 lazy_split_iterator operator++(
int)
3124 lazy_split_iterator tmp{*
this};
3133 return value_type(_it, _next);
3136 constexpr bool operator==(
const lazy_split_iterator& other)
const
3138 if (_it == _it_end && other._it == other._it_end)
3140 return _trailing_empty == other._trailing_empty;
3142 return _it == other._it;
3145 constexpr bool operator!=(
const lazy_split_iterator& other)
const
3147 return !(*
this == other);
3154 const_iterator find_next()
const
3156 auto pat_begin = ETL_OR_STD::cbegin(_pattern);
3157 auto pat_end = ETL_OR_STD::cend(_pattern);
3158 auto pat_size = etl::distance(pat_begin, pat_end);
3164 if (result != _it_end)
3171 for (
auto search = _it; search != _it_end; ++search)
3177 while (p != pat_end)
3179 if (s == _it_end || !(*s == *p))
3197 const_iterator _it_end;
3198 const Pattern& _pattern;
3199 const_iterator _next;
3200 bool _trailing_empty;
3203 template <
class Range,
class Pattern>
3204 class lazy_split_view :
public etl::ranges::view_interface<lazy_split_view<Range, Pattern>>
3208 using iterator = lazy_split_iterator<Range, Pattern>;
3209 using const_iterator = lazy_split_iterator<Range, Pattern>;
3211 lazy_split_view(Range&& r, Pattern&& pattern)
3213 , _pattern{etl::move(pattern)}
3217 constexpr Range& base() const&
3222 constexpr const Pattern& pattern()
const
3227 constexpr iterator
begin()
const
3229 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _pattern);
3232 constexpr iterator
end()
const
3234 return iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _pattern,
true);
3244 template <
class Range,
class Pattern, etl::enable_if_t<etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
3245 lazy_split_view(Range&&, Pattern&&) -> lazy_split_view<views::all_t<Range>, views::all_t<Pattern>>;
3248 template <
class Range,
class Pattern, etl::enable_if_t<!etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
3249 lazy_split_view(Range&&, Pattern&&) -> lazy_split_view<views::all_t<Range>, etl::ranges::single_view<etl::decay_t<Pattern>>>;
3251 template <
class Pattern>
3252 struct lazy_split_range_adapter_closure :
public range_adapter_closure<lazy_split_range_adapter_closure<Pattern>>
3254 template <
typename Range>
3255 using target_view_type = lazy_split_view<Range, Pattern>;
3257 lazy_split_range_adapter_closure(
const Pattern& pattern)
3262 template <
typename Range>
3263 constexpr auto operator()(Range&& r)
3265 if constexpr (etl::is_class_v<etl::decay_t<Pattern>>)
3267 return lazy_split_view(views::all(etl::forward<Range>(r)), views::all(_pattern));
3271 return lazy_split_view(views::all(etl::forward<Range>(r)), etl::ranges::single_view(_pattern));
3275 const Pattern& _pattern;
3280 namespace private_views
3285 template <
class Range,
class Pattern, etl::enable_if_t<etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
3286 constexpr auto operator()(Range&& r, Pattern&& pattern)
const
3288 return lazy_split_view(views::all(etl::forward<Range>(r)), views::all(etl::forward<Pattern>(pattern)));
3292 template <
class Range,
class Pattern, etl::enable_if_t<!etl::is_
class_v<etl::decay_t<Pattern>>,
int> = 0>
3293 constexpr auto operator()(Range&& r, Pattern&& pattern)
const
3295 return lazy_split_view(views::all(etl::forward<Range>(r)), etl::ranges::single_view(pattern));
3299 template <
class Pattern>
3300 constexpr auto operator()(
const Pattern& pattern)
const
3302 return ranges::lazy_split_range_adapter_closure<Pattern>(pattern);
3307 inline constexpr private_views::lazy_split lazy_split;
3312 namespace private_views
3316 template <
class Iterator,
class DifferenceType>
3317 constexpr auto operator()(Iterator&& it, DifferenceType&& count)
const
3319 using T = etl::decay_t<
decltype(it)>;
3320 using D = etl::iter_difference_t<T>;
3331 if constexpr (etl::is_same_v< typename etl::iterator_traits< Iterator>::iterator_category, ETL_OR_STD::random_access_iterator_tag>)
3333 return etl::ranges::subrange(it, it +
static_cast<D
>(count));
3337 return etl::ranges::subrange(etl::counted_iterator(it, count), etl::default_sentinel);
3343 inline constexpr private_views::counted counted;
3346 template <
class... Ranges>
3349 template <
class... Ranges>
3350 class concat_iterator
3352 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3356 using types =
typename etl::type_list<Ranges...>;
3357 using first_range =
typename etl::type_list_type_at_index_t<types, 0>;
3358 using value_type =
typename etl::ranges::private_ranges::iterator_trait< first_range>::value_type;
3359 using reference =
typename etl::ranges::private_ranges::iterator_trait< first_range>::reference;
3360 using difference_type = ptrdiff_t;
3362 using iterator_variant_type =
typename concat_view<Ranges...>::iterator_variant_type;
3364 concat_iterator(
size_t index, concat_view<Ranges...>& view, iterator_variant_type current)
3365 : _ranges_index{index}
3371 concat_iterator(
const concat_iterator& other) =
default;
3375 return _view.get_value(_ranges_index, _current);
3378 constexpr decltype(
auto)
operator[](difference_type pos)
const
3383 for (difference_type i = 0; i < pos; ++i)
3385 tmp._view.advance(tmp._ranges_index, tmp._current, 1);
3390 for (difference_type i = 0; i < -pos; ++i)
3392 tmp._view.advance(tmp._ranges_index, tmp._current, -1);
3398 constexpr concat_iterator& operator++()
3400 _view.advance(_ranges_index, _current, 1);
3404 constexpr concat_iterator operator++(
int)
3406 auto result = *
this;
3407 _view.advance(_ranges_index, _current, 1);
3411 constexpr concat_iterator& operator--()
3413 _view.advance(_ranges_index, _current, -1);
3417 constexpr concat_iterator operator--(
int)
3419 auto result = *
this;
3420 _view.advance(_ranges_index, _current, -1);
3424 constexpr concat_iterator& operator+=(difference_type n)
3426 for (difference_type i = 0; i < n; ++i)
3428 _view.advance(_ranges_index, _current, 1);
3433 constexpr concat_iterator& operator-=(difference_type n)
3435 for (difference_type i = 0; i < n; ++i)
3437 _view.advance(_ranges_index, _current, -1);
3442 friend constexpr bool operator==(
const concat_iterator<Ranges...>& x, etl::default_sentinel_t)
3444 return x._ranges_index == x._view.number_of_ranges - 1
3448 friend constexpr bool operator==(
const concat_iterator<Ranges...>& x,
const concat_iterator<Ranges...>& y)
3450 return x._ranges_index == y._ranges_index && x._current.index() == y._current.index() && x._current == y._current;
3453 friend constexpr bool operator!=(
const concat_iterator<Ranges...>& x, etl::default_sentinel_t)
3455 return !(x == etl::default_sentinel);
3458 friend constexpr bool operator!=(
const concat_iterator<Ranges...>& x,
const concat_iterator<Ranges...>& y)
3465 size_t _ranges_index;
3466 const concat_view<Ranges...>& _view;
3467 iterator_variant_type _current;
3470 template <
class... Ranges>
3471 class concat_view :
public etl::ranges::view_interface<concat_view<Ranges...>>
3473 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3477 using types =
typename etl::type_list<Ranges...>;
3478 using first_range =
typename etl::type_list_type_at_index_t<types, 0>;
3479 using value_type =
typename etl::ranges::private_ranges::iterator_trait< first_range>::value_type;
3480 using reference =
typename etl::ranges::private_ranges::iterator_trait< first_range>::reference;
3481 using iterator = concat_iterator<Ranges...>;
3482 using const_iterator = concat_iterator<Ranges...>;
3483 using difference_type =
typename etl::make_signed_t<size_t>;
3485 using iterator_variant_type =
3486 etl::ranges::private_ranges::mini_variant< typename etl::ranges::private_ranges::iterator_trait< Ranges>::iterator...>;
3488 using get_value_delegates_type = reference (*)(
const iterator_variant_type& );
3489 using advance_delegates_type = void (*)(
size_t& ,
const etl::tuple<Ranges...>& , iterator_variant_type& ,
3492 static constexpr const size_t number_of_ranges =
sizeof...(Ranges);
3494 constexpr concat_view(Ranges&&... r)
3495 : _r{etl::move(r)...}
3500 concat_view(
const concat_view& other) =
default;
3502 constexpr iterator
begin()
3504 iterator_variant_type current;
3506 return iterator{0, *
this, current};
3509 constexpr iterator
end()
3511 iterator_variant_type current;
3512 current.template emplace<number_of_ranges - 1>(
etl::get<number_of_ranges - 1>(_r).end());
3513 return iterator{number_of_ranges - 1, *
this, current};
3516 constexpr size_t size()
const
3523 template <
class... Rs>
3524 friend class concat_iterator;
3526 template <
size_t n = 0>
3527 constexpr size_t get_size()
const
3529 if constexpr (n < etl::tuple_size_v<
decltype(_r)>)
3531 return etl::get<n>(_r).size() + get_size<n + 1>();
3540 void advance(
size_t& index, iterator_variant_type& current, difference_type n)
const
3542 advance_delegates[index](index, _r, current, n);
3545 template <
size_t i = 0>
3546 void set_delegates()
3548 if constexpr (i < number_of_ranges)
3550 advance_delegates[i] = [](
size_t& index,
const etl::tuple<Ranges...>& r, iterator_variant_type& current, difference_type n)
3562 if constexpr (i + 1 < number_of_ranges)
3570 ETL_ASSERT(it == end && i + 1 == number_of_ranges, ETL_ERROR_GENERIC(
"Wrong iterator state at end"));
3580 if constexpr (i > 0)
3582 current.template emplace<i - 1>(
etl::get<i - 1>(r).end());
3586 auto& it2 =
etl::get<i - 1>(current);
3595 ETL_ASSERT(it == begin && i == 0, ETL_ERROR_GENERIC(
"Wrong iterator state at begin"));
3605 get_value_delegates[i] = [](
const iterator_variant_type& current) -> reference
3610 set_delegates<i + 1>();
3614 reference get_value(
size_t index,
const iterator_variant_type& current)
const
3616 return get_value_delegates[index](current);
3619 etl::tuple<Ranges...> _r;
3620 get_value_delegates_type get_value_delegates[number_of_ranges];
3621 advance_delegates_type advance_delegates[number_of_ranges];
3624 template <
class... Ranges>
3625 concat_view(Ranges&&...) -> concat_view<views::all_t<Ranges>...>;
3627 struct concat_range_adapter_closure :
public range_adapter_closure<concat_range_adapter_closure>
3629 template <
typename... Ranges>
3630 using target_view_type = concat_view<Ranges...>;
3632 constexpr concat_range_adapter_closure() =
default;
3634 template <
typename... Ranges>
3635 constexpr auto operator()(Ranges&&... r)
const
3637 return concat_view(views::all(etl::forward<Ranges>(r))...);
3643 namespace private_views
3647 template <
class... Ranges>
3648 constexpr auto operator()(Ranges&&... r)
const
3650 return concat_view(views::all(etl::forward<Ranges>(r))...);
3655 inline constexpr private_views::concat concat;
3663 template <
class... Ranges>
3666 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3670 using iterators_type = etl::tuple< typename etl::ranges::private_ranges::iterator_trait< Ranges>::const_iterator...>;
3671 using value_type = etl::tuple<typename etl::ranges::private_ranges::iterator_trait< Ranges>::value_type...>;
3672 using difference_type = ptrdiff_t;
3673 using pointer =
const value_type*;
3674 using reference = value_type;
3676 using iterator_category = ETL_OR_STD::forward_iterator_tag;
3678 constexpr zip_iterator(iterators_type iters)
3683 constexpr zip_iterator(
const zip_iterator& other) =
default;
3685 constexpr zip_iterator& operator=(
const zip_iterator& other) =
default;
3687 constexpr zip_iterator& operator++()
3689 increment(etl::make_index_sequence<
sizeof...(Ranges)>{});
3693 constexpr zip_iterator operator++(
int)
3695 zip_iterator tmp = *
this;
3702 return deref(etl::make_index_sequence<
sizeof...(Ranges)>{});
3705 friend constexpr bool operator==(
const zip_iterator& lhs,
const zip_iterator& rhs)
3707 return lhs.any_equal(rhs, etl::make_index_sequence<
sizeof...(Ranges)>{});
3710 friend constexpr bool operator!=(
const zip_iterator& lhs,
const zip_iterator& rhs)
3712 return !(lhs == rhs);
3717 template <
size_t... Is>
3718 constexpr void increment(etl::index_sequence<Is...>)
3723 template <
size_t... Is>
3724 constexpr value_type deref(etl::index_sequence<Is...>)
const
3731 template <
size_t... Is>
3732 constexpr bool any_equal(
const zip_iterator& other, etl::index_sequence<Is...>)
const
3737 iterators_type _iters;
3746 template <
class... Ranges>
3747 class zip_view :
public etl::ranges::view_interface<zip_view<Ranges...>>
3749 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3753 using iterator = zip_iterator<Ranges...>;
3754 using const_iterator = zip_iterator<Ranges...>;
3756 constexpr zip_view(Ranges&&... r)
3757 : _r{etl::move(r)...}
3761 zip_view(
const zip_view& other) =
default;
3763 constexpr const_iterator
begin()
const
3765 return make_begin(etl::make_index_sequence<
sizeof...(Ranges)>{});
3768 constexpr const_iterator
end()
const
3770 return make_end(etl::make_index_sequence<
sizeof...(Ranges)>{});
3773 constexpr size_t size()
const
3775 return get_min_size(etl::make_index_sequence<
sizeof...(Ranges)>{});
3780 template <
size_t... Is>
3781 constexpr const_iterator make_begin(etl::index_sequence<Is...>)
const
3783 return const_iterator(
typename const_iterator::iterators_type(ETL_OR_STD::begin(
etl::get<Is>(_r))...));
3786 template <
size_t... Is>
3787 constexpr const_iterator make_end(etl::index_sequence<Is...>)
const
3789 return const_iterator(
typename const_iterator::iterators_type(ETL_OR_STD::end(
etl::get<Is>(_r))...));
3792 template <
size_t... Is>
3793 constexpr size_t get_min_size(etl::index_sequence<Is...>)
const
3795 size_t sizes[] = {
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(
etl::get<Is>(_r)), ETL_OR_STD::cend(
etl::get<Is>(_r))))...};
3796 size_t min_val = sizes[0];
3797 for (
size_t i = 1; i <
sizeof...(Ranges); ++i)
3799 if (sizes[i] < min_val)
3807 mutable etl::tuple<Ranges...> _r;
3810 template <
class... Ranges>
3811 zip_view(Ranges&&...) -> zip_view<views::all_t<Ranges>...>;
3815 namespace private_views
3819 template <
class... Ranges>
3820 constexpr auto operator()(Ranges&&... r)
const
3822 return zip_view(views::all(etl::forward<Ranges>(r))...);
3827 inline constexpr private_views::zip zip;
3835 template <
class Fun,
class... Ranges>
3836 class zip_transform_iterator
3838 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3842 using iterators_type = etl::tuple< typename etl::ranges::private_ranges::iterator_trait< Ranges>::const_iterator...>;
3843 using value_type = etl::invoke_result_t< Fun, typename etl::ranges::private_ranges::iterator_trait<Ranges>::value_type...>;
3844 using difference_type = ptrdiff_t;
3845 using pointer =
const value_type*;
3846 using reference = value_type;
3848 using iterator_category = ETL_OR_STD::forward_iterator_tag;
3850 constexpr zip_transform_iterator(Fun f, iterators_type iters)
3856 constexpr zip_transform_iterator(
const zip_transform_iterator& other) =
default;
3858 constexpr zip_transform_iterator& operator=(
const zip_transform_iterator& other) =
default;
3860 constexpr zip_transform_iterator& operator++()
3862 increment(etl::make_index_sequence<
sizeof...(Ranges)>{});
3866 constexpr zip_transform_iterator operator++(
int)
3868 zip_transform_iterator tmp = *
this;
3875 return deref(etl::make_index_sequence<
sizeof...(Ranges)>{});
3878 friend constexpr bool operator==(
const zip_transform_iterator& lhs,
const zip_transform_iterator& rhs)
3880 return lhs.any_equal(rhs, etl::make_index_sequence<
sizeof...(Ranges)>{});
3883 friend constexpr bool operator!=(
const zip_transform_iterator& lhs,
const zip_transform_iterator& rhs)
3885 return !(lhs == rhs);
3890 template <
size_t... Is>
3891 constexpr void increment(etl::index_sequence<Is...>)
3896 template <
size_t... Is>
3897 constexpr value_type deref(etl::index_sequence<Is...>)
const
3904 template <
size_t... Is>
3905 constexpr bool any_equal(
const zip_transform_iterator& other, etl::index_sequence<Is...>)
const
3911 iterators_type _iters;
3921 template <
class Fun,
class... Ranges>
3922 class zip_transform_view :
public etl::ranges::view_interface<zip_transform_view<Fun, Ranges...>>
3924 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
3928 using iterator = zip_transform_iterator<Fun, Ranges...>;
3929 using const_iterator = zip_transform_iterator<Fun, Ranges...>;
3931 constexpr zip_transform_view(Fun f, Ranges&&... r)
3933 , _r{etl::move(r)...}
3937 zip_transform_view(
const zip_transform_view& other) =
default;
3939 constexpr const_iterator
begin()
const
3941 return make_begin(etl::make_index_sequence<
sizeof...(Ranges)>{});
3944 constexpr const_iterator
end()
const
3946 return make_end(etl::make_index_sequence<
sizeof...(Ranges)>{});
3949 constexpr size_t size()
const
3951 return get_min_size(etl::make_index_sequence<
sizeof...(Ranges)>{});
3956 template <
size_t... Is>
3957 constexpr const_iterator make_begin(etl::index_sequence<Is...>)
const
3959 return const_iterator(_f,
typename const_iterator::iterators_type(ETL_OR_STD::begin(
etl::get<Is>(_r))...));
3962 template <
size_t... Is>
3963 constexpr const_iterator make_end(etl::index_sequence<Is...>)
const
3965 return const_iterator(_f,
typename const_iterator::iterators_type(ETL_OR_STD::end(
etl::get<Is>(_r))...));
3968 template <
size_t... Is>
3969 constexpr size_t get_min_size(etl::index_sequence<Is...>)
const
3971 size_t sizes[] = {
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(
etl::get<Is>(_r)), ETL_OR_STD::cend(
etl::get<Is>(_r))))...};
3972 size_t min_val = sizes[0];
3973 for (
size_t i = 1; i <
sizeof...(Ranges); ++i)
3975 if (sizes[i] < min_val)
3984 mutable etl::tuple<Ranges...> _r;
3987 template <
class Fun,
class... Ranges>
3988 zip_transform_view(Fun, Ranges&&...) -> zip_transform_view<Fun, views::all_t<Ranges>...>;
3992 namespace private_views
3994 struct zip_transform
3996 template <
class Fun,
class... Ranges>
3997 constexpr auto operator()(Fun&& f, Ranges&&... r)
const
3999 return zip_transform_view(etl::forward<Fun>(f), views::all(etl::forward<Ranges>(r))...);
4004 inline constexpr private_views::zip_transform zip_transform;
4012 template <
class I,
class S>
4013 class common_iterator
4017 using value_type =
typename etl::iterator_traits<I>::value_type;
4018 using difference_type =
typename etl::iterator_traits<I>::difference_type;
4019 using pointer =
typename etl::iterator_traits<I>::pointer;
4020 using reference =
typename etl::iterator_traits<I>::reference;
4021 using iterator_category = ETL_OR_STD::input_iterator_tag;
4023 constexpr common_iterator()
4024 : _is_sentinel{false}
4030 constexpr common_iterator(I it)
4031 : _is_sentinel{false}
4037 constexpr common_iterator(S s)
4038 : _is_sentinel{true}
4044 constexpr common_iterator(
const common_iterator& other)
4045 : _is_sentinel{other._is_sentinel}
4047 , _sentinel{other._sentinel}
4051 constexpr common_iterator& operator=(
const common_iterator& other)
4053 _is_sentinel = other._is_sentinel;
4055 _sentinel = other._sentinel;
4059 constexpr decltype(
auto)
operator*()
const
4064 constexpr decltype(
auto)
operator*()
4069 constexpr auto operator->()
const
4074 constexpr common_iterator& operator++()
4080 constexpr common_iterator operator++(
int)
4082 common_iterator tmp = *
this;
4087 friend constexpr bool operator==(
const common_iterator& lhs,
const common_iterator& rhs)
4089 if (lhs._is_sentinel && rhs._is_sentinel)
4093 if (!lhs._is_sentinel && !rhs._is_sentinel)
4095 return lhs._it == rhs._it;
4097 if (lhs._is_sentinel)
4099 return rhs._it == lhs._sentinel;
4101 return lhs._it == rhs._sentinel;
4104 friend constexpr bool operator!=(
const common_iterator& lhs,
const common_iterator& rhs)
4106 return !(lhs == rhs);
4120 namespace private_ranges
4122 template <
typename Range,
typename =
void>
4127 template <
typename Range>
4128 struct is_common_range<
4130 etl::enable_if_t< etl::is_same_v< decltype(ETL_OR_STD::begin(etl::declval<Range&>())), decltype(ETL_OR_STD::end(etl::declval<Range&>())) > >>
4142 template <class Range, bool IsCommon = private_ranges::is_common_range<Range>::value>
4146 template <
class Range>
4147 class common_view<Range, true> :
public etl::ranges::view_interface<common_view<Range, true>>
4151 using iterator =
decltype(ETL_OR_STD::begin(etl::declval<Range&>()));
4152 using const_iterator =
decltype(ETL_OR_STD::cbegin(etl::declval<const Range&>()));
4153 using difference_type =
typename etl::iterator_traits<iterator>::difference_type;
4155 constexpr common_view(Range&& r)
4160 common_view(
const common_view& other) =
default;
4162 constexpr Range base() const&
4167 constexpr iterator
begin()
const
4169 return iterator(ETL_OR_STD::begin(_r));
4172 constexpr iterator
end()
const
4174 return iterator(ETL_OR_STD::end(_r));
4177 constexpr size_t size()
const
4179 return static_cast<size_t>(etl::distance(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r)));
4188 template <
class Range>
4189 class common_view<Range, false> :
public etl::ranges::view_interface<common_view<Range, false>>
4193 using base_iterator =
decltype(ETL_OR_STD::begin(etl::declval<Range&>()));
4194 using base_sentinel =
decltype(ETL_OR_STD::end(etl::declval<Range&>()));
4195 using iterator = common_iterator<base_iterator, base_sentinel>;
4196 using const_iterator = iterator;
4197 using difference_type =
typename etl::iterator_traits<base_iterator>::difference_type;
4199 constexpr common_view(Range&& r)
4204 common_view(
const common_view& other) =
default;
4206 constexpr Range base() const&
4211 constexpr iterator
begin()
const
4213 return iterator(ETL_OR_STD::begin(_r));
4216 constexpr iterator
end()
const
4218 return iterator(ETL_OR_STD::end(_r));
4226 template <
class Range>
4227 common_view(Range&&) -> common_view<views::all_t<Range>>;
4229 struct common_range_adapter_closure :
public range_adapter_closure<common_range_adapter_closure>
4231 template <
typename Range>
4232 using target_view_type = common_view<Range>;
4234 common_range_adapter_closure() =
default;
4236 template <
typename Range>
4237 constexpr auto operator()(Range&& r)
4239 return common_view(views::all(etl::forward<Range>(r)));
4245 namespace private_views
4249 template <
class Range>
4250 constexpr auto operator()(Range&& r)
const
4252 return common_view(views::all(etl::forward<Range>(r)));
4255 constexpr auto operator()()
const
4257 return ranges::common_range_adapter_closure();
4262 inline constexpr private_views::common common;
4270 template <
class Range>
4271 class enumerate_iterator
4275 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
4277 using base_iterator =
typename trait::const_iterator;
4278 using base_value_type =
typename trait::value_type;
4279 using value_type = etl::tuple<size_t, base_value_type>;
4280 using difference_type =
typename trait::difference_type;
4281 using pointer =
const value_type*;
4282 using reference = value_type;
4284 using iterator_category = ETL_OR_STD::forward_iterator_tag;
4286 enumerate_iterator(base_iterator it,
size_t index)
4292 enumerate_iterator(
const enumerate_iterator& other)
4294 , _index{other._index}
4298 enumerate_iterator& operator++()
4305 enumerate_iterator operator++(
int)
4307 enumerate_iterator tmp = *
this;
4313 enumerate_iterator& operator=(
const enumerate_iterator& other)
4316 _index = other._index;
4322 return value_type(_index, *_it);
4325 bool operator==(
const enumerate_iterator& other)
const
4327 return other._it == _it;
4330 bool operator!=(
const enumerate_iterator& other)
const
4332 return !(*
this == other);
4346 template <
class Range>
4347 class enumerate_view :
public etl::ranges::view_interface<enumerate_view<Range>>
4351 using iterator = enumerate_iterator<Range>;
4352 using const_iterator = enumerate_iterator<Range>;
4354 enumerate_view(Range&& r)
4359 enumerate_view(
const enumerate_view& other) =
default;
4361 constexpr Range& base() const&
4366 constexpr const_iterator
begin()
const
4368 return const_iterator(ETL_OR_STD::begin(_r), 0);
4371 constexpr const_iterator
end()
const
4373 return const_iterator(ETL_OR_STD::end(_r),
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r))));
4376 constexpr size_t size()
const
4378 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
4386 template <
class Range>
4387 enumerate_view(Range&&) -> enumerate_view<views::all_t<Range>>;
4389 struct enumerate_range_adapter_closure :
public range_adapter_closure<enumerate_range_adapter_closure>
4391 template <
typename Range>
4392 using target_view_type = enumerate_view<Range>;
4394 enumerate_range_adapter_closure() =
default;
4396 template <
typename Range>
4397 constexpr auto operator()(Range&& r)
4399 return enumerate_view(views::all(etl::forward<Range>(r)));
4405 namespace private_views
4409 template <
class Range>
4410 constexpr auto operator()(Range&& r)
const
4412 return enumerate_view(views::all(etl::forward<Range>(r)));
4415 constexpr auto operator()()
const
4417 return ranges::enumerate_range_adapter_closure();
4422 inline constexpr private_views::enumerate enumerate;
4430 template <
class Range,
size_t N>
4431 class elements_iterator
4435 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
4437 using base_iterator =
typename trait::const_iterator;
4438 using base_value_type =
typename trait::value_type;
4439 using value_type = etl::tuple_element_t<N, base_value_type>;
4440 using difference_type =
typename trait::difference_type;
4441 using pointer =
const value_type*;
4442 using reference =
const value_type&;
4444 using iterator_category = ETL_OR_STD::forward_iterator_tag;
4446 elements_iterator(base_iterator it)
4451 elements_iterator(
const elements_iterator& other)
4456 elements_iterator& operator++()
4462 elements_iterator operator++(
int)
4464 elements_iterator tmp = *
this;
4469 elements_iterator& operator=(
const elements_iterator& other)
4475 decltype(
auto)
operator*()
const
4478 return get<N>(*_it);
4481 bool operator==(
const elements_iterator& other)
const
4483 return other._it == _it;
4486 bool operator!=(
const elements_iterator& other)
const
4488 return !(*
this == other);
4501 template <
class Range,
size_t N>
4502 class elements_view :
public etl::ranges::view_interface<elements_view<Range, N>>
4506 using iterator = elements_iterator<Range, N>;
4507 using const_iterator = elements_iterator<Range, N>;
4509 elements_view(Range&& r)
4514 elements_view(
const elements_view& other) =
default;
4516 constexpr Range& base() const&
4521 constexpr const_iterator
begin()
const
4523 return const_iterator(ETL_OR_STD::begin(_r));
4526 constexpr const_iterator
end()
const
4528 return const_iterator(ETL_OR_STD::end(_r));
4531 constexpr size_t size()
const
4533 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
4541 template <
class Range,
size_t N>
4542 elements_view(Range&&, etl::integral_constant<size_t, N>) -> elements_view<views::all_t<Range>, N>;
4545 struct elements_range_adapter_closure :
public range_adapter_closure<elements_range_adapter_closure<N>>
4547 template <
typename Range>
4548 using target_view_type = elements_view<Range, N>;
4550 elements_range_adapter_closure() =
default;
4552 template <
typename Range>
4553 constexpr auto operator()(Range&& r)
4555 return elements_view<views::all_t<Range>, N>(views::all(etl::forward<Range>(r)));
4560 template <
class Range>
4561 using keys_view = elements_view<Range, 0>;
4564 template <
class Range>
4565 using values_view = elements_view<Range, 1>;
4569 namespace private_views
4574 template <
class Range>
4575 constexpr auto operator()(Range&& r)
const
4577 return elements_view<views::all_t<Range>, N>(views::all(etl::forward<Range>(r)));
4580 constexpr auto operator()()
const
4582 return ranges::elements_range_adapter_closure<N>();
4588 inline constexpr private_views::elements_fn<N> elements{};
4590 inline constexpr private_views::elements_fn<0> keys{};
4591 inline constexpr private_views::elements_fn<1> values{};
4597 namespace private_ranges
4599 template <
typename T,
size_t N,
typename = etl::make_index_sequence<N>>
4600 struct repeat_tuple;
4602 template <
typename T,
size_t N,
size_t... Is>
4603 struct repeat_tuple<T, N, etl::index_sequence<Is...>>
4608 using type = etl::tuple<always<Is>...>;
4611 template <
typename T,
size_t N>
4612 using repeat_tuple_t =
typename repeat_tuple<T, N>::type;
4616 template <
typename Fun,
typename T,
size_t N,
typename = etl::make_index_sequence<N>>
4617 struct repeat_invoke_result;
4619 template <
typename Fun,
typename T,
size_t N,
size_t... Is>
4620 struct repeat_invoke_result<Fun, T, N, etl::index_sequence<Is...>>
4625 using type = etl::invoke_result_t<Fun, always<Is>...>;
4628 template <
typename Fun,
typename T,
size_t N>
4629 using repeat_invoke_result_t =
typename repeat_invoke_result<Fun, T, N>::type;
4638 template <
class Range,
size_t N>
4639 class adjacent_iterator
4641 static_assert(N > 0,
"adjacent window size must be > 0");
4645 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
4647 using base_iterator =
typename trait::const_iterator;
4648 using base_value_type =
typename trait::value_type;
4649 using value_type = private_ranges::repeat_tuple_t<base_value_type, N>;
4650 using difference_type =
typename trait::difference_type;
4651 using pointer =
const value_type*;
4652 using reference = value_type;
4654 using iterator_category = ETL_OR_STD::forward_iterator_tag;
4657 template <
size_t... Is>
4658 constexpr adjacent_iterator(base_iterator first, base_iterator last, etl::index_sequence<Is...>)
4659 : _iters{advance_copy(first, last, Is)...}
4664 constexpr adjacent_iterator(
const adjacent_iterator& other) =
default;
4666 constexpr adjacent_iterator& operator=(
const adjacent_iterator& other) =
default;
4668 constexpr adjacent_iterator& operator++()
4670 increment(etl::make_index_sequence<N>{});
4674 constexpr adjacent_iterator operator++(
int)
4676 adjacent_iterator tmp = *
this;
4683 return deref(etl::make_index_sequence<N>{});
4686 friend constexpr bool operator==(
const adjacent_iterator& lhs,
const adjacent_iterator& rhs)
4690 return lhs._iters[N - 1] == rhs._iters[N - 1];
4693 friend constexpr bool operator!=(
const adjacent_iterator& lhs,
const adjacent_iterator& rhs)
4695 return !(lhs == rhs);
4700 static constexpr base_iterator advance_copy(base_iterator it, base_iterator last,
size_t n)
4702 for (
size_t i = 0; i < n && it != last; ++i)
4709 template <
size_t... Is>
4710 constexpr void increment(etl::index_sequence<Is...>)
4712 ((void)((_iters[Is] != _end) ? (void)++_iters[Is] : (void)0), ...);
4715 template <
size_t... Is>
4716 constexpr value_type deref(etl::index_sequence<Is...>)
const
4718 return value_type(*_iters[Is]...);
4721 base_iterator _iters[N];
4733 template <
class Range,
size_t N>
4734 class adjacent_view :
public etl::ranges::view_interface<adjacent_view<Range, N>>
4736 static_assert(N > 0,
"adjacent window size must be > 0");
4740 using iterator = adjacent_iterator<Range, N>;
4741 using const_iterator = adjacent_iterator<Range, N>;
4743 constexpr adjacent_view(Range&& r)
4748 adjacent_view(
const adjacent_view& other) =
default;
4750 constexpr Range& base() const&
4755 constexpr const_iterator
begin()
const
4757 return const_iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), etl::make_index_sequence<N>{});
4760 constexpr const_iterator
end()
const
4763 return const_iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), etl::make_index_sequence<N>{});
4766 constexpr size_t size()
const
4768 auto total =
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
4769 return (total >= N) ? (total - N + 1) : 0;
4777 template <
class Range,
size_t N>
4778 adjacent_view(Range&&, etl::integral_constant<size_t, N>) -> adjacent_view<views::all_t<Range>, N>;
4781 struct adjacent_range_adapter_closure :
public range_adapter_closure<adjacent_range_adapter_closure<N>>
4783 template <
typename Range>
4784 using target_view_type = adjacent_view<Range, N>;
4786 adjacent_range_adapter_closure() =
default;
4788 template <
typename Range>
4789 constexpr auto operator()(Range&& r)
4791 return adjacent_view<views::all_t<Range>, N>(views::all(etl::forward<Range>(r)));
4797 namespace private_views
4802 template <
class Range>
4803 constexpr auto operator()(Range&& r)
const
4805 return adjacent_view<views::all_t<Range>, N>(views::all(etl::forward<Range>(r)));
4808 constexpr auto operator()()
const
4810 return ranges::adjacent_range_adapter_closure<N>();
4816 inline constexpr private_views::adjacent_fn<N> adjacent{};
4819 inline constexpr private_views::adjacent_fn<2> pairwise{};
4828 template <
class Range,
class Fun,
size_t N>
4829 class adjacent_transform_iterator
4831 static_assert(N > 0,
"adjacent window size must be > 0");
4835 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
4837 using base_iterator =
typename trait::const_iterator;
4838 using base_value_type =
typename trait::value_type;
4839 using value_type = private_ranges::repeat_invoke_result_t<Fun, base_value_type, N>;
4840 using difference_type =
typename trait::difference_type;
4841 using pointer =
const value_type*;
4842 using reference = value_type;
4844 using iterator_category = ETL_OR_STD::forward_iterator_tag;
4848 template <
size_t... Is>
4849 constexpr adjacent_transform_iterator(Fun f, base_iterator first, base_iterator last, etl::index_sequence<Is...>)
4851 , _iters{advance_copy(first, last, Is)...}
4856 constexpr adjacent_transform_iterator(
const adjacent_transform_iterator& other) =
default;
4858 constexpr adjacent_transform_iterator& operator=(
const adjacent_transform_iterator& other) =
default;
4860 constexpr adjacent_transform_iterator& operator++()
4862 increment(etl::make_index_sequence<N>{});
4866 constexpr adjacent_transform_iterator operator++(
int)
4868 adjacent_transform_iterator tmp = *
this;
4875 return deref(etl::make_index_sequence<N>{});
4878 friend constexpr bool operator==(
const adjacent_transform_iterator& lhs,
const adjacent_transform_iterator& rhs)
4882 return lhs._iters[N - 1] == rhs._iters[N - 1];
4885 friend constexpr bool operator!=(
const adjacent_transform_iterator& lhs,
const adjacent_transform_iterator& rhs)
4887 return !(lhs == rhs);
4892 static constexpr base_iterator advance_copy(base_iterator it, base_iterator last,
size_t n)
4894 for (
size_t i = 0; i < n && it != last; ++i)
4901 template <
size_t... Is>
4902 constexpr void increment(etl::index_sequence<Is...>)
4904 ((void)((_iters[Is] != _end) ? (void)++_iters[Is] : (void)0), ...);
4907 template <
size_t... Is>
4908 constexpr value_type deref(etl::index_sequence<Is...>)
const
4910 return etl::invoke(_f, *_iters[Is]...);
4914 base_iterator _iters[N];
4927 template <
class Range,
class Fun,
size_t N>
4928 class adjacent_transform_view :
public etl::ranges::view_interface< adjacent_transform_view<Range, Fun, N>>
4930 static_assert(N > 0,
"adjacent window size must be > 0");
4934 using iterator = adjacent_transform_iterator<Range, Fun, N>;
4935 using const_iterator = adjacent_transform_iterator<Range, Fun, N>;
4937 constexpr adjacent_transform_view(Fun f, Range&& r)
4943 adjacent_transform_view(
const adjacent_transform_view& other) =
default;
4945 constexpr Range& base() const&
4950 constexpr const_iterator
begin()
const
4952 return const_iterator(_f, ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), etl::make_index_sequence<N>{});
4955 constexpr const_iterator
end()
const
4958 return const_iterator(_f, ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), etl::make_index_sequence<N>{});
4961 constexpr size_t size()
const
4963 auto total =
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
4964 return (total >= N) ? (total - N + 1) : 0;
4973 template <
class Fun,
class Range,
size_t N>
4974 adjacent_transform_view(Fun, Range&&, etl::integral_constant<size_t, N>) -> adjacent_transform_view<views::all_t<Range>, Fun, N>;
4976 template <
size_t N,
typename Fun>
4977 struct adjacent_transform_range_adapter_closure :
public range_adapter_closure< adjacent_transform_range_adapter_closure<N, Fun>>
4979 template <
typename Range>
4980 using target_view_type = adjacent_transform_view<Range, Fun, N>;
4982 adjacent_transform_range_adapter_closure(Fun f)
4987 template <
typename Range>
4988 constexpr auto operator()(Range&& r)
4990 return adjacent_transform_view<views::all_t<Range>, Fun, N>(_f, views::all(etl::forward<Range>(r)));
4998 namespace private_views
5001 struct adjacent_transform_fn
5003 template <
class Range,
typename Fun>
5004 constexpr auto operator()(Range&& r, Fun&& f)
const
5006 return adjacent_transform_view<views::all_t<Range>, etl::decay_t<Fun>, N>(etl::forward<Fun>(f), views::all(etl::forward<Range>(r)));
5009 template <
typename Fun>
5010 constexpr auto operator()(Fun&& f)
const
5012 return ranges::adjacent_transform_range_adapter_closure< N, etl::decay_t<Fun>>(etl::forward<Fun>(f));
5018 inline constexpr private_views::adjacent_transform_fn<N> adjacent_transform{};
5021 inline constexpr private_views::adjacent_transform_fn<2> pairwise_transform{};
5027 template <
class Range>
5028 class chunk_iterator
5032 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
5034 using inner_iterator =
typename trait::iterator;
5035 using const_inner_iterator =
typename trait::const_iterator;
5036 using difference_type =
typename trait::difference_type;
5038 using iterator_category = ETL_OR_STD::forward_iterator_tag;
5040 using value_type = etl::ranges::subrange<const_inner_iterator>;
5041 using pointer = value_type*;
5042 using reference = value_type;
5044 chunk_iterator(const_inner_iterator it, const_inner_iterator it_end, difference_type chunk_size)
5047 , _chunk_size(chunk_size)
5051 chunk_iterator(
const chunk_iterator& other) =
default;
5053 chunk_iterator& operator=(
const chunk_iterator& other) =
default;
5055 chunk_iterator& operator++()
5057 difference_type remaining = etl::distance(_it, _it_end);
5058 difference_type step = (_chunk_size < remaining) ? _chunk_size : remaining;
5059 etl::advance(_it, step);
5063 chunk_iterator operator++(
int)
5065 chunk_iterator tmp{*
this};
5072 difference_type remaining = etl::distance(_it, _it_end);
5073 difference_type step = (_chunk_size < remaining) ? _chunk_size : remaining;
5074 const_inner_iterator chunk_end = _it;
5075 etl::advance(chunk_end, step);
5076 return value_type(_it, chunk_end);
5079 constexpr bool operator==(
const chunk_iterator& other)
const
5081 return _it == other._it;
5084 constexpr bool operator!=(
const chunk_iterator& other)
const
5086 return !(*
this == other);
5091 const_inner_iterator _it;
5092 const_inner_iterator _it_end;
5093 difference_type _chunk_size;
5101 template <
class Range>
5102 class chunk_view :
public etl::ranges::view_interface<chunk_view<Range>>
5106 using iterator = chunk_iterator<Range>;
5107 using const_iterator = chunk_iterator<Range>;
5108 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
5110 constexpr chunk_view(Range&& r, difference_type chunk_size)
5112 , _chunk_size{chunk_size}
5116 chunk_view(
const chunk_view& other) =
default;
5118 constexpr Range base() const&
5123 constexpr iterator
begin()
const
5125 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _chunk_size);
5128 constexpr iterator
end()
const
5130 return iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _chunk_size);
5136 difference_type _chunk_size;
5139 template <
class Range>
5140 chunk_view(Range&&,
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type) -> chunk_view<views::all_t<Range>>;
5142 struct chunk_range_adapter_closure :
public range_adapter_closure<chunk_range_adapter_closure>
5144 template <
typename Range>
5145 using target_view_type = chunk_view<Range>;
5147 template <
class DifferenceType>
5148 constexpr chunk_range_adapter_closure(DifferenceType chunk_size)
5149 : _chunk_size{static_cast<size_t>(chunk_size)}
5153 template <
typename Range>
5154 constexpr auto operator()(Range&& r)
const
5156 return chunk_view(views::all(etl::forward<Range>(r)),
static_cast< typename chunk_view<views::all_t<Range>
>::difference_type>(_chunk_size));
5159 const size_t _chunk_size;
5164 namespace private_views
5168 template <
class Range>
5169 constexpr auto operator()(Range&& r, ranges::range_difference_t<Range> chunk_size)
const
5171 return chunk_view(views::all(etl::forward<Range>(r)), chunk_size);
5174 template <
class DifferenceType>
5175 constexpr auto operator()(DifferenceType chunk_size)
const
5177 return ranges::chunk_range_adapter_closure(chunk_size);
5182 inline constexpr private_views::chunk chunk;
5189 template <
class Range>
5190 class slide_iterator
5194 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
5196 using inner_iterator =
typename trait::iterator;
5197 using const_inner_iterator =
typename trait::const_iterator;
5198 using difference_type =
typename trait::difference_type;
5200 using iterator_category = ETL_OR_STD::forward_iterator_tag;
5202 using value_type = etl::ranges::subrange<const_inner_iterator>;
5203 using pointer = value_type*;
5204 using reference = value_type;
5206 slide_iterator(const_inner_iterator it, const_inner_iterator it_end, difference_type window_size)
5209 , _window_size(window_size)
5213 slide_iterator(
const slide_iterator& other) =
default;
5215 slide_iterator& operator=(
const slide_iterator& other) =
default;
5217 slide_iterator& operator++()
5223 slide_iterator operator++(
int)
5225 slide_iterator tmp{*
this};
5232 const_inner_iterator window_end = _it;
5233 etl::advance(window_end, _window_size);
5234 return value_type(_it, window_end);
5237 constexpr bool operator==(
const slide_iterator& other)
const
5239 return _it == other._it;
5242 constexpr bool operator!=(
const slide_iterator& other)
const
5244 return !(*
this == other);
5249 const_inner_iterator _it;
5250 const_inner_iterator _it_end;
5251 difference_type _window_size;
5261 template <
class Range>
5262 class slide_view :
public etl::ranges::view_interface<slide_view<Range>>
5266 using iterator = slide_iterator<Range>;
5267 using const_iterator = slide_iterator<Range>;
5268 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
5270 constexpr slide_view(Range&& r, difference_type window_size)
5272 , _window_size{window_size}
5276 slide_view(
const slide_view& other) =
default;
5278 constexpr Range base() const&
5283 constexpr iterator
begin()
const
5285 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _window_size);
5288 constexpr iterator
end()
const
5290 auto total =
static_cast<difference_type
>(etl::distance(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r)));
5291 if (total < _window_size)
5294 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _window_size);
5296 auto end_it = ETL_OR_STD::begin(_r);
5297 etl::advance(end_it, total - _window_size + 1);
5298 return iterator(end_it, ETL_OR_STD::end(_r), _window_size);
5301 constexpr size_t size()
const
5303 auto total =
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
5304 return (total >=
static_cast<size_t>(_window_size)) ? (total -
static_cast<size_t>(_window_size) + 1) : 0;
5310 difference_type _window_size;
5313 template <
class Range>
5314 slide_view(Range&&,
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type) -> slide_view<views::all_t<Range>>;
5316 struct slide_range_adapter_closure :
public range_adapter_closure<slide_range_adapter_closure>
5318 template <
typename Range>
5319 using target_view_type = slide_view<Range>;
5321 template <
class DifferenceType>
5322 constexpr slide_range_adapter_closure(DifferenceType window_size)
5323 : _window_size{static_cast<size_t>(window_size)}
5327 template <
typename Range>
5328 constexpr auto operator()(Range&& r)
const
5330 return slide_view(views::all(etl::forward<Range>(r)),
static_cast< typename slide_view<views::all_t<Range>
>::difference_type>(_window_size));
5333 const size_t _window_size;
5338 namespace private_views
5342 template <
class Range>
5343 constexpr auto operator()(Range&& r, ranges::range_difference_t<Range> window_size)
const
5345 return slide_view(views::all(etl::forward<Range>(r)), window_size);
5348 template <
class DifferenceType>
5349 constexpr auto operator()(DifferenceType window_size)
const
5351 return ranges::slide_range_adapter_closure(window_size);
5356 inline constexpr private_views::slide slide;
5365 template <
class Range,
class Pred>
5366 class chunk_by_iterator
5370 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
5372 using inner_iterator =
typename trait::iterator;
5373 using const_inner_iterator =
typename trait::const_iterator;
5374 using difference_type =
typename trait::difference_type;
5376 using iterator_category = ETL_OR_STD::forward_iterator_tag;
5378 using value_type = etl::ranges::subrange<const_inner_iterator>;
5379 using pointer = value_type*;
5380 using reference = value_type;
5382 chunk_by_iterator(const_inner_iterator it, const_inner_iterator it_end,
const Pred& pred)
5387 _chunk_end = find_next_chunk_end();
5390 chunk_by_iterator(
const chunk_by_iterator& other) =
default;
5392 chunk_by_iterator& operator=(
const chunk_by_iterator& other) =
default;
5394 chunk_by_iterator& operator++()
5397 _chunk_end = find_next_chunk_end();
5401 chunk_by_iterator operator++(
int)
5403 chunk_by_iterator tmp{*
this};
5410 return value_type(_it, _chunk_end);
5413 constexpr bool operator==(
const chunk_by_iterator& other)
const
5415 return _it == other._it;
5418 constexpr bool operator!=(
const chunk_by_iterator& other)
const
5420 return !(*
this == other);
5425 const_inner_iterator find_next_chunk_end()
const
5432 const_inner_iterator it_prev = _it;
5433 const_inner_iterator it_curr = _it;
5436 while (it_curr != _it_end)
5438 if (!_pred(*it_prev, *it_curr))
5449 const_inner_iterator _it;
5450 const_inner_iterator _it_end;
5451 const_inner_iterator _chunk_end;
5461 template <
class Range,
class Pred>
5462 class chunk_by_view :
public etl::ranges::view_interface<chunk_by_view<Range, Pred>>
5466 using iterator = chunk_by_iterator<Range, Pred>;
5467 using const_iterator = chunk_by_iterator<Range, Pred>;
5469 chunk_by_view(Range&& r,
const Pred& pred)
5475 chunk_by_view(
const chunk_by_view& other) =
default;
5477 constexpr Range base() const&
5482 constexpr const Pred& pred()
const
5487 constexpr const_iterator
begin()
const
5489 return const_iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _pred);
5492 constexpr const_iterator
end()
const
5494 return const_iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _pred);
5503 template <
class Range,
typename Pred>
5504 chunk_by_view(Range&&, Pred) -> chunk_by_view<views::all_t<Range>, Pred>;
5506 template <
typename Pred>
5507 struct chunk_by_range_adapter_closure :
public range_adapter_closure<chunk_by_range_adapter_closure<Pred>>
5509 template <
typename Range>
5510 using target_view_type = chunk_by_view<Range, Pred>;
5512 chunk_by_range_adapter_closure(
const Pred& p)
5517 template <
typename Range>
5518 constexpr auto operator()(Range&& r)
const
5520 return chunk_by_view(views::all(etl::forward<Range>(r)), _p);
5528 namespace private_views
5532 template <
class Range,
typename Pred>
5533 constexpr auto operator()(Range&& r,
const Pred& p)
const
5535 return chunk_by_view(views::all(etl::forward<Range>(r)), p);
5538 template <
typename Pred>
5539 constexpr auto operator()(
const Pred& p)
const
5541 return ranges::chunk_by_range_adapter_closure<Pred>(p);
5546 inline constexpr private_views::chunk_by chunk_by;
5553 template <
class Range>
5554 class stride_iterator
5558 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
5560 using inner_iterator =
typename trait::iterator;
5561 using const_inner_iterator =
typename trait::const_iterator;
5562 using difference_type =
typename trait::difference_type;
5564 using iterator_category = ETL_OR_STD::forward_iterator_tag;
5566 using value_type =
typename trait::value_type;
5567 using pointer =
typename trait::pointer;
5568 using reference =
typename trait::reference;
5570 constexpr stride_iterator(const_inner_iterator it, const_inner_iterator it_end, difference_type stride_n)
5573 , _stride_n(stride_n)
5577 stride_iterator(
const stride_iterator& other) =
default;
5579 stride_iterator& operator=(
const stride_iterator& other) =
default;
5581 constexpr stride_iterator& operator++()
5583 difference_type remaining = etl::distance(_it, _it_end);
5584 difference_type step = (_stride_n < remaining) ? _stride_n : remaining;
5585 etl::advance(_it, step);
5589 constexpr stride_iterator operator++(
int)
5591 stride_iterator tmp{*
this};
5601 constexpr auto operator->()
const
5606 constexpr bool operator==(
const stride_iterator& other)
const
5608 return _it == other._it;
5611 constexpr bool operator!=(
const stride_iterator& other)
const
5613 return !(*
this == other);
5618 mutable const_inner_iterator _it;
5619 const_inner_iterator _it_end;
5620 difference_type _stride_n;
5627 template <
class Range>
5628 class stride_view :
public etl::ranges::view_interface<stride_view<Range>>
5632 using iterator = stride_iterator<Range>;
5633 using const_iterator = stride_iterator<Range>;
5634 using difference_type =
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type;
5636 constexpr stride_view(Range&& r, difference_type stride_n)
5638 , _stride_n{stride_n}
5642 stride_view(
const stride_view& other) =
default;
5644 constexpr Range base() const&
5649 constexpr iterator
begin()
const
5651 return iterator(ETL_OR_STD::begin(_r), ETL_OR_STD::end(_r), _stride_n);
5654 constexpr iterator
end()
const
5656 return iterator(ETL_OR_STD::end(_r), ETL_OR_STD::end(_r), _stride_n);
5662 difference_type _stride_n;
5665 template <
class Range>
5666 stride_view(Range&&,
typename etl::ranges::private_ranges::iterator_trait< Range>::difference_type) -> stride_view<views::all_t<Range>>;
5668 struct stride_range_adapter_closure :
public range_adapter_closure<stride_range_adapter_closure>
5670 template <
typename Range>
5671 using target_view_type = stride_view<Range>;
5673 template <
class DifferenceType>
5674 constexpr stride_range_adapter_closure(DifferenceType stride_n)
5675 : _stride_n{static_cast<size_t>(stride_n)}
5679 template <
typename Range>
5680 constexpr auto operator()(Range&& r)
const
5682 return stride_view(views::all(etl::forward<Range>(r)),
static_cast< typename stride_view<views::all_t<Range>
>::difference_type>(_stride_n));
5685 const size_t _stride_n;
5690 namespace private_views
5694 template <
class Range>
5695 constexpr auto operator()(Range&& r, ranges::range_difference_t<Range> stride_n)
const
5697 return stride_view(views::all(etl::forward<Range>(r)), stride_n);
5700 template <
class DifferenceType>
5701 constexpr auto operator()(DifferenceType stride_n)
const
5703 return ranges::stride_range_adapter_closure(stride_n);
5708 inline constexpr private_views::stride stride;
5718 template <
class... Ranges>
5719 class cartesian_product_iterator
5721 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
5725 using iterators_type = etl::tuple< typename etl::ranges::private_ranges::iterator_trait< Ranges>::const_iterator...>;
5726 using value_type = etl::tuple<typename etl::ranges::private_ranges::iterator_trait< Ranges>::value_type...>;
5727 using difference_type = ptrdiff_t;
5728 using pointer =
const value_type*;
5729 using reference = value_type;
5731 using iterator_category = ETL_OR_STD::forward_iterator_tag;
5733 constexpr cartesian_product_iterator(iterators_type current, iterators_type begins, iterators_type ends,
bool is_end =
false)
5741 constexpr cartesian_product_iterator(
const cartesian_product_iterator& other) =
default;
5743 constexpr cartesian_product_iterator& operator=(
const cartesian_product_iterator& other) =
default;
5745 constexpr cartesian_product_iterator& operator++()
5751 constexpr cartesian_product_iterator operator++(
int)
5753 cartesian_product_iterator tmp = *
this;
5760 return deref(etl::make_index_sequence<
sizeof...(Ranges)>{});
5763 friend constexpr bool operator==(
const cartesian_product_iterator& lhs,
const cartesian_product_iterator& rhs)
5765 return lhs._is_end == rhs._is_end && (lhs._is_end || lhs.all_equal(rhs, etl::make_index_sequence<
sizeof...(Ranges)>{}));
5768 friend constexpr bool operator!=(
const cartesian_product_iterator& lhs,
const cartesian_product_iterator& rhs)
5770 return !(lhs == rhs);
5777 constexpr void increment()
5781 increment_at<
sizeof...(Ranges) - 1>();
5785 constexpr etl::enable_if_t<(I > 0)> increment_at()
5792 increment_at<I - 1>();
5797 constexpr etl::enable_if_t<(I == 0)> increment_at()
5807 template <
size_t... Is>
5808 constexpr value_type deref(etl::index_sequence<Is...>)
const
5813 template <
size_t... Is>
5814 constexpr bool all_equal(
const cartesian_product_iterator& other, etl::index_sequence<Is...>)
const
5819 iterators_type _current;
5820 iterators_type _begins;
5821 iterators_type _ends;
5833 template <
class... Ranges>
5834 class cartesian_product_view :
public etl::ranges::view_interface<cartesian_product_view<Ranges...>>
5836 static_assert(
sizeof...(Ranges) > 0,
"Type list must be non-empty");
5840 using iterator = cartesian_product_iterator<Ranges...>;
5841 using const_iterator = cartesian_product_iterator<Ranges...>;
5843 constexpr cartesian_product_view(Ranges&&... r)
5844 : _r{etl::move(r)...}
5848 cartesian_product_view(
const cartesian_product_view& other) =
default;
5850 constexpr const_iterator
begin()
const
5852 if (any_empty(etl::make_index_sequence<
sizeof...(Ranges)>{}))
5856 return make_begin(etl::make_index_sequence<
sizeof...(Ranges)>{});
5859 constexpr const_iterator
end()
const
5861 return make_end(etl::make_index_sequence<
sizeof...(Ranges)>{});
5864 constexpr size_t size()
const
5866 return get_product_size(etl::make_index_sequence<
sizeof...(Ranges)>{});
5871 template <
size_t... Is>
5872 constexpr const_iterator make_begin(etl::index_sequence<Is...>)
const
5874 return const_iterator(
typename const_iterator::iterators_type(ETL_OR_STD::begin(
etl::get<Is>(_r))...),
5875 typename const_iterator::iterators_type(ETL_OR_STD::begin(
etl::get<Is>(_r))...),
5876 typename const_iterator::iterators_type(ETL_OR_STD::end(
etl::get<Is>(_r))...),
false);
5879 template <
size_t... Is>
5880 constexpr const_iterator make_end(etl::index_sequence<Is...>)
const
5882 return const_iterator(
typename const_iterator::iterators_type(ETL_OR_STD::end(
etl::get<Is>(_r))...),
5883 typename const_iterator::iterators_type(ETL_OR_STD::begin(
etl::get<Is>(_r))...),
5884 typename const_iterator::iterators_type(ETL_OR_STD::end(
etl::get<Is>(_r))...),
true);
5887 template <
size_t... Is>
5888 constexpr bool any_empty(etl::index_sequence<Is...>)
const
5893 template <
size_t... Is>
5894 constexpr size_t get_product_size(etl::index_sequence<Is...>)
const
5896 size_t sizes[] = {
static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(
etl::get<Is>(_r)), ETL_OR_STD::cend(
etl::get<Is>(_r))))...};
5898 for (
size_t i = 0; i <
sizeof...(Ranges); ++i)
5900 product *= sizes[i];
5905 mutable etl::tuple<Ranges...> _r;
5908 template <
class... Ranges>
5909 cartesian_product_view(Ranges&&...) -> cartesian_product_view<views::all_t<Ranges>...>;
5913 namespace private_views
5915 struct cartesian_product
5917 template <
class... Ranges>
5918 constexpr auto operator()(Ranges&&... r)
const
5920 return cartesian_product_view(views::all(etl::forward<Ranges>(r))...);
5925 inline constexpr private_views::cartesian_product cartesian_product;
5934 template <
class Range>
5935 class to_input_iterator
5939 using trait =
typename etl::ranges::private_ranges::iterator_trait<Range>;
5941 using iterator =
typename trait::iterator;
5942 using const_iterator =
typename trait::const_iterator;
5943 using value_type =
typename trait::value_type;
5944 using difference_type =
typename trait::difference_type;
5945 using pointer =
typename trait::pointer;
5946 using reference =
typename trait::reference;
5948 using iterator_category = ETL_OR_STD::input_iterator_tag;
5950 to_input_iterator() =
default;
5952 to_input_iterator(const_iterator it)
5957 to_input_iterator(
const to_input_iterator& other) =
default;
5959 to_input_iterator& operator=(
const to_input_iterator& other) =
default;
5961 to_input_iterator& operator++()
5967 to_input_iterator operator++(
int)
5969 to_input_iterator tmp = *
this;
5979 pointer operator->()
const
5984 bool operator==(
const to_input_iterator& other)
const
5986 return _it == other._it;
5989 bool operator!=(
const to_input_iterator& other)
const
5991 return !(*
this == other);
5996 mutable const_iterator _it;
6006 template <
class Range>
6007 class to_input_view :
public etl::ranges::view_interface<to_input_view<Range>>
6011 using iterator = to_input_iterator<Range>;
6012 using const_iterator = iterator;
6014 to_input_view(
const to_input_view& other) =
default;
6016 to_input_view(Range&& r)
6021 constexpr Range& base()
const
6026 constexpr iterator
begin()
const
6028 return iterator(ETL_OR_STD::begin(_r));
6031 constexpr iterator
end()
const
6033 return iterator(ETL_OR_STD::end(_r));
6036 constexpr size_t size()
const
6038 return static_cast<size_t>(etl::distance(ETL_OR_STD::cbegin(_r), ETL_OR_STD::cend(_r)));
6046 template <
class Range>
6047 to_input_view(Range&&) -> to_input_view<views::all_t<Range>>;
6049 struct to_input_range_adapter_closure :
public range_adapter_closure<to_input_range_adapter_closure>
6051 template <
typename Range>
6052 using target_view_type = to_input_view<Range>;
6054 to_input_range_adapter_closure() =
default;
6056 template <
typename Range>
6057 constexpr auto operator()(Range&& r)
6059 return to_input_view(views::all(etl::forward<Range>(r)));
6065 namespace private_views
6069 template <
class Range>
6070 constexpr auto operator()(Range&& r)
const
6072 return to_input_view(views::all(etl::forward<Range>(r)));
6075 constexpr auto operator()()
const
6077 return ranges::to_input_range_adapter_closure();
6082 inline constexpr private_views::to_input to_input;
6100 elements_of(R&&) -> elements_of<R>;
6102 namespace private_ranges
6105 struct to_range_adapter_closure :
public range_adapter_closure<to_range_adapter_closure<C>>
6107 template <
class Range =
void>
6108 using target_view_type = C;
6110 to_range_adapter_closure() =
default;
6112 template <
class Range>
6113 C operator()(
const Range& r)
const
6115 using result_type = C;
6121 result.push_back(i);
6127 template <
class Range>
6128 C operator()(Range&& r)
6130 using result_type = C;
6136 result.emplace_back(etl::move(i));
6145 private_ranges::to_range_adapter_closure<C> to()
6147 return private_ranges::to_range_adapter_closure<C>();
6152 namespace views = ranges::views;
6155template <
class Range,
typename RangeAdaptorClosure,
typename = etl::enable_if_t<etl::is_invocable_v<RangeAdaptorClosure, Range>>>
6157auto operator|(Range&& r, RangeAdaptorClosure rac)
6159 return rac(etl::forward<Range>(r));
ETL_CONSTEXPR14 bool operator!=(const etl::bitset< Active_Bits, TElement > &lhs, const etl::bitset< Active_Bits, TElement > &rhs) ETL_NOEXCEPT
Definition bitset_new.h:2529
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_CONSTEXPR14 void iota(TIterator first, TIterator last, T value)
Definition numeric.h:58
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::pointer data(TContainer &container)
Definition iterator.h:1228
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
etl::byte operator|(etl::byte lhs, etl::byte rhs)
Or.
Definition byte.h:250
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
ETL_CONSTEXPR TContainer::const_iterator cbegin(const TContainer &container)
Definition iterator.h:987
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
T & get(array< T, Size > &a)
Definition array.h:1161
ETL_CONSTEXPR TContainer::const_iterator cend(const TContainer &container)
Definition iterator.h:1017
etl::add_const< T >::type & as_const(T &t)
as_const
Definition utility.h:526
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997