31#ifndef ETL_SPAN_INCLUDED
32#define ETL_SPAN_INCLUDED
49#include "static_assert.h"
59#if ETL_USING_STL && ETL_USING_CPP11
60 template <
typename T,
size_t N>
struct is_std_array<std::
array<T, N>> : etl::true_type {};
85 span_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
86 :
exception(reason_, file_name_, line_number_)
95 class span_alignment_exception :
public span_exception
99 span_alignment_exception(string_type file_name_, numeric_type line_number_)
100 : span_exception(ETL_ERROR_TEXT(
"span:alignment", ETL_SPAN_FILE_ID
"A"), file_name_, line_number_)
109 class span_size_mismatch :
public span_exception
113 span_size_mismatch(string_type file_name_, numeric_type line_number_)
114 : span_exception(ETL_ERROR_TEXT(
"span:size", ETL_SPAN_FILE_ID
"B"), file_name_, line_number_)
123 class span_out_of_range :
public span_exception
127 span_out_of_range(string_type file_name_, numeric_type line_number_)
128 : span_exception(ETL_ERROR_TEXT(
"span:range", ETL_SPAN_FILE_ID
"C"), file_name_, line_number_)
136 template <
typename T,
size_t Extent = etl::dynamic_extent>
141 typedef T element_type;
142 typedef typename etl::remove_cv<T>::type value_type;
143 typedef size_t size_type;
144 typedef T& reference;
145 typedef const T& const_reference;
147 typedef const T* const_pointer;
150 typedef const T* const_iterator;
151 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
152 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
154 typedef etl::circular_iterator<pointer> circular_iterator;
155 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
157 static ETL_CONSTANT
size_t extent = Extent;
162 template <
typename TIterator,
typename TSize>
163 ETL_CONSTEXPR
explicit span(
const TIterator begin_,
const TSize ) ETL_NOEXCEPT
171 template <
typename TIterator>
172 ETL_CONSTEXPR
explicit span(
const TIterator begin_,
const TIterator ) ETL_NOEXCEPT
181 template<
size_t Array_Size,
typename =
typename etl::enable_if<(Array_Size == Extent),
void>::type>
182 ETL_CONSTEXPR
span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
190 template<
size_t Array_Size>
191 ETL_CONSTEXPR
span(element_type(&begin_)[Array_Size],
typename etl::enable_if<(Array_Size == Extent),
void>
::type* = 0) ETL_NOEXCEPT
202 template <
typename TContainer,
typename =
typename etl::enable_if<!etl::is_base_of<span_tag, etl::remove_reference_t<TContainer>>::value &&
203 !etl::is_std_array<etl::remove_reference_t<TContainer>>::value &&
204 !etl::is_etl_array<etl::remove_reference_t<TContainer>>::value &&
205 !etl::is_po
inter<etl::remove_reference_t<TContainer>>::value &&
206 !etl::is_array<etl::remove_reference_t<TContainer>>::value &&
207 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<
typename etl::remove_reference_t<TContainer>::value_type>>::value,
void>::type>
208 ETL_CONSTEXPR
span(TContainer&& a) ETL_NOEXCEPT
217 template <
typename TContainer>
221 !
etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value &&
232 template <
typename TContainer>
236 !
etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value &&
248 : pbegin(other.pbegin)
256 template <
typename U,
size_t Size>
258 : pbegin(other.
data())
266 template <
typename U,
size_t Size>
268 : pbegin(other.
data())
273#if ETL_USING_STL && ETL_USING_CPP11
277 template <
typename U,
size_t Size>
279 : pbegin(other.
data())
286 template <
typename U,
size_t Size>
287 ETL_CONSTEXPR
span(
const std::array<U, Size>& other,
typename etl::enable_if<Size == Extent && etl::is_const<T>::value,
void>::type* = 0) ETL_NOEXCEPT
288 : pbegin(other.
data())
296 template <
typename U,
size_t Size>
298 : pbegin(other.
data())
305 template <
typename U,
size_t Size>
307 : pbegin(other.
data())
314 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
316 ETL_STATIC_ASSERT(Extent > 0,
"Span is empty");
324 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
326 ETL_STATIC_ASSERT(Extent > 0,
"Span is empty");
328 return *((pbegin + Extent) - 1);
334 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
342 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cbegin() const ETL_NOEXCEPT
350 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
358 ETL_NODISCARD ETL_CONSTEXPR circular_iterator
begin_circular() const ETL_NOEXCEPT
360 return circular_iterator(
begin(),
end());
366 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cend() const ETL_NOEXCEPT
368 return (pbegin + Extent);
374 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
376 return (pbegin + Extent);
382 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crbegin() const ETL_NOEXCEPT
384 return const_reverse_iterator((pbegin + Extent));
390 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
392 return reverse_iterator((pbegin + Extent));
398 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
400 return reverse_circular_iterator(rbegin(),
rend());
406 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crend() const ETL_NOEXCEPT
408 return const_reverse_iterator(pbegin);
414 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
416 return reverse_iterator(pbegin);
422 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
430 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
438 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
440 return sizeof(element_type) * Extent;
446 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
456 pbegin = other.pbegin;
463 ETL_NODISCARD ETL_CONSTEXPR14 reference
at(
size_t i)
473 ETL_NODISCARD ETL_CONSTEXPR14 const_reference
at(
size_t i)
const
485#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
497 template <
size_t COUNT>
501 ETL_STATIC_ASSERT(COUNT <= Extent,
"Original span does not contain COUNT elements");
511#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
512 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) :
throw(ETL_ERROR(
span_out_of_range));
523 template <
size_t COUNT>
527 ETL_STATIC_ASSERT(COUNT <= Extent,
"Original span does not contain COUNT elements");
537#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
538 return count <=
size() ?
552 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
553 ETL_NODISCARD ETL_CONSTEXPR
554 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan() const ETL_NOEXCEPT
557 ETL_STATIC_ASSERT(OFFSET <= Extent,
"OFFSET is not within the original span");
560 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) :
true,
"OFFSET + COUNT is not within the original span");
562 return (COUNT == etl::dynamic_extent) ?
etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, (pbegin + Extent))
563 :
etl::
span<element_type, COUNT !=
etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
569 template <
size_t OFFSET,
size_t COUNT>
570 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan()
const
573 ETL_STATIC_ASSERT(OFFSET <= Extent,
"OFFSET is not within the original span");
576 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) :
true,
"OFFSET + COUNT is not within the original span");
578 if (COUNT == etl::dynamic_extent)
580 return etl::span<element_type, (COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET)>(pbegin + OFFSET, (pbegin + Extent));
584 return etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
594#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
595 return (offset <=
size()) && (count != etl::dynamic_extent ? count <= (
size() - offset) :
true) ?
601 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (
size() - offset) :
true, ETL_ERROR(
span_out_of_range));
614 elements = etl::min(elements,
size());
621 template<
typename TNew>
626 return etl::span<TNew, Extent *
sizeof(element_type) /
sizeof(TNew)>(
reinterpret_cast<TNew*
>(pbegin),
627 Extent *
sizeof(element_type) /
sizeof(TNew));
639 template <
typename T,
size_t Extent>
648 template <
typename T>
653 typedef T element_type;
654 typedef typename etl::remove_cv<T>::type value_type;
655 typedef size_t size_type;
656 typedef T& reference;
657 typedef const T& const_reference;
659 typedef const T* const_pointer;
662 typedef const T* const_iterator;
663 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
664 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
666 typedef etl::circular_iterator<pointer> circular_iterator;
667 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
669 static ETL_CONSTANT
size_t extent = etl::dynamic_extent;
674 ETL_CONSTEXPR
span() ETL_NOEXCEPT
675 : pbegin(ETL_NULLPTR)
683 template <
typename TIterator,
typename TSize>
684 ETL_CONSTEXPR
span(
const TIterator begin_,
const TSize size_) ETL_NOEXCEPT
693 template <
typename TIterator>
694 ETL_CONSTEXPR
span(
const TIterator begin_,
const TIterator end_) ETL_NOEXCEPT
703 template<
size_t Array_Size>
704 ETL_CONSTEXPR
span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
706 , pend(begin_ + Array_Size)
715 template <
typename TContainer,
typename =
typename etl::enable_if<!etl::is_base_of<span_tag, etl::remove_reference_t<TContainer>>::value &&
716 !etl::is_po
inter<etl::remove_reference_t<TContainer>>::value &&
717 !etl::is_array<etl::remove_reference_t<TContainer>>::value &&
718 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<
typename etl::remove_reference_t<TContainer>::value_type>>::value,
void>::type>
719 ETL_CONSTEXPR
span(TContainer&& a) ETL_NOEXCEPT
721 , pend(a.data() + a.size())
729 template <
typename TContainer>
731 !
etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value &&
743 template <
typename TContainer>
745 !
etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value &&
758 : pbegin(other.pbegin)
766 template <
typename U,
size_t Size>
768 : pbegin(other.data())
769 , pend(other.data() + other.size())
776 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
778#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
790 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
792#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
804 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
812 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cbegin() const ETL_NOEXCEPT
820 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
828 ETL_NODISCARD ETL_CONSTEXPR circular_iterator
begin_circular() const ETL_NOEXCEPT
830 return circular_iterator(
begin(),
end());
836 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cend() const ETL_NOEXCEPT
844 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
860 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
862 return const_reverse_iterator(pend);
868 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
870 return reverse_circular_iterator(rbegin(),
rend());
876 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crend() const ETL_NOEXCEPT
878 return const_reverse_iterator(pbegin);
884 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
886 return reverse_iterator(pbegin);
892 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
894 return (pbegin == pend);
900 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
902 return (pend - pbegin);
908 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
910 return sizeof(element_type) * (pend - pbegin);
916 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
926 pbegin = other.pbegin;
934 ETL_NODISCARD ETL_CONSTEXPR14 reference
at(
size_t i)
944 ETL_NODISCARD ETL_CONSTEXPR14 const_reference
at(
size_t i)
const
956#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
968 template <
size_t COUNT>
971#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
972 return COUNT <= size() ? etl::span<element_type, COUNT>(pbegin, pbegin + COUNT) :
throw(ETL_ERROR(
span_out_of_range));
985#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
986 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) :
throw(ETL_ERROR(
span_out_of_range));
997 template <
size_t COUNT>
1000#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1001 return COUNT <= size() ? etl::span<element_type, COUNT>(pend - COUNT, pend) :
throw(ETL_ERROR(
span_out_of_range));
1014#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1015 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pend - count, pend) :
throw(ETL_ERROR(
span_out_of_range));
1027 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
1028 ETL_NODISCARD ETL_CONSTEXPR
1031#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1032 return (OFFSET <=
size()) && (COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true) ?
1038 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true, ETL_ERROR(
span_out_of_range));
1041 :
etl::
span<element_type, COUNT !=
etl::dynamic_extent ? COUNT :
etl::dynamic_extent>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
1048 template <
size_t OFFSET,
size_t COUNT>
1052 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true, ETL_ERROR(
span_out_of_range));
1054 if (COUNT == etl::dynamic_extent)
1071 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (
size() - offset) :
true, ETL_ERROR(
span_out_of_range));
1083 elements = etl::min(elements,
size());
1090 template<
typename TNew>
1096 (pend - pbegin) *
sizeof(element_type) /
sizeof(TNew));
1105 template<
typename TRet>
1108 ETL_STATIC_ASSERT(
sizeof(TRet) %
sizeof(element_type) == 0,
"sizeof(TRet) must be divisible by sizeof(T)");
1114 advance(
sizeof(TRet) /
sizeof(element_type) * n);
1124 template<
typename TRet>
1127 ETL_STATIC_ASSERT(
sizeof(TRet) %
sizeof(element_type) == 0,
"sizeof(TRet) must be divisible by sizeof(T)");
1132 TRet& result = *
reinterpret_cast<TRet*
>(
data());
1133 advance(
sizeof(TRet) /
sizeof(element_type));
1148 template <
typename T>
1158 template <
typename T>
1164 template <
typename T,
size_t Extent>
1165 ETL_CONSTANT
size_t span<T, Extent>::extent;
1167 template <
typename T>
1168 ETL_CONSTANT
size_t span<T, etl::dynamic_extent>::extent;
1173 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1179 return (lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size());
1185 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1190 return !(lhs == rhs);
1201 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1220 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1222 !etl::is_const<T2>::value,
bool>::type
1241 template <
typename TIterator>
1242 span(
const TIterator begin_,
const TIterator end_)
1243 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1245 template <
typename TIterator,
typename TSize>
1246 span(
const TIterator begin_,
const TSize size_)
1247 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1249 template <
typename T,
size_t Size>
1253 template <
typename T,
size_t Size>
1257 template <
typename T,
size_t Size>
1259 -> span<const T, Size>;
1261#if ETL_USING_STL && ETL_USING_CPP11
1262 template <
typename T,
size_t Size>
1263 span(std::array<T, Size>&)
1266 template <
typename T,
size_t Size>
1267 span(
const std::array<T, Size>&)
1268 ->span<
const T, Size>;
1275#if ETL_USING_8BIT_TYPES
1276 template <
typename T,
size_t Extent>
1277 struct hash<
etl::span<T, Extent> >
1281 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
1282 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
1290 template <
class T,
size_t Size>
1291 span<
const byte, (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size *
sizeof(T))>
1300 template <
class T,
size_t Size>
1301 span<byte, (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size *
sizeof(T))>
1304 ETL_STATIC_ASSERT(!etl::is_const<T>::value,
"span<T> must be of non-const type");
The byte class.
Definition byte.h:155
Definition iterator.h:228
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:828
ETL_CONSTEXPR span(const TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:744
ETL_NODISCARD etl::span< TRet > take(size_t const n)
Definition span.h:1106
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:757
ETL_CONSTEXPR span() ETL_NOEXCEPT
Default constructor.
Definition span.h:674
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Obtains a span that is a view from OFFSET over the next COUNT elements of this span.
Definition span.h:1049
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:1081
ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
Returns a reverse circular iterator to the end of the span.
Definition span.h:868
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view from 'offset' over the next 'count' elements of this span.
Definition span.h:1068
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last COUNT elements of this span.
Definition span.h:998
ETL_NODISCARD TRet & take()
Definition span.h:1125
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:900
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the first count elements of this span.
Definition span.h:983
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:892
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the last element.
Definition span.h:790
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last count elements of this span.
Definition span.h:1012
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the span.
Definition span.h:876
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:954
ETL_CONSTEXPR span(TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:730
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:836
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:820
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:944
ETL_CONSTEXPR span(const TIterator begin_, const TIterator end_) ETL_NOEXCEPT
Construct from iterators.
Definition span.h:694
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< TNew, etl::dynamic_extent > reinterpret_as() const
Reinterpret the span as a span with different element type.
Definition span.h:1091
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
Construct from C array.
Definition span.h:704
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the first element.
Definition span.h:776
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the first COUNT elements of this span.
Definition span.h:969
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:844
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:812
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:804
ETL_CONSTEXPR span(const TIterator begin_, const TSize size_) ETL_NOEXCEPT
Construct from pointer + size.
Definition span.h:684
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:884
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:916
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:908
ETL_CONSTEXPR span(const etl::span< U, Size > &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:767
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:934
Span - Fixed Extent.
Definition span.h:138
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:414
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:358
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:342
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT
Obtains a span that is a view over the last COUNT elements of this span.
Definition span.h:524
ETL_CONSTEXPR span(etl::array< U, Size > &other, typename etl::enable_if< Size==Extent, void >::type *=0) ETL_NOEXCEPT
Constructor from etl array.
Definition span.h:297
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:247
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Obtains a span that is a view from OFFSET over the next COUNT elements of this span.
Definition span.h:570
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:612
ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator rbegin_circular() const ETL_NOEXCEPT
Returns a reverse circular iterator to the end of the span.
Definition span.h:398
ETL_CONSTEXPR span(const etl::array< U, Size > &other, typename etl::enable_if< Size==Extent &&etl::is_const< T >::value, void >::type *=0) ETL_NOEXCEPT
Constructor from const etl array.
Definition span.h:306
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the last count elements of this span.
Definition span.h:535
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:350
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:438
span(TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:218
span(const TContainer &a, typename etl::enable_if<!etl::is_base_of< span_tag, typename etl::remove_reference< TContainer >::type >::value &&!etl::is_std_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_etl_array< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_pointer< typename etl::remove_reference< TContainer >::type >::value &&!etl::is_array< TContainer >::value &&etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< typename etl::remove_reference< TContainer >::type::value_type >::type >::value, void >::type *=0) ETL_NOEXCEPT
Definition span.h:233
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:422
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:366
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT
Obtains a span that is a view over the first COUNT elements of this span.
Definition span.h:498
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view from 'offset' over the next 'count' elements of this span.
Definition span.h:592
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:430
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition span.h:324
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:454
ETL_CONSTEXPR14 span(const etl::span< U, Size > &other, typename etl::enable_if< Size==etl::dynamic_extent, void >::type *=0)
Definition span.h:267
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< TNew, Extent *sizeof(element_type)/sizeof(TNew)> reinterpret_as() const
Reinterpret the span as a span with different element type.
Definition span.h:622
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Obtains a span that is a view over the first count elements of this span.
Definition span.h:509
ETL_CONSTEXPR span(const TIterator begin_, const TIterator) ETL_NOEXCEPT
Construct from iterators.
Definition span.h:172
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Definition span.h:334
ETL_CONSTEXPR span(const etl::span< U, Size > &other, typename etl::enable_if< Size==Extent, void >::type *=0) ETL_NOEXCEPT
Definition span.h:257
ETL_CONSTEXPR span(const TIterator begin_, const TSize) ETL_NOEXCEPT
Construct from iterators + size.
Definition span.h:163
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:463
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:483
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:473
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the span.
Definition span.h:406
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:446
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition span.h:314
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:374
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size], typename etl::enable_if<(Array_Size==Extent), void >::type *=0) ETL_NOEXCEPT
Construct from C array.
Definition span.h:191
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits_generator.h:899
add_rvalue_reference
Definition type_traits_generator.h:1413
enable_if
Definition type_traits_generator.h:1254
is_array
Definition type_traits_generator.h:1154
is_base_of
Definition type_traits_generator.h:1315
is_pointer
Definition type_traits_generator.h:1164
is_same
Definition type_traits_generator.h:1104
remove_cv
Definition type_traits_generator.h:1031
remove_reference
Definition type_traits_generator.h:941
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1104
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1084
bool is_aligned(const void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:92
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
span< const byte,(Size==etl::dynamic_extent) ?(etl::dynamic_extent) :(Size *sizeof(T))> as_bytes(span< T, Size > s) ETL_NOEXCEPT
Template deduction guides.
Definition span.h:1292
ETL_CONSTEXPR T * to_address(T *p) ETL_NOEXCEPT
Definition memory.h:62
span< byte,(Size==etl::dynamic_extent) ?(etl::dynamic_extent) :(Size *sizeof(T))> as_writable_bytes(span< T, Size > s) ETL_NOEXCEPT
Obtains a view to the byte representation of the elements of the span s.
Definition span.h:1302
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
ETL_CONSTEXPR span< T, Extent > make_span(T(&data)[Extent])
Definition span.h:640