34#ifndef ETL_POLY_SPAN_INCLUDED
35#define ETL_POLY_SPAN_INCLUDED
48#if ETL_USING_STL && ETL_USING_CPP11
57 template <
typename U,
size_t Extent>
60 namespace private_poly_span
65 template <
typename TBase>
70 template <
typename U,
size_t Extent>
73 template <
typename UBase>
74 friend class const_iterator;
76 typedef TBase value_type;
77 typedef ptrdiff_t difference_type;
78 typedef TBase* pointer;
79 typedef TBase& reference;
80 typedef ETL_OR_STD::random_access_iterator_tag iterator_category;
90 iterator(
const iterator& other)
92 , element_size(other.element_size)
97 iterator& operator=(
const iterator& rhs)
100 element_size = rhs.element_size;
106 TBase& operator*()
const
112 TBase* operator->()
const
118 iterator& operator++()
120 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) + element_size);
125 iterator operator++(
int)
127 iterator temp(*
this);
128 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) + element_size);
133 iterator& operator--()
135 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) - element_size);
140 iterator operator--(
int)
142 iterator temp(*
this);
143 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) - element_size);
148 iterator& operator+=(difference_type offset)
150 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) + (offset * difference_type(element_size)));
155 iterator& operator-=(difference_type offset)
157 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) - (offset * difference_type(element_size)));
162 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
164 return (lhs.ptr == rhs.ptr) && (lhs.element_size == rhs.element_size);
168 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
170 return !(lhs == rhs);
174 friend bool operator<(
const iterator& lhs,
const iterator& rhs)
176 return lhs.ptr < rhs.ptr;
180 friend bool operator<=(
const iterator& lhs,
const iterator& rhs)
186 friend bool operator>(
const iterator& lhs,
const iterator& rhs)
192 friend bool operator>=(
const iterator& lhs,
const iterator& rhs)
198 friend iterator operator+(
const iterator& lhs, difference_type offset)
206 friend iterator operator+(difference_type offset,
const iterator& rhs)
214 friend iterator operator-(
const iterator& lhs, difference_type offset)
222 friend iterator operator-(difference_type offset,
const iterator& rhs)
230 friend difference_type operator-(
const iterator& lhs,
const iterator& rhs)
232 return lhs.ptr - rhs.ptr;
238 iterator(TBase* pbegin_,
size_t index_,
size_t element_size_)
239 : element_size(element_size_)
241 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(pbegin_) + (index_ * element_size));
252 template <
typename TBase,
size_t Extent = etl::dynamic_extent>
257 typedef TBase element_type;
258 typedef typename etl::remove_cv<TBase>::type value_type;
259 typedef size_t size_type;
260 typedef TBase& reference;
261 typedef const TBase& const_reference;
262 typedef TBase* pointer;
263 typedef const TBase* const_pointer;
266 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
268 static ETL_CONSTANT
size_t extent = Extent;
270 template <
typename UBase,
size_t UExtent>
271 friend class poly_span;
277 : pbegin(ETL_NULLPTR)
285 template <
typename TIterator,
typename TSize>
286 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TSize ) ETL_NOEXCEPT
288 , element_size(
sizeof(
typename etl::iterator_traits<TIterator>::value_type))
290 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
292 ETL_STATIC_ASSERT((etl::is_same< ETL_OR_STD::random_access_iterator_tag,
typename etl::iterator_traits<TIterator>::iterator_category>::value),
293 "Not a random access iterator");
294 ETL_STATIC_ASSERT((etl::is_base_of<TBase, data_type>::value || etl::is_same<TBase, data_type>::value),
"TBase not a base of the data type");
300 template <
typename TIterator>
301 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TIterator )
305 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
306 typedef typename etl::iterator_traits<TIterator>::iterator_category
iterator_category;
308 ETL_STATIC_ASSERT((etl::is_same<ETL_OR_STD::random_access_iterator_tag, iterator_category>::value),
"Not a random access iterator");
309 ETL_STATIC_ASSERT((etl::is_base_of<TBase, data_type>::value || etl::is_same<TBase, data_type>::value),
"TBase not a base of the data type");
315 template <
typename U,
size_t Size>
318 , element_size(
sizeof(U))
320 ETL_STATIC_ASSERT(Size <= Extent,
"Array data overflow");
321 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
327 template <
typename U,
size_t Size>
330 , element_size(
sizeof(U))
332 ETL_STATIC_ASSERT(Size <= Extent,
"Array data overflow");
333 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
339 template <
typename U,
size_t Size>
342 , element_size(
sizeof(U))
344 ETL_STATIC_ASSERT(Size <= Extent,
"Array data overflow");
345 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
348#if ETL_USING_STL && ETL_USING_CPP11
352 template <
typename U,
size_t Size>
353 ETL_CONSTEXPR
poly_span(std::array<U, Size>& a) ETL_NOEXCEPT
355 , element_size(
sizeof(U))
357 ETL_STATIC_ASSERT(Size <= Extent,
"Array data overflow");
358 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of U");
364 template <
typename U,
size_t Size>
365 ETL_CONSTEXPR
poly_span(
const std::array<U, Size>& a) ETL_NOEXCEPT
367 , element_size(
sizeof(U))
369 ETL_STATIC_ASSERT(Size <= Extent,
"Array data overflow");
370 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of U");
377 ETL_CONSTEXPR
poly_span(
const poly_span<TBase, Extent>& other) ETL_NOEXCEPT
378 : pbegin(other.pbegin)
379 , element_size(other.element_size)
386 template <
typename UBase>
387 ETL_CONSTEXPR
poly_span(
const poly_span<UBase, Extent>& other) ETL_NOEXCEPT
388 : pbegin(other.pbegin)
389 , element_size(other.element_size)
396 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
404 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
406 return *element_at(Extent - 1U);
412 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
420 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
422 return iterator(pbegin, 0U, element_size);
428 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
430 return iterator(pbegin, Extent, element_size);
444 ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
446 return reverse_iterator(
begin());
452 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
454 return (Extent == 0U);
460 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
476 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
478 return Extent * element_size;
484 ETL_CONSTEXPR14 poly_span&
operator=(
const poly_span& other) ETL_NOEXCEPT
486 pbegin = other.pbegin;
487 element_size = other.element_size;
494 template <
typename UBase>
495 ETL_CONSTEXPR14 poly_span&
operator=(
const poly_span<UBase, Extent>& other) ETL_NOEXCEPT
497 pbegin = other.pbegin;
498 element_size = other.element_size;
507 return *element_at(i);
514 template <
size_t COUNT>
533 template <
size_t COUNT>
553 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
554 ETL_NODISCARD ETL_CONSTEXPR
etl::poly_span< element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan() const ETL_NOEXCEPT
556 return (COUNT == etl::dynamic_extent) ?
etl::poly_span < element_type,
557 COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin, OFFSET, Extent, element_size) :
etl::
poly_span < element_type,
558 COUNT !=
etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin, OFFSET, COUNT, element_size);
565 template <
size_t OFFSET,
size_t COUNT>
568 if (COUNT == etl::dynamic_extent)
570 return etl::poly_span < element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin, OFFSET, Extent, element_size);
574 return etl::poly_span < element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET > (pbegin, OFFSET, element_size);
593 template <
typename TFrom>
596 typedef typename etl::conditional<etl::is_const<TFrom>::value,
const char*,
char*>::type type;
599 typedef typename char_ptr_type<TBase>::type char_ptr_t;
602 pointer element_at(
size_t index)
const ETL_NOEXCEPT
604 char_ptr_t base =
reinterpret_cast<char_ptr_t
>(pbegin);
605 return reinterpret_cast<pointer
>(base + (index * element_size));
612 poly_span(TBase* pbegin_,
size_t offset_,
size_t ,
size_t element_size_) ETL_NOEXCEPT
613 : pbegin(
reinterpret_cast<pointer
>(
reinterpret_cast<char_ptr_t
>(pbegin_) + (offset_ * element_size_)))
614 , element_size(element_size_)
624 template <
typename TBase,
size_t Extent>
625 ETL_CONSTANT
size_t poly_span<TBase, Extent>::extent;
630 template <
typename TBase>
631 class poly_span<TBase,
etl::dynamic_extent>
635 typedef TBase element_type;
636 typedef typename etl::remove_cv<TBase>::type value_type;
637 typedef size_t size_type;
638 typedef TBase& reference;
639 typedef const TBase& const_reference;
640 typedef TBase* pointer;
641 typedef const TBase* const_pointer;
643 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
645 static ETL_CONSTANT
size_t extent = etl::dynamic_extent;
647 template <
typename UBase,
size_t UExtent>
648 friend class poly_span;
654 : pbegin(ETL_NULLPTR)
663 template <
typename TIterator,
typename TSize>
664 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TSize size_) ETL_NOEXCEPT
666 , element_size(
sizeof(
typename etl::iterator_traits<TIterator>::value_type))
669 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
670 typedef typename etl::iterator_traits<TIterator>::iterator_category
iterator_category;
672 ETL_STATIC_ASSERT((etl::is_same<ETL_OR_STD::random_access_iterator_tag, iterator_category>::value),
"Not a random access iterator");
673 ETL_STATIC_ASSERT((etl::is_base_of<TBase, data_type>::value || etl::is_same<TBase, data_type>::value),
"TBase not a base of the data type");
679 template <
typename TIterator>
680 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TIterator end_)
683 , span_extent(size_t(
etl::distance(begin_, end_)))
685 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
686 typedef typename etl::iterator_traits<TIterator>::iterator_category
iterator_category;
688 ETL_STATIC_ASSERT((etl::is_same<ETL_OR_STD::random_access_iterator_tag, iterator_category>::value),
"Not a random access iterator");
689 ETL_STATIC_ASSERT((etl::is_base_of<TBase, data_type>::value || etl::is_same<TBase, data_type>::value),
"TBase not a base of the data type");
695 template <
typename U,
size_t Size>
698 , element_size(
sizeof(U))
701 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
707 template <
typename U,
size_t Size>
710 , element_size(
sizeof(U))
713 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
719 template <
typename U,
size_t Size>
722 , element_size(
sizeof(U))
725 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of the data type");
728#if ETL_USING_STL && ETL_USING_CPP11
732 template <
typename U,
size_t Size>
733 ETL_CONSTEXPR
poly_span(std::array<U, Size>& a) ETL_NOEXCEPT
735 , element_size(
sizeof(U))
738 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of U");
744 template <
typename U,
size_t Size>
745 ETL_CONSTEXPR
poly_span(
const std::array<U, Size>& a) ETL_NOEXCEPT
747 , element_size(
sizeof(U))
750 ETL_STATIC_ASSERT((etl::is_base_of<TBase, U>::value || etl::is_same<TBase, U>::value),
"TBase not a base of U");
757 ETL_CONSTEXPR
poly_span(
const poly_span<TBase, etl::dynamic_extent>& other) ETL_NOEXCEPT
758 : pbegin(other.pbegin)
759 , element_size(other.element_size)
760 , span_extent(other.span_extent)
767 template <
typename UBase>
768 ETL_CONSTEXPR
poly_span(
const poly_span<UBase, etl::dynamic_extent>& other) ETL_NOEXCEPT
769 : pbegin(other.pbegin)
770 , element_size(other.element_size)
771 , span_extent(other.span_extent)
778 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
786 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
788 return *element_at(span_extent - 1U);
794 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
802 ETL_NODISCARD ETL_CONSTEXPR iterator
begin() const ETL_NOEXCEPT
804 return iterator(pbegin, 0U, element_size);
810 ETL_NODISCARD ETL_CONSTEXPR iterator
end() const ETL_NOEXCEPT
812 return iterator(pbegin, span_extent, element_size);
826 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
828 return reverse_iterator(
begin());
834 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
836 return (span_extent == 0);
842 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
858 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
860 return element_size * span_extent;
866 ETL_CONSTEXPR14 poly_span&
operator=(
const poly_span& other) ETL_NOEXCEPT
868 pbegin = other.pbegin;
869 element_size = other.element_size;
870 span_extent = other.span_extent;
877 template <
typename UBase>
878 ETL_CONSTEXPR14 poly_span&
operator=(
const poly_span<UBase, etl::dynamic_extent>& other) ETL_NOEXCEPT
880 pbegin = other.pbegin;
881 element_size = other.element_size;
882 span_extent = other.span_extent;
891 return *element_at(i);
898 template <
size_t COUNT>
917 template <
size_t COUNT>
937 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
940 return (COUNT == etl::dynamic_extent) ?
etl::poly_span < element_type,
941 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin, OFFSET, span_extent, element_size) :
etl::
poly_span < element_type,
942 COUNT !=
etl::dynamic_extent ? COUNT :
etl::dynamic_extent > (pbegin, OFFSET, COUNT, element_size);
949 template <
size_t OFFSET,
size_t COUNT>
952 if (COUNT == etl::dynamic_extent)
955 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin, OFFSET, span_extent, element_size);
960 COUNT != etl::dynamic_extent ? COUNT : etl::dynamic_extent > (pbegin, OFFSET, span_extent, element_size);
981 poly_span(TBase* pbegin_,
size_t offset_,
size_t extent_,
size_t element_size_) ETL_NOEXCEPT
982 : pbegin(
reinterpret_cast<pointer
>(
reinterpret_cast<char_ptr_t
>(pbegin_) + (offset_ * element_size_)))
983 , element_size(element_size_)
984 , span_extent(extent_)
991 template <
typename TFrom>
994 typedef typename etl::conditional<etl::is_const<TFrom>::value,
const char*,
char*>
::type type;
997 typedef typename char_ptr_type<TBase>::type char_ptr_t;
1000 pointer element_at(
size_t index)
const ETL_NOEXCEPT
1002 char_ptr_t base =
reinterpret_cast<char_ptr_t
>(pbegin);
1003 return reinterpret_cast<pointer
>(base + (index * element_size));
1007 size_t element_size;
1011 template <
typename TBase>
1012 ETL_CONSTANT
size_t poly_span<TBase, etl::dynamic_extent>::extent;
1018 template <
typename TIterator>
1021 template <
typename TIterator,
typename TSize>
1024 template <
typename T,
size_t Size>
1027 template <
typename T,
size_t Size>
1030 template <
typename T,
size_t Size>
1034 template <
typename T,
size_t Size>
1037 template <
typename T,
size_t Size>
1045#if ETL_USING_8BIT_TYPES
1046 template <
typename TBase,
size_t Extent>
1047 struct hash<etl::
poly_span<TBase, Extent> >
1049 size_t operator()(
const etl::poly_span<TBase, Extent>& view)
const
1051 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
1052 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
ETL_CONSTEXPR poly_span(const TIterator begin_, const TSize size_) ETL_NOEXCEPT
Construct from iterator + size.
Definition poly_span.h:664
ETL_CONSTEXPR poly_span() ETL_NOEXCEPT
Default constructor.
Definition poly_span.h:653
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition poly_span.h:778
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT
Definition poly_span.h:927
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > last() const ETL_NOEXCEPT
Definition poly_span.h:918
ETL_NODISCARD ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the poly_span.
Definition poly_span.h:826
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the poly_span.
Definition poly_span.h:802
ETL_CONSTEXPR14 poly_span & operator=(const poly_span &other) ETL_NOEXCEPT
Assign from a poly_span.
Definition poly_span.h:866
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition poly_span.h:794
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the poly_span.
Definition poly_span.h:842
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT
Definition poly_span.h:969
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the poly_span size is zero.
Definition poly_span.h:834
ETL_NODISCARD ETL_CONSTEXPR size_t size_of_element() const ETL_NOEXCEPT
Returns the size of the type stored in the poly_span.
Definition poly_span.h:850
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > first() const ETL_NOEXCEPT
Definition poly_span.h:899
ETL_CONSTEXPR poly_span(U(&begin_)[Size]) ETL_NOEXCEPT
Construct from C array.
Definition poly_span.h:696
poly_span(TBase *pbegin_, size_t offset_, size_t extent_, size_t element_size_) ETL_NOEXCEPT
Construct from iterator + offset + size + element size.
Definition poly_span.h:981
ETL_CONSTEXPR poly_span(const TIterator begin_, const TIterator end_)
Construct from iterators.
Definition poly_span.h:680
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the poly_span in bytes.
Definition poly_span.h:858
ETL_CONSTEXPR poly_span(const etl::array< U, Size > &a) ETL_NOEXCEPT
Construct from etl::array.
Definition poly_span.h:720
ETL_CONSTEXPR poly_span(const poly_span< TBase, etl::dynamic_extent > &other) ETL_NOEXCEPT
Copy constructor.
Definition poly_span.h:757
ETL_CONSTEXPR reference operator[](size_t i) const
Returns a reference to the indexed value.
Definition poly_span.h:889
ETL_CONSTEXPR14 poly_span & operator=(const poly_span< UBase, etl::dynamic_extent > &other) ETL_NOEXCEPT
Assign from a poly_span.
Definition poly_span.h:878
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition poly_span.h:786
ETL_CONSTEXPR poly_span(const poly_span< UBase, etl::dynamic_extent > &other) ETL_NOEXCEPT
Copy constructor.
Definition poly_span.h:768
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > first(size_t count) const ETL_NOEXCEPT
Definition poly_span.h:908
ETL_CONSTEXPR poly_span(etl::array< U, Size > &a) ETL_NOEXCEPT
Construct from etl::array.
Definition poly_span.h:708
etl::poly_span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Definition poly_span.h:950
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the poly_span.
Definition poly_span.h:810
Poly Span - Fixed Extent.
Definition poly_span.h:254
ETL_NODISCARD ETL_CONSTEXPR size_t size_of_element() const ETL_NOEXCEPT
Returns the size of the type stored in the poly_span.
Definition poly_span.h:468
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the poly_span.
Definition poly_span.h:428
ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the poly_span.
Definition poly_span.h:444
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition poly_span.h:412
poly_span(TBase *pbegin_, size_t offset_, size_t, size_t element_size_) ETL_NOEXCEPT
Definition poly_span.h:612
ETL_CONSTEXPR14 poly_span & operator=(const poly_span &other) ETL_NOEXCEPT
Assign from a poly_span.
Definition poly_span.h:484
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the poly_span size is zero.
Definition poly_span.h:452
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition poly_span.h:396
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > subspan(size_t offset, size_t count=etl::dynamic_extent) const ETL_NOEXCEPT
Definition poly_span.h:583
ETL_CONSTEXPR poly_span() ETL_NOEXCEPT
Default constructor.
Definition poly_span.h:276
ETL_CONSTEXPR poly_span(U(&begin_)[Size]) ETL_NOEXCEPT
Construct from C array.
Definition poly_span.h:316
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > first(size_t count) const
Definition poly_span.h:524
ETL_CONSTEXPR poly_span(const TIterator begin_, const TSize) ETL_NOEXCEPT
Construct from iterator + size.
Definition poly_span.h:286
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the poly_span.
Definition poly_span.h:420
etl::poly_span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Definition poly_span.h:566
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition poly_span.h:404
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the poly_span in bytes.
Definition poly_span.h:476
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > last() const ETL_NOEXCEPT
Definition poly_span.h:534
ETL_CONSTEXPR poly_span(const etl::array< U, Size > &a) ETL_NOEXCEPT
Construct from etl::array.
Definition poly_span.h:340
ETL_CONSTEXPR poly_span(etl::array< U, Size > &a) ETL_NOEXCEPT
Construct from etl::array.
Definition poly_span.h:328
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the poly_span.
Definition poly_span.h:460
ETL_CONSTEXPR14 poly_span & operator=(const poly_span< UBase, Extent > &other) ETL_NOEXCEPT
Assign from a poly_span.
Definition poly_span.h:495
ETL_CONSTEXPR poly_span(const poly_span< TBase, Extent > &other) ETL_NOEXCEPT
Copy constructor.
Definition poly_span.h:377
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, etl::dynamic_extent > last(size_t count) const ETL_NOEXCEPT
Definition poly_span.h:543
ETL_CONSTEXPR reference operator[](size_t i) const
Returns a reference to the indexed value.
Definition poly_span.h:505
ETL_CONSTEXPR poly_span(const poly_span< UBase, Extent > &other) ETL_NOEXCEPT
Copy constructor.
Definition poly_span.h:387
ETL_CONSTEXPR poly_span(const TIterator begin_, const TIterator)
Construct from iterators.
Definition poly_span.h:301
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > first() const ETL_NOEXCEPT
Definition poly_span.h:515
Definition poly_span.h:67
Definition iterator.h:252
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
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition iterator.h:1089
Definition poly_span.h:595