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;
92 , element_size(other.element_size)
100 element_size = rhs.element_size;
106 TBase& operator *()
const
112 TBase* operator ->()
const
120 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) + element_size);
128 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) + element_size);
135 ptr =
reinterpret_cast<pointer
>(
reinterpret_cast<char*
>(ptr) - element_size);
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)));
164 return (lhs.ptr == rhs.ptr) && (lhs.element_size == rhs.element_size);
170 return !(lhs == rhs);
176 return lhs.ptr < rhs.ptr;
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>
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),
"Not a random access iterator");
299 template <
typename TIterator>
300 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TIterator )
304 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
305 typedef typename etl::iterator_traits<TIterator>::iterator_category iterator_category;
314 template<
typename U,
size_t N>
317 , element_size(
sizeof(U))
319 ETL_STATIC_ASSERT(N <= Extent,
"Array data overflow");
326 template <
typename U,
size_t N>
329 , element_size(
sizeof(U))
331 ETL_STATIC_ASSERT(N <= Extent,
"Array data overflow");
338 template <
typename U,
size_t N>
341 , element_size(
sizeof(U))
343 ETL_STATIC_ASSERT(N <= Extent,
"Array data overflow");
347#if ETL_USING_STL && ETL_USING_CPP11
351 template <
typename U,
size_t N>
352 ETL_CONSTEXPR
poly_span(std::array<U, N>& a) ETL_NOEXCEPT
354 , element_size(
sizeof(U))
356 ETL_STATIC_ASSERT(N <= Extent,
"Array data overflow");
363 template <
typename U,
size_t N>
364 ETL_CONSTEXPR poly_span(
const std::array<U, N>& a) ETL_NOEXCEPT
366 , element_size(
sizeof(U))
368 ETL_STATIC_ASSERT(N <= Extent,
"Array data overflow");
377 : pbegin(other.pbegin)
378 , element_size(other.element_size)
385 template <
typename UBase>
387 : pbegin(other.pbegin)
388 , element_size(other.element_size)
395 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
403 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
405 return *element_at(Extent - 1U);
411 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
421 return iterator(pbegin, 0U, element_size);
429 return iterator(pbegin, Extent, element_size);
443 ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
445 return reverse_iterator(
begin());
451 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
453 return (Extent == 0U);
459 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
475 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
477 return Extent * element_size;
485 pbegin = other.pbegin;
486 element_size = other.element_size;
493 template <
typename UBase>
496 pbegin = other.pbegin;
497 element_size = other.element_size;
506 return *element_at(i);
512 template <
size_t COUNT>
529 template <
size_t COUNT>
547 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
548 ETL_NODISCARD ETL_CONSTEXPR
etl::poly_span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>
subspan() const ETL_NOEXCEPT
550 return (COUNT == etl::dynamic_extent) ?
etl::poly_span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin, OFFSET, Extent, element_size)
557 template <
size_t OFFSET,
size_t COUNT>
560 if (COUNT == etl::dynamic_extent)
562 return etl::poly_span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin, OFFSET, Extent, element_size);
566 return etl::poly_span<element_type, COUNT != etl::dynamic_extent ? COUNT : Extent - OFFSET>(pbegin, OFFSET, element_size);
583 template <
typename TFrom>
589 typedef typename char_ptr_type<TBase>::type char_ptr_t;
592 pointer element_at(
size_t index)
const ETL_NOEXCEPT
594 char_ptr_t base =
reinterpret_cast<char_ptr_t
>(pbegin);
595 return reinterpret_cast<pointer
>(base + (index * element_size));
602 poly_span(TBase* pbegin_,
size_t offset_,
size_t ,
size_t element_size_) ETL_NOEXCEPT
603 : pbegin(
reinterpret_cast<pointer
>(
reinterpret_cast<char_ptr_t
>(pbegin_) + (offset_ * element_size_)))
604 , element_size(element_size_)
614 template <
typename TBase,
size_t Extent>
615 ETL_CONSTANT
size_t poly_span<TBase, Extent>::extent;
620 template <
typename TBase>
625 typedef TBase element_type;
626 typedef typename etl::remove_cv<TBase>::type value_type;
627 typedef size_t size_type;
628 typedef TBase& reference;
629 typedef const TBase& const_reference;
630 typedef TBase* pointer;
631 typedef const TBase* const_pointer;
633 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
635 static ETL_CONSTANT
size_t extent = etl::dynamic_extent;
637 template <
typename UBase,
size_t UExtent>
644 : pbegin(ETL_NULLPTR)
653 template <
typename TIterator,
typename TSize>
654 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TSize size_) ETL_NOEXCEPT
656 , element_size(
sizeof(
typename etl::iterator_traits<TIterator>::value_type))
659 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
660 typedef typename etl::iterator_traits<TIterator>::iterator_category iterator_category;
669 template <
typename TIterator>
670 ETL_CONSTEXPR
poly_span(
const TIterator begin_,
const TIterator end_)
673 , span_extent(size_t(
etl::distance(begin_, end_)))
675 typedef typename etl::iterator_traits<TIterator>::value_type data_type;
676 typedef typename etl::iterator_traits<TIterator>::iterator_category iterator_category;
685 template<
typename U,
size_t N>
688 , element_size(
sizeof(U))
697 template <
typename U,
size_t N>
700 , element_size(
sizeof(U))
709 template <
typename U,
size_t N>
712 , element_size(
sizeof(U))
718#if ETL_USING_STL && ETL_USING_CPP11
722 template <
typename U,
size_t N>
723 ETL_CONSTEXPR
poly_span(std::array<U, N>& a) ETL_NOEXCEPT
725 , element_size(
sizeof(U))
734 template <
typename U,
size_t N>
735 ETL_CONSTEXPR poly_span(
const std::array<U, N>& a) ETL_NOEXCEPT
737 , element_size(
sizeof(U))
748 : pbegin(other.pbegin)
749 , element_size(other.element_size)
750 , span_extent(other.span_extent)
757 template <
typename UBase>
759 : pbegin(other.pbegin)
760 , element_size(other.element_size)
761 , span_extent(other.span_extent)
768 ETL_NODISCARD ETL_CONSTEXPR reference
front() const ETL_NOEXCEPT
776 ETL_NODISCARD ETL_CONSTEXPR reference
back() const ETL_NOEXCEPT
778 return *element_at(span_extent - 1U);
784 ETL_NODISCARD ETL_CONSTEXPR pointer
data() const ETL_NOEXCEPT
794 return iterator(pbegin, 0U, element_size);
802 return iterator(pbegin, span_extent, element_size);
816 ETL_NODISCARD ETL_CONSTEXPR reverse_iterator
rend() const ETL_NOEXCEPT
818 return reverse_iterator(
begin());
824 ETL_NODISCARD ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
826 return (span_extent == 0);
832 ETL_NODISCARD ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
848 ETL_NODISCARD ETL_CONSTEXPR
size_t size_bytes() const ETL_NOEXCEPT
850 return element_size * span_extent;
858 pbegin = other.pbegin;
859 element_size = other.element_size;
860 span_extent = other.span_extent;
867 template <
typename UBase>
870 pbegin = other.pbegin;
871 element_size = other.element_size;
872 span_extent = other.span_extent;
881 return *element_at(i);
887 template <
size_t COUNT>
904 template <
size_t COUNT>
922 template <
size_t OFFSET,
size_t COUNT = etl::dynamic_extent>
926 :
etl::
poly_span<element_type, COUNT !=
etl::dynamic_extent ? COUNT :
etl::dynamic_extent>(pbegin, OFFSET, COUNT, element_size);
932 template <
size_t OFFSET,
size_t COUNT>
935 if (COUNT == etl::dynamic_extent)
960 poly_span(TBase* pbegin_,
size_t offset_,
size_t extent_,
size_t element_size_) ETL_NOEXCEPT
961 : pbegin(
reinterpret_cast<pointer
>(
reinterpret_cast<char_ptr_t
>(pbegin_) + (offset_ * element_size_)))
962 , element_size(element_size_)
963 , span_extent(extent_)
970 template <
typename TFrom>
976 typedef typename char_ptr_type<TBase>::type char_ptr_t;
979 pointer element_at(
size_t index)
const ETL_NOEXCEPT
981 char_ptr_t base =
reinterpret_cast<char_ptr_t
>(pbegin);
982 return reinterpret_cast<pointer
>(base + (index * element_size));
990 template <
typename TBase>
991 ETL_CONSTANT
size_t poly_span<TBase, etl::dynamic_extent>::extent;
997 template <
typename TIterator>
998 poly_span(
const TIterator begin_,
const TIterator end_)
999 ->poly_span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1001 template <
typename TIterator,
typename TSize>
1002 poly_span(
const TIterator begin_,
const TSize size_)
1003 ->poly_span<etl::remove_pointer_t<TIterator>, etl::dynamic_extent>;
1005 template <
typename T,
size_t N>
1009 template <
typename T,
size_t N>
1013 template <
typename T,
size_t N>
1015 ->poly_span<
const T, N>;
1018 template <
typename T,
size_t N>
1019 poly_span(std::array<T, N>&)
1022 template <
typename T,
size_t N>
1023 poly_span(
const std::array<T, N>&)
1024 ->poly_span<
const T, N>;
1031#if ETL_USING_8BIT_TYPES
1032 template <
typename TBase,
size_t Extent>
1033 struct hash<
etl::poly_span<TBase, Extent> >
1037 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
1038 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
Poly Span - Dynamic Extent.
Definition: poly_span.h:622
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:960
etl::poly_span< element_type, COUNT !=etl::dynamic_extent ? COUNT :etl::dynamic_extent > subspan() const
Obtains a poly_span that is a view from OFFSET over the next COUNT elements of this poly_span.
Definition: poly_span.h:933
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:467
ETL_NODISCARD ETL_CONSTEXPR iterator end() const ETL_NOEXCEPT
Returns an iterator to the end of the poly_span.
Definition: poly_span.h:427
ETL_CONSTEXPR reverse_iterator rend() const ETL_NOEXCEPT
Returns a reverse iterator to the end of the poly_span.
Definition: poly_span.h:443
ETL_NODISCARD ETL_CONSTEXPR pointer data() const ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition: poly_span.h:411
poly_span(TBase *pbegin_, size_t offset_, size_t, size_t element_size_) ETL_NOEXCEPT
Definition: poly_span.h:602
ETL_CONSTEXPR14 poly_span & operator=(const poly_span &other) ETL_NOEXCEPT
Assign from a poly_span.
Definition: poly_span.h:483
ETL_NODISCARD ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the poly_span size is zero.
Definition: poly_span.h:451
ETL_NODISCARD ETL_CONSTEXPR reference front() const ETL_NOEXCEPT
Returns a reference to the first element.
Definition: poly_span.h:395
ETL_NODISCARD ETL_CONSTEXPR iterator begin() const ETL_NOEXCEPT
Returns an iterator to the beginning of the poly_span.
Definition: poly_span.h:419
etl::poly_span< element_type, COUNT !=etl::dynamic_extent ? COUNT :Extent - OFFSET > subspan() const
Obtains a poly_span that is a view from OFFSET over the next COUNT elements of this poly_span.
Definition: poly_span.h:558
ETL_NODISCARD ETL_CONSTEXPR reference back() const ETL_NOEXCEPT
Returns a reference to the last element.
Definition: poly_span.h:403
ETL_NODISCARD ETL_CONSTEXPR size_t size_bytes() const ETL_NOEXCEPT
Returns the size of the poly_span in bytes.
Definition: poly_span.h:475
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > last() const ETL_NOEXCEPT
Obtains a poly_span that is a view over the last COUNT elements of this poly_span.
Definition: poly_span.h:530
ETL_NODISCARD ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the poly_span.
Definition: poly_span.h:459
ETL_CONSTEXPR reference operator[](size_t i) const
Returns a reference to the indexed value.
Definition: poly_span.h:504
ETL_NODISCARD ETL_CONSTEXPR etl::poly_span< element_type, COUNT > first() const ETL_NOEXCEPT
Obtains a poly_span that is a view over the first COUNT elements of this poly_span.
Definition: poly_span.h:513
Definition: poly_span.h:67
Definition: iterator.h:228
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
conditional
Definition: type_traits_generator.h:1160
extent
Definition: type_traits_generator.h:1202
is_base_of
Definition: type_traits_generator.h:1252
is_same
Definition: type_traits_generator.h:1041
bitset_ext
Definition: absolute.h:38
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator-(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:672
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:684
ETL_CONSTEXPR TContainer::reverse_iterator rbegin(TContainer &container)
Definition: iterator.h:1053
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:696
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
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator+(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:659
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:657
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:672
Definition: iterator.h:63
Definition: poly_span.h:585