31#ifndef ETL_SPAN_INCLUDED
32#define ETL_SPAN_INCLUDED
48#if ETL_USING_STL && ETL_USING_CPP11
60 template <
typename T,
size_t Extent = etl::dynamic_extent>
65 typedef T element_type;
66 typedef typename etl::remove_cv<T>::type value_type;
67 typedef size_t size_type;
69 typedef const T& const_reference;
71 typedef const T* const_pointer;
74 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
76 typedef etl::circular_iterator<pointer> circular_iterator;
77 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
79 static ETL_CONSTANT
size_t extent = Extent;
84 ETL_CONSTEXPR
span() ETL_NOEXCEPT
92 template <
typename TIterator,
typename TSize>
93 ETL_CONSTEXPR
explicit span(
const TIterator begin_,
const TSize ) ETL_NOEXCEPT
101 template <
typename TIterator>
102 ETL_CONSTEXPR
explicit span(
const TIterator begin_,
const TIterator )
110 template<
size_t Array_Size>
111 ETL_CONSTEXPR
span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
120 template <
typename U,
size_t N,
typename =
typename etl::enable_if<(N == Extent) && etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
129 template <
typename U,
size_t N,
typename =
typename etl::enable_if<(N == Extent) && etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
138 template <
typename U,
size_t N>
147 template <
typename U,
size_t N>
154#if ETL_USING_STL && ETL_USING_CPP11
158 template <
typename U,
size_t N,
typename =
typename etl::enable_if<(N == Extent) && etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
159 ETL_CONSTEXPR
span(std::array<U, N>& a) ETL_NOEXCEPT
167 template <
typename U,
size_t N,
typename =
typename etl::enable_if<(N == Extent) && etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
168 ETL_CONSTEXPR
span(
const std::array<U, N>& a) ETL_NOEXCEPT
179 template <
typename TContainer,
typename =
typename etl::enable_if<!etl::is_po
inter<etl::remove_reference_t<TContainer>>::value &&
180 !etl::is_array<etl::remove_reference_t<TContainer>>::value&&
181 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<
typename etl::remove_reference_t<TContainer>::value_type>>::value,
void>::type>
182 ETL_CONSTEXPR
span(TContainer&& a) ETL_NOEXCEPT
191 template <
typename TContainer>
203 template <
typename TContainer>
216 : pbegin(other.pbegin)
223 template <
typename U,
size_t N>
224 ETL_CONSTEXPR
span(
const etl::span<U, N>& other,
typename etl::enable_if<(Extent == etl::dynamic_extent) || (N == etl::dynamic_extent) || (N == Extent),
void>::type) ETL_NOEXCEPT
225 : pbegin(other.
data())
232 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
240 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
242 return *((pbegin + Extent) - 1);
248 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
256 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
264 ETL_NODISCARD ETL_CONSTEXPR circular_iterator
begin_circular() const ETL_NOEXCEPT
266 return circular_iterator(
begin(),
end());
272 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
274 return (pbegin + Extent);
288 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
290 return reverse_circular_iterator(rbegin(),
rend());
296 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
298 return reverse_iterator(pbegin);
304 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
312 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
320 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
322 return sizeof(element_type) * Extent;
328 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
338 pbegin = other.pbegin;
372 template <
size_t COUNT>
389 template <
size_t COUNT>
407 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
408 ETL_NODISCARD ETL_CONSTEXPR
409 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan() const ETL_NOEXCEPT
411 return (COUNT == etl::dynamic_extent) ?
etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, (pbegin + Extent))
412 :
etl::
span<element_type, COUNT !=
etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
418 template <
size_t OFFSET,
size_t COUNT>
419 etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan()
const
421 if (COUNT == etl::dynamic_extent)
423 return etl::span<element_type, (COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET)>(pbegin + OFFSET, (pbegin + Extent));
427 return etl::span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
449 template <
typename T>
454 typedef T element_type;
455 typedef typename etl::remove_cv<T>::type value_type;
456 typedef size_t size_type;
457 typedef T& reference;
458 typedef const T& const_reference;
460 typedef const T* const_pointer;
463 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
465 typedef etl::circular_iterator<pointer> circular_iterator;
466 typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
468 static ETL_CONSTANT
size_t extent = etl::dynamic_extent;
473 ETL_CONSTEXPR
span() ETL_NOEXCEPT
474 : pbegin(ETL_NULLPTR)
482 template <
typename TIterator,
typename TSize>
483 ETL_CONSTEXPR
span(
const TIterator begin_,
const TSize size_) ETL_NOEXCEPT
492 template <
typename TIterator>
493 ETL_CONSTEXPR
span(
const TIterator begin_,
const TIterator end_)
502 template<
size_t Array_Size>
503 ETL_CONSTEXPR
span(element_type(&begin_)[Array_Size]) ETL_NOEXCEPT
505 , pend(begin_ + Array_Size)
513 template <
typename U,
size_t N,
typename =
typename etl::enable_if<etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
523 template <
typename U,
size_t N,
typename =
typename etl::enable_if<etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
533 template <
typename U,
size_t N>
543 template <
typename U,
size_t N>
551#if ETL_USING_STL && ETL_USING_CPP11
555 template <
typename U,
size_t N,
typename =
typename etl::enable_if<etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
556 ETL_CONSTEXPR
span(std::array<U, N>& a) ETL_NOEXCEPT
565 template <
typename U,
size_t N,
typename =
typename etl::enable_if<etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>::type>
566 ETL_CONSTEXPR
span(
const std::array<U, N>& a) ETL_NOEXCEPT
578 template <
typename TContainer,
typename =
typename etl::enable_if<!etl::is_po
inter<etl::remove_reference_t<TContainer>>::value &&
579 !etl::is_array<etl::remove_reference_t<TContainer>>::value &&
580 etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<
typename etl::remove_reference_t<TContainer>::value_type>>::value,
void>::type>
581 ETL_CONSTEXPR
span(TContainer&& a) ETL_NOEXCEPT
591 template <
typename TContainer>
604 template <
typename TContainer>
618 : pbegin(other.pbegin)
626 template <
typename U,
size_t N>
628 : pbegin(other.
data())
636 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
644 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
652 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
660 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
668 ETL_NODISCARD ETL_CONSTEXPR circular_iterator
begin_circular() const ETL_NOEXCEPT
670 return circular_iterator(
begin(),
end());
676 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
692 ETL_NODISCARD ETL_CONSTEXPR reverse_circular_iterator
rbegin_circular() const ETL_NOEXCEPT
694 return reverse_circular_iterator(rbegin(),
rend());
700 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
702 return reverse_iterator(pbegin);
708 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
710 return (pbegin == pend);
716 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
718 return (pend - pbegin);
724 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
726 return sizeof(element_type) * (pend - pbegin);
732 ETL_NODISCARD ETL_CONSTEXPR
size_t max_size() const ETL_NOEXCEPT
742 pbegin = other.pbegin;
778 template <
size_t COUNT>
795 template <
size_t COUNT>
813 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
814 ETL_NODISCARD ETL_CONSTEXPR
818 :
etl::
span<element_type, COUNT !=
etl::dynamic_extent ? COUNT :
etl::dynamic_extent>(pbegin + OFFSET, pbegin + OFFSET + COUNT);
824 template <
size_t OFFSET,
size_t COUNT>
827 if (COUNT == etl::dynamic_extent)
853 template <
typename T,
size_t Extent>
854 ETL_CONSTANT
size_t span<T, Extent>::extent;
856 template <
typename T>
857 ETL_CONSTANT
size_t span<T, etl::dynamic_extent>::extent;
862 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
868 return (lhs.begin() == rhs.begin()) && (lhs.size() == rhs.size());
874 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
879 return !(lhs == rhs);
890 template <
typename T1,
size_t N1,
typename T2,
size_t N2>
903 template <
typename TIterator>
904 span(
const TIterator begin_,
const TIterator end_)
905 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
907 template <
typename TIterator,
typename TSize>
908 span(
const TIterator begin_,
const TSize size_)
909 ->span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
911 template <
typename T,
size_t N>
915 template <
typename T,
size_t N>
919 template <
typename T,
size_t N>
923#if ETL_USING_STL && ETL_USING_CPP11
924 template <
typename T,
size_t N>
925 span(std::array<T, N>&)
928 template <
typename T,
size_t N>
929 span(
const std::array<T, N>&)
937#if ETL_USING_8BIT_TYPES
938 template <
typename T,
size_t Extent>
939 struct hash<
etl::span<T, Extent> >
943 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
944 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
952 template <
class T,
size_t N>
953 span<
const byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N *
sizeof(T))>
962 template <
class T,
size_t N>
963 span<byte, (N == etl::dynamic_extent) ? (etl::dynamic_extent) : (N *
sizeof(T))>
Definition: iterator.h:228
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:825
Span - Fixed Extent.
Definition: span.h:62
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the span.
Definition: span.h:296
ETL_NODISCARD ETL_CONSTEXPR circular_iterator begin_circular() const ETL_NOEXCEPT
Returns a circular iterator to the beginning of the span.
Definition: span.h:264
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:390
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:419
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:288
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the span.
Definition: span.h:256
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the span in bytes.
Definition: span.h:320
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the span size is zero.
Definition: span.h:304
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:373
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the span.
Definition: span.h:312
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition: span.h:240
ETL_CONSTEXPR span() ETL_NOEXCEPT
Default constructor.
Definition: span.h:84
ETL_CONSTEXPR14 span & operator=(const span &other) ETL_NOEXCEPT
Assign from a span.
Definition: span.h:336
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition: span.h:248
ETL_CONSTEXPR reference operator[](const size_t i) const
Returns a reference to the indexed value.
Definition: span.h:345
span(TContainer &a, typename etl::enable_if<!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:192
ETL_NODISCARD ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the span.
Definition: span.h:328
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition: span.h:232
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the span.
Definition: span.h:272
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the array.
Definition: array.h:347
ETL_NODISCARD pointer data() ETL_NOEXCEPT
Returns a pointer to the first element of the internal buffer.
Definition: array.h:204
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
enable_if
Definition: type_traits_generator.h:1191
extent
Definition: type_traits_generator.h:1202
is_array
Definition: type_traits_generator.h:1091
is_const
Definition: type_traits_generator.h:908
is_pointer
Definition: type_traits_generator.h:1101
is_same
Definition: type_traits_generator.h:1041
remove_cv
Definition: type_traits_generator.h:968
remove_reference
Definition: type_traits_generator.h:878
bitset_ext
Definition: absolute.h:38
span< byte,(N==etl::dynamic_extent) ?(etl::dynamic_extent) :(N *sizeof(T))> as_writable_bytes(span< T, N > s) ETL_NOEXCEPT
Obtains a view to the byte representation of the elements of the span s.
Definition: span.h:964
span< const byte,(N==etl::dynamic_extent) ?(etl::dynamic_extent) :(N *sizeof(T))> as_bytes(span< T, N > s) ETL_NOEXCEPT
Template deduction guides.
Definition: span.h:954
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633