31#ifndef ETL_SPAN_INCLUDED
32#define ETL_SPAN_INCLUDED
49#include "static_assert.h"
53#if ETL_USING_STL && ETL_USING_CPP20
68#if ETL_USING_STL && ETL_USING_CPP11
69 template <
typename T,
size_t N>
91 template <
typename T,
size_t N>
103 template <
typename T>
113 template <
typename T,
size_t Extent>
116 namespace private_span
118 template <
typename T>
123 template <
typename T,
size_t Extent>
129 template <
typename T>
135 template <
typename T>
136 inline constexpr bool is_span_v = is_span<T>::value;
147 span_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
148 :
exception(reason_, file_name_, line_number_)
157 class span_alignment_exception :
public span_exception
161 span_alignment_exception(string_type file_name_, numeric_type line_number_)
162 : span_exception(ETL_ERROR_TEXT(
"span:alignment", ETL_SPAN_FILE_ID
"A"), file_name_, line_number_)
171 class span_size_mismatch :
public span_exception
175 span_size_mismatch(string_type file_name_, numeric_type line_number_)
176 : span_exception(ETL_ERROR_TEXT(
"span:size", ETL_SPAN_FILE_ID
"B"), file_name_, line_number_)
185 class span_out_of_range :
public span_exception
189 span_out_of_range(string_type file_name_, numeric_type line_number_)
190 : span_exception(ETL_ERROR_TEXT(
"span:range", ETL_SPAN_FILE_ID
"C"), file_name_, line_number_)
206 template <
typename T,
size_t Extent = etl::dynamic_extent>
211 typedef T element_type;
212 typedef typename etl::remove_cv<T>::type value_type;
213 typedef size_t size_type;
214 typedef T& reference;
215 typedef const T& const_reference;
217 typedef const T* const_pointer;
220 typedef const T* const_iterator;
221 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
222 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
224 typedef etl::circular_iterator<pointer> circular_iterator;
225 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
227 static ETL_CONSTANT
size_t extent = Extent;
234 template <size_t E = Extent, typename = typename etl::enable_if<E == 0, void>::type>
235 ETL_CONSTEXPR
span() ETL_NOEXCEPT
236 : pbegin(ETL_NULLPTR)
240 ETL_CONSTEXPR
span() ETL_NOEXCEPT
241 : pbegin(ETL_NULLPTR)
243 ETL_STATIC_ASSERT(Extent == 0,
"Default constructor only available for zero extent");
250 template <
typename TIterator>
251 explicit ETL_CONSTEXPR14
span(
const TIterator begin_,
const size_t size_) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
261 template <
typename TIteratorBegin,
typename TIteratorEnd>
262 ETL_CONSTEXPR14
span(
const TIteratorBegin begin_,
const TIteratorEnd end_,
263 typename etl::enable_if< !etl::is_integral<TIteratorEnd>::value,
void>
::type* = 0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
273 template <
size_t Array_Size>
274 ETL_CONSTEXPR
span(
typename etl::type_identity<element_type>::type (&begin_)[Array_Size],
275 typename etl::enable_if<(Array_Size == Extent),
void>
::type* = 0) ETL_NOEXCEPT
285 template <
typename TContainer>
286 ETL_CONSTEXPR14
span(TContainer&& a,
287 typename etl::enable_if<
288 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
290 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
291 && etl::is_lvalue_reference<TContainer&&>::value && has_size<TContainer>::value && has_data<TContainer>::value
292 && etl::is_convertible<
decltype(etl::declval<
typename etl::remove_reference<TContainer>::type&>().
data()),
pointer>::value
293 && etl::is_same<
typename etl::remove_cv<T>::type,
295 void>
::type* = 0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
305 template <
typename TContainer>
306 span(TContainer& a,
typename etl::enable_if<
307 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
309 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
310 && has_size<TContainer>::value && has_data<TContainer>::value
311 && etl::is_same<
typename etl::remove_cv<T>::type,
323 template <
typename TContainer>
326 typename etl::enable_if<
327 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
329 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && has_size<TContainer>::value && has_data<TContainer>::value
330 && etl::is_same<
typename etl::remove_cv<T>::type,
342 template <
typename U,
size_t Size>
344 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0) ETL_NOEXCEPT
345 : pbegin(other.
data())
352 template <
typename U,
size_t Size>
354 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0) ETL_NOEXCEPT
355 : pbegin(other.
data())
360 template <
typename U,
size_t Size>
364#if ETL_USING_STL && ETL_USING_CPP11
368 template <
typename U,
size_t Size>
369 ETL_CONSTEXPR
span(std::array<U, Size>& other,
370 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0) ETL_NOEXCEPT
371 : pbegin(other.
data())
378 template <
typename U,
size_t Size>
379 ETL_CONSTEXPR
span(
const std::array<U, Size>& other,
380 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0) ETL_NOEXCEPT
381 : pbegin(other.
data())
385 template <
typename U,
size_t Size>
386 span(std::array<U, Size>&&) =
delete;
393 : pbegin(other.pbegin)
401 template <
typename U,
size_t Size>
403 typename etl::enable_if<(Size == Extent) && (Size != etl::dynamic_extent),
void>
::type* = 0) ETL_NOEXCEPT
404 : pbegin(other.
data())
412 template <
typename U,
size_t Size>
414 : pbegin(other.
data())
419#if ETL_USING_STL && ETL_USING_CPP20
424 template <
typename U,
size_t Size>
425 ETL_CONSTEXPR
span(
const std::span<U, Size>& other,
426 typename etl::enable_if<(Size == Extent) && etl::is_convertible<U (*)[], T (*)[]>::value,
int>
::type* = 0) ETL_NOEXCEPT
427 : pbegin(other.
data())
435 template <
typename U,
size_t Size>
436 ETL_CONSTEXPR14
span(
const std::span<U, Size>& other,
437 typename etl::enable_if<(Size == etl::dynamic_extent && etl::is_convertible<U (*)[], T (*)[]>::value),
int>
::type* = 0)
439 : pbegin(other.
data())
441 ETL_ASSERT(other.size() == Extent, ETL_ERROR(span_size_mismatch));
448 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
450 ETL_STATIC_ASSERT(Extent > 0,
"Span is empty");
458 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
460 ETL_STATIC_ASSERT(Extent > 0,
"Span is empty");
462 return *((pbegin + Extent) - 1);
468 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
476 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cbegin() const ETL_NOEXCEPT
484 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
492 ETL_NODISCARD ETL_CONSTEXPR circular_iterator
begin_circular() const ETL_NOEXCEPT
494 return circular_iterator(
begin(),
end());
500 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cend() const ETL_NOEXCEPT
502 return (pbegin + Extent);
508 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
510 return (pbegin + Extent);
516 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crbegin() const ETL_NOEXCEPT
518 return const_reverse_iterator((pbegin + Extent));
524 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rbegin() const ETL_NOEXCEPT
526 return reverse_iterator((pbegin + Extent));
532 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
534 return reverse_circular_iterator(rbegin(),
rend());
540 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crend() const ETL_NOEXCEPT
542 return const_reverse_iterator(pbegin);
548 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
550 return reverse_iterator(pbegin);
556 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
564 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
572 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
574 return sizeof(element_type) * Extent;
580 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
590 pbegin = other.pbegin;
597 ETL_NODISCARD ETL_CONSTEXPR14 reference
at(
size_t i)
607 ETL_NODISCARD ETL_CONSTEXPR14 const_reference
at(
size_t i)
const
619#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
632 template <
size_t COUNT>
637 ETL_STATIC_ASSERT(COUNT <= Extent,
"Original span does not contain COUNT elements");
647 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
649#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
650 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) :
throw(ETL_ERROR(
span_out_of_range));
661 template <
size_t COUNT>
666 ETL_STATIC_ASSERT(COUNT <= Extent,
"Original span does not contain COUNT elements");
675 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
677#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
678 return count <= size() ? etl::span<element_type, etl::dynamic_extent>((pbegin + Extent) - count, (pbegin + Extent))
692 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
693 ETL_NODISCARD ETL_CONSTEXPR
etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan() const ETL_NOEXCEPT
696 ETL_STATIC_ASSERT(OFFSET <= Extent,
"OFFSET is not within the original span");
700 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) :
true,
"OFFSET + COUNT is not within the original span");
702 return (COUNT == etl::dynamic_extent) ?
etl::span < element_type,
703 COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, (pbegin + Extent)) :
etl::
span < element_type,
704 COUNT !=
etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
711 template <
size_t OFFSET,
size_t COUNT>
712 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan()
const
715 ETL_STATIC_ASSERT(OFFSET <= Extent,
"OFFSET is not within the original span");
719 ETL_STATIC_ASSERT((COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) :
true,
"OFFSET + COUNT is not within the original span");
721 if (COUNT == etl::dynamic_extent)
723 return etl::span<element_type, (COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET)>(pbegin + OFFSET, (pbegin + Extent));
727 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
737 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
739#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
740 return (offset <=
size()) && (count != etl::dynamic_extent ? count <= (
size() - offset) :
true)
746 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (
size() - offset) :
true, ETL_ERROR(
span_out_of_range));
756 template <
typename TNew>
761 return etl::span<TNew, Extent *
sizeof(element_type) /
sizeof(TNew)>(
reinterpret_cast<TNew*
>(pbegin),
762 Extent *
sizeof(element_type) /
sizeof(TNew));
774 template <
typename T,
size_t Extent>
783 template <
typename T>
788 typedef T element_type;
789 typedef typename etl::remove_cv<T>::type value_type;
790 typedef size_t size_type;
791 typedef T& reference;
792 typedef const T& const_reference;
794 typedef const T* const_pointer;
797 typedef const T* const_iterator;
798 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
799 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
801 typedef etl::circular_iterator<pointer> circular_iterator;
802 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
804 static ETL_CONSTANT
size_t extent = etl::dynamic_extent;
809 ETL_CONSTEXPR
span() ETL_NOEXCEPT
810 : pbegin(ETL_NULLPTR)
818 template <
typename TIterator>
819 ETL_CONSTEXPR
span(
const TIterator begin_,
size_t size_) ETL_NOEXCEPT
828 template <
typename TIteratorBegin,
typename TIteratorEnd>
829 ETL_CONSTEXPR
span(
const TIteratorBegin begin_,
const TIteratorEnd end_,
830 typename etl::enable_if<!etl::is_integral<TIteratorEnd>::value,
void>
::type* = 0) ETL_NOEXCEPT
839 template <
size_t Array_Size>
840 ETL_CONSTEXPR
span(element_type (&begin_)[Array_Size]) ETL_NOEXCEPT
842 , pend(begin_ + Array_Size)
851 template <
typename TContainer>
852 ETL_CONSTEXPR
span(TContainer&& a,
853 typename etl::enable_if<
854 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
856 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
857 && etl::is_lvalue_reference<TContainer&&>::value && has_size<TContainer>::value && has_data<TContainer>::value
858 && etl::is_convertible<
decltype(etl::declval<
typename etl::remove_reference<TContainer>::type&>().
data()),
pointer>::value
859 && etl::is_same<
typename etl::remove_cv<T>::type,
861 void>
::type* = 0) ETL_NOEXCEPT
871 template <
typename TContainer>
872 span(TContainer& a,
typename etl::enable_if<
873 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
875 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
876 && has_size<TContainer>::value && has_data<TContainer>::value
877 && etl::is_same<
typename etl::remove_cv<T>::type,
879 void>
::type* = 0) ETL_NOEXCEPT
889 template <
typename TContainer>
891 typename etl::enable_if<
892 !etl::is_span<TContainer>::value && !
etl::is_std_array<
typename etl::remove_reference<TContainer>::type>::value
894 && !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
895 && has_size<TContainer>::value && has_data<TContainer>::value
896 && etl::is_same<
typename etl::remove_cv<T>::type,
898 void>
::type* = 0) ETL_NOEXCEPT
905#if ETL_USING_STL && ETL_USING_CPP20
909 template <
typename U,
size_t Size>
910 ETL_CONSTEXPR
span(std::span<U, Size>& other,
typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value,
int>
::type* = 0) ETL_NOEXCEPT
911 : pbegin(other.
data())
919 template <
typename U,
size_t Size>
920 ETL_CONSTEXPR
span(
const std::span<U, Size>& other,
typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value,
int>
::type* = 0)
922 : pbegin(other.
data())
931 template <
typename U,
size_t Size>
934 : pbegin(other.
data())
935 , pend(other.
data() + Size)
942 template <
typename U,
size_t Size>
945 : pbegin(other.
data())
946 , pend(other.
data() + Size)
951 template <
typename U,
size_t Size>
955#if ETL_USING_STL && ETL_USING_CPP11
959 template <
typename U,
size_t Size>
960 ETL_CONSTEXPR
span(std::array<U, Size>& other,
typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0)
962 : pbegin(other.
data())
963 , pend(other.
data() + Size)
970 template <
typename U,
size_t Size>
971 ETL_CONSTEXPR
span(
const std::array<U, Size>& other,
typename etl::enable_if<etl::is_convertible<U (*)[], T (*)[]>::value,
void>
::type* = 0)
973 : pbegin(other.
data())
974 , pend(other.
data() + Size)
978 template <
typename U,
size_t Size>
979 span(std::array<U, Size>&&) =
delete;
986 : pbegin(other.pbegin)
994 template <
typename U,
size_t Size>
996 : pbegin(other.data())
997 , pend(other.data() + other.size())
1004 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1006#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1018 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1020#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1032 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
1040 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cbegin() const ETL_NOEXCEPT
1048 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
1058 return circular_iterator(
begin(),
end());
1064 ETL_NODISCARD ETL_CONSTEXPR const_iterator
cend() const ETL_NOEXCEPT
1072 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
1088 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
1090 return const_reverse_iterator(pend);
1096 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
1098 return reverse_circular_iterator(rbegin(),
rend());
1104 ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator
crend() const ETL_NOEXCEPT
1106 return const_reverse_iterator(pbegin);
1112 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
1114 return reverse_iterator(pbegin);
1120 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
1122 return (pbegin == pend);
1128 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
1130 return static_cast<size_t>(pend - pbegin);
1136 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
1138 return sizeof(element_type) *
static_cast<size_t>(pend - pbegin);
1144 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
1154 pbegin = other.pbegin;
1162 ETL_NODISCARD ETL_CONSTEXPR14 reference
at(
size_t i)
1172 ETL_NODISCARD ETL_CONSTEXPR14 const_reference
at(
size_t i)
const
1184#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_INDEX_OPERATOR
1197 template <
size_t COUNT>
1200#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1201 return COUNT <= size() ? etl::span<element_type, COUNT>(pbegin, pbegin + COUNT) :
throw(ETL_ERROR(
span_out_of_range));
1214 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1216#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1217 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pbegin, pbegin + count) :
throw(ETL_ERROR(
span_out_of_range));
1228 template <
size_t COUNT>
1231#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1232 return COUNT <= size() ? etl::span<element_type, COUNT>(pend - COUNT, pend) :
throw(ETL_ERROR(
span_out_of_range));
1244 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1246#if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1247 return count <= size() ? etl::span<element_type, etl::dynamic_extent>(pend - count, pend) :
throw(ETL_ERROR(
span_out_of_range));
1260 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
1262 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1264 #if ETL_USING_CPP11 && ETL_NOT_USING_CPP14 && ETL_USING_EXCEPTIONS && ETL_CHECKING_EXTRA
1265 return (OFFSET <=
size()) && (COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true)
1266 ? ((COUNT == etl::dynamic_extent) ?
etl::span < element_type,
1267 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend) :
etl::span < element_type,
1268 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT))
1272 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true, ETL_ERROR(
span_out_of_range));
1274 return (COUNT == etl::dynamic_extent) ?
etl::span < element_type,
1275 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend) :
etl::
span < element_type,
1276 COUNT !=
etl::dynamic_extent ? COUNT :
etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
1284 template <
size_t OFFSET,
size_t COUNT>
1288 ETL_ASSERT_CHECK_EXTRA(COUNT != etl::dynamic_extent ? COUNT <= (
size() - OFFSET) :
true, ETL_ERROR(
span_out_of_range));
1290 if (COUNT == etl::dynamic_extent)
1292 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pend);
1296 return etl::span < element_type, COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin + OFFSET, pbegin + OFFSET + COUNT);
1306 ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_EXTRA)
1309 ETL_ASSERT_CHECK_EXTRA(count != etl::dynamic_extent ? count <= (
size() - offset) :
true, ETL_ERROR(
span_out_of_range));
1322 elements = etl::min(elements,
size());
1329 template <
typename TNew>
1335 static_cast<size_t>(pend - pbegin) *
sizeof(element_type) /
sizeof(TNew));
1344 template <
typename TRet>
1348 ETL_STATIC_ASSERT(
sizeof(TRet) %
sizeof(element_type) == 0,
"sizeof(TRet) must be divisible by sizeof(T)");
1354 advance(
sizeof(TRet) /
sizeof(element_type) * n);
1364 template <
typename TRet>
1368 ETL_STATIC_ASSERT(
sizeof(TRet) %
sizeof(element_type) == 0,
"sizeof(TRet) must be divisible by sizeof(T)");
1373 TRet& result = *
reinterpret_cast<TRet*
>(
data());
1374 advance(
sizeof(TRet) /
sizeof(element_type));
1389 template <
typename T>
1399 template <
typename T>
1405 template <
typename T,
size_t Extent>
1406 ETL_CONSTANT
size_t span<T, Extent>::extent;
1408 template <
typename T>
1409 ETL_CONSTANT
size_t span<T, etl::dynamic_extent>::extent;
1414 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1416 ETL_CONSTEXPR
typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type,
typename etl::remove_cv<T2>::type>::value,
bool>
::type
1419 return (lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size());
1425 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1428 return !(lhs == rhs);
1439 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1440 typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type,
typename etl::remove_cv<T2>::type>::value,
bool>
::type
1457 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
1458 typename etl::enable_if< etl::is_same<typename etl::remove_cv<T1>::type,
typename etl::remove_cv<T2>::type>::value && !etl::is_const<T2>::value,
1478 template <
typename TIterator>
1479 span(
const TIterator begin_,
const TIterator end_) -> span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1481 template <
typename TIterator,
typename TSize>
1482 span(
const TIterator begin_,
const TSize size_) -> span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1484 template <
typename T,
size_t Size>
1485 span(T (&)[Size]) -> span<T, Size>;
1487 template <
typename T,
size_t Size>
1490 template <
typename T,
size_t Size>
1494 template <
typename T>
1497 template <
typename T>
1500 template <
typename T>
1503 #if ETL_USING_STL && ETL_USING_CPP11
1504 template <
typename T,
size_t Size>
1505 span(std::array<T, Size>&) -> span<T, Size>;
1507 template <
typename T,
size_t Size>
1508 span(
const std::array<T, Size>&) -> span<const T, Size>;
1515#if ETL_USING_8BIT_TYPES
1516 template <
typename T,
size_t Extent>
1517 struct hash<
etl::span<T, Extent> >
1521 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
1522 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
1530 template <
class T,
size_t Size>
1534 (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size *
sizeof(T)) > (
reinterpret_cast<const byte*
>(s.
data()), s.
size_bytes());
1540 template <
class T,
size_t Size>
1543 ETL_STATIC_ASSERT(!etl::is_const<T>::value,
"span<T> must be of non-const type");
1545 (Size == etl::dynamic_extent) ? (etl::dynamic_extent) : (Size *
sizeof(T)) > (
reinterpret_cast<byte*
>(s.
data()), s.
size_bytes());
The byte class.
Definition byte.h:147
Definition iterator.h:252
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:1056
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_IF(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:1243
ETL_NODISCARD etl::span< TRet > take(size_t const n)
Definition span.h:1346
span(const TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::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 &&has_size< TContainer >::value &&has_data< 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:890
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:985
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the last element.
Definition span.h:1018
ETL_CONSTEXPR span() ETL_NOEXCEPT
Default constructor.
Definition span.h:809
ETL_CONSTEXPR span(etl::array< U, Size > &other, typename etl::enable_if< etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from etl array.
Definition span.h:932
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Definition span.h:1285
void advance(size_t elements) ETL_NOEXCEPT
Definition span.h:1320
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:1096
ETL_NODISCARD TRet & take()
Definition span.h:1366
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:1128
ETL_NODISCARD ETL_CONSTEXPR14 etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1305
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:1152
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:1120
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Returns a reference to the first element.
Definition span.h:1004
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:1104
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:1182
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:1064
span(TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::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 &&has_size< TContainer >::value &&has_data< 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:872
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:1048
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:1172
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > last() const ETL_NOEXCEPT_IF(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:1229
ETL_CONSTEXPR span(const TIteratorBegin begin_, const TIteratorEnd end_, typename etl::enable_if<!etl::is_integral< TIteratorEnd >::value, void >::type *=0) ETL_NOEXCEPT
Construct from iterators.
Definition span.h:829
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1213
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:1330
ETL_CONSTEXPR span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
Construct from C array.
Definition span.h:840
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:1072
ETL_CONSTEXPR span(const etl::array< U, Size > &other, typename etl::enable_if< etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from const etl array.
Definition span.h:943
ETL_CONSTEXPR span(const TIterator begin_, size_t size_) ETL_NOEXCEPT
Construct from iterator + size.
Definition span.h:819
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:1040
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:1032
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:1112
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:1144
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:1136
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:1198
ETL_CONSTEXPR span(const etl::span< U, Size > &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:995
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:1162
Span - Fixed Extent.
Definition span.h:208
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition span.h:548
ETL_CONSTEXPR span(const etl::span< U, Size > &other, typename etl::enable_if<(Size==Extent) &&(Size !=etl::dynamic_extent), void >::type *=0) ETL_NOEXCEPT
Definition span.h:402
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition span.h:492
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the span.
Definition span.h:476
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:662
ETL_CONSTEXPR span(etl::array< U, Size > &other, typename etl::enable_if<(Size==Extent) &&etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from etl array.
Definition span.h:343
ETL_CONSTEXPR span(const span &other) ETL_NOEXCEPT
Copy constructor.
Definition span.h:392
etl::span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Definition span.h:712
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT_IF(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:674
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:532
ETL_CONSTEXPR14 span(const TIterator begin_, const size_t size_) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
Construct from iterator + size.
Definition span.h:251
ETL_CONSTEXPR14 span(const TIteratorBegin begin_, const TIteratorEnd end_, typename etl::enable_if< !etl::is_integral< TIteratorEnd >::value, void >::type *=0) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS)
Construct from iterators.
Definition span.h:262
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition span.h:484
ETL_CONSTEXPR span(const etl::array< U, Size > &other, typename etl::enable_if<(Size==Extent) &&etl::is_convertible< U(*)[], T(*)[]>::value, void >::type *=0) ETL_NOEXCEPT
Constructor from const etl array.
Definition span.h:353
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition span.h:572
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition span.h:556
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
Returns a const iterator to the end of the span.
Definition span.h:500
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, COUNT > first() const ETL_NOEXCEPT
Definition span.h:633
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition span.h:564
ETL_CONSTEXPR span(typename etl::type_identity< element_type >::type(&begin_)[Array_Size], typename etl::enable_if<(Array_Size==Extent), void >::type *=0) ETL_NOEXCEPT
Construct from C array.
Definition span.h:274
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition span.h:458
ETL_CONSTEXPR span() ETL_NOEXCEPT
Definition span.h:240
span(TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::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 &&has_size< TContainer >::value &&has_data< 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)
Definition span.h:306
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition span.h:588
ETL_CONSTEXPR14 span(const etl::span< U, Size > &other, typename etl::enable_if<(Size==etl::dynamic_extent), void >::type *=0)
Definition span.h:413
span(const TContainer &a, typename etl::enable_if< !etl::is_span< TContainer >::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 &&has_size< TContainer >::value &&has_data< 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)
Definition span.h:324
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:757
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:646
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition span.h:468
ETL_NODISCARD ETL_CONSTEXPR14 reference at(size_t i)
Returns a reference to the value at index 'i'.
Definition span.h:597
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition span.h:617
ETL_NODISCARD ETL_CONSTEXPR14 const_reference at(size_t i) const
Returns a const reference to the value at index 'i'.
Definition span.h:607
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:540
ETL_NODISCARD ETL_CONSTEXPR etl::span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_EXTRA)
Definition span.h:736
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition span.h:580
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition span.h:448
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition span.h:508
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
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_CONSTEXPR TContainer::const_reverse_iterator crbegin(const TContainer &container)
Definition iterator.h:1109
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1089
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
bool is_aligned(const void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:91
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
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:1531
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:1541
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
ETL_CONSTEXPR span< T, Extent > make_span(T(&data)[Extent])
Definition span.h:775
remove_cv
Definition type_traits.h:325
remove_reference
Definition type_traits.h:122