31#ifndef ETL_ARRAY_VIEW_INCLUDED
32#define ETL_ARRAY_VIEW_INCLUDED
45#if ETL_USING_STL && ETL_USING_CPP11
62 array_view_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
63 :
exception(reason_, file_name_, line_number_)
72 class array_view_bounds :
public array_view_exception
76 array_view_bounds(string_type file_name_, numeric_type line_number_)
77 : array_view_exception(ETL_ERROR_TEXT(
"array_view:bounds", ETL_ARRAY_VIEW_FILE_ID
"A"), file_name_, line_number_)
86 class array_view_uninitialised :
public array_view_exception
90 array_view_uninitialised(string_type file_name_, numeric_type line_number_)
91 : array_view_exception(ETL_ERROR_TEXT(
"array_view:uninitialised", ETL_ARRAY_VIEW_FILE_ID
"B"), file_name_, line_number_)
99 class array_view_empty :
public array_view_exception
103 array_view_empty(string_type file_name_, numeric_type line_number_)
104 : array_view_exception(ETL_ERROR_TEXT(
"array_view:empty", ETL_ARRAY_VIEW_FILE_ID
"C"), file_name_, line_number_)
112 template <
typename T>
117 typedef T value_type;
118 typedef size_t size_type;
119 typedef const T& const_reference;
120 typedef const T* const_pointer;
121 typedef const T* const_iterator;
122 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
124#if defined(ETL_ARRAY_VIEW_IS_MUTABLE)
126 typedef T& reference;
128 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
130 typedef const_pointer pointer;
131 typedef const_reference reference;
132 typedef const_pointer iterator;
133 typedef const_reverse_iterator reverse_iterator;
140 : mbegin(ETL_NULLPTR)
149 template <
typename U,
size_t Size,
150 typename =
typename etl::enable_if< etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>
::type>
153 , mend(a.data() + a.size())
160 template <
typename U,
size_t Size,
161 typename =
typename etl::enable_if< etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>
::type>
164 , mend(a.data() + a.size())
171 template <
typename U,
size_t Size>
174 typename etl::enable_if< etl::is_same<
typename etl::remove_cv<T>::type,
typename etl::remove_cv<U>::type>::value,
void>
::type* = 0) ETL_NOEXCEPT
183 template <
typename U,
size_t Size>
186 typename etl::enable_if< etl::is_same<
typename etl::remove_cv<T>::type,
typename etl::remove_cv<U>::type>::value,
void>
::type* = 0) ETL_NOEXCEPT
193#if ETL_USING_STL && ETL_USING_CPP11
197 template <
typename U,
size_t Size,
198 typename =
typename etl::enable_if< etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>
::type>
199 ETL_CONSTEXPR
array_view(std::array<U, Size>& a) ETL_NOEXCEPT
201 , mend(a.data() + a.size())
208 template <
typename U,
size_t Size,
209 typename =
typename etl::enable_if< etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<U>>::value,
void>
::type>
210 ETL_CONSTEXPR
array_view(
const std::array<U, Size>& a) ETL_NOEXCEPT
212 , mend(a.data() + a.size())
222 template <
typename TContainer,
223 typename =
typename etl::enable_if<
224 !etl::is_pointer<etl::remove_reference_t<TContainer>>::value && !etl::is_array<etl::remove_reference_t<TContainer>>::value
225 && etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<typename etl::remove_reference_t< TContainer>::value_type>>::value,
227 ETL_CONSTEXPR
array_view(TContainer&& a) ETL_NOEXCEPT
229 , mend(a.data() + a.size())
237 template <
typename TContainer>
239 typename etl::enable_if<
240 !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
241 && etl::is_same<
typename etl::remove_cv<T>::type,
243 void>
::type* = 0) ETL_NOEXCEPT
253 template <
typename TContainer>
255 typename etl::enable_if<
256 !etl::is_pointer<
typename etl::remove_reference<TContainer>::type>::value && !etl::is_array<TContainer>::value
257 && etl::is_same<
typename etl::remove_cv<T>::type,
259 void>
::type* = 0) ETL_NOEXCEPT
269 template <
typename TIterator>
270 ETL_CONSTEXPR
array_view(
const TIterator begin_,
const TIterator end_) ETL_NOEXCEPT
279 template <
typename TIterator,
typename TSize>
280 ETL_CONSTEXPR
array_view(
const TIterator begin_,
const TSize size_) ETL_NOEXCEPT
289 template <
size_t Array_Size>
290 ETL_CONSTEXPR
array_view(T (&begin_)[Array_Size]) ETL_NOEXCEPT
292 , mend(begin_ + Array_Size)
300 : mbegin(other.mbegin)
360 const_pointer
data() const ETL_NOEXCEPT
376 const_iterator
begin() const ETL_NOEXCEPT
384 const_iterator
cbegin() const ETL_NOEXCEPT
392 iterator
end() ETL_NOEXCEPT
400 const_iterator
end() const ETL_NOEXCEPT
416 reverse_iterator
rbegin() ETL_NOEXCEPT
418 return reverse_iterator(mend);
424 const_reverse_iterator
rbegin() const ETL_NOEXCEPT
426 return const_reverse_iterator(mend);
432 const_reverse_iterator
crbegin() const ETL_NOEXCEPT
434 return const_reverse_iterator(mend);
440 reverse_iterator
rend() ETL_NOEXCEPT
442 return reverse_iterator(mbegin);
448 const_reverse_iterator
rend() const ETL_NOEXCEPT
450 return const_reverse_iterator(mbegin);
456 const_reverse_iterator
crend() const ETL_NOEXCEPT
458 return const_reverse_iterator(mbegin);
464 ETL_CONSTEXPR
bool empty() const ETL_NOEXCEPT
466 return (mbegin == mend);
472 ETL_CONSTEXPR
size_t size() const ETL_NOEXCEPT
474 return static_cast<size_t>(mend - mbegin);
490 mbegin = other.mbegin;
498 template <
typename TIterator>
499 void assign(
const TIterator begin_,
const TIterator end_)
508 template <
typename TIterator,
typename TSize>
509 void assign(
const TIterator begin_,
const TSize size_)
515#if defined(ETL_ARRAY_VIEW_IS_MUTABLE)
521 reference operator[](
const size_t i) ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_INDEX_OPERATOR)
534 const_reference
operator[](
const size_t i)
const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS || ETL_NOT_CHECKING_INDEX_OPERATOR)
541#if defined(ETL_ARRAY_VIEW_IS_MUTABLE)
556 const_reference
at(
const size_t i)
const
568 using ETL_OR_STD::swap;
570 swap(mbegin, other.mbegin);
571 swap(mend, other.mend);
617 return !(lhs == rhs);
625 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
662 template <
typename TArray>
663 array_view(TArray& a) -> array_view<typename TArray::value_type>;
665 template <
typename TIterator>
666 array_view(
const TIterator begin_,
const TIterator end_) -> array_view<etl::remove_pointer_t<TIterator>>;
668 template <
typename TIterator,
typename TSize>
669 array_view(
const TIterator begin_,
const TSize size_) -> array_view<etl::remove_pointer_t<TIterator>>;
675#if ETL_USING_8BIT_TYPES
676 template <
typename T>
677 struct hash<
etl::array_view<T> >
681 return etl::private_hash::generic_hash<size_t>(
reinterpret_cast<const uint8_t*
>(view.
data()),
682 reinterpret_cast<const uint8_t*
>(view.
data() + view.
size()));
void swap(etl::array_view< T > &lhs, etl::array_view< T > &rhs) ETL_NOEXCEPT
Swaps the values.
Definition array_view.h:692
The exception thrown when the view is empty.
Definition array_view.h:100
Array view.
Definition array_view.h:114
ETL_CONSTEXPR array_view(etl::array< U, Size > &a, typename etl::enable_if< etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< U >::type >::value, void >::type *=0) ETL_NOEXCEPT
Construct from etl::array.
Definition array_view.h:172
friend bool operator!=(const array_view< T > &lhs, const array_view< T > &rhs)
Inequality for array views.
Definition array_view.h:615
ETL_CONSTEXPR array_view(const array_view &other) ETL_NOEXCEPT
Copy constructor.
Definition array_view.h:299
ETL_CONSTEXPR array_view() ETL_NOEXCEPT
Default constructor.
Definition array_view.h:139
reference front()
Definition array_view.h:310
const_reference back() const
Definition array_view.h:343
iterator end() ETL_NOEXCEPT
Returns an iterator to the end of the array.
Definition array_view.h:392
const_iterator begin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the array.
Definition array_view.h:376
ETL_CONSTEXPR size_t size() const ETL_NOEXCEPT
Returns the size of the array.
Definition array_view.h:472
friend bool operator<=(const array_view< T > &lhs, const array_view< T > &rhs)
Less-than-equal for array views.
Definition array_view.h:639
ETL_CONSTEXPR size_t max_size() const ETL_NOEXCEPT
Returns the maximum possible size of the array.
Definition array_view.h:480
void swap(array_view &other) ETL_NOEXCEPT
Swaps with another array_view.
Definition array_view.h:566
const_iterator cbegin() const ETL_NOEXCEPT
Returns a const iterator to the beginning of the array.
Definition array_view.h:384
const_iterator end() const ETL_NOEXCEPT
Returns a const iterator to the end of the array.
Definition array_view.h:400
ETL_CONSTEXPR bool empty() const ETL_NOEXCEPT
Returns true if the array size is zero.
Definition array_view.h:464
const_reference front() const
Definition array_view.h:321
ETL_CONSTEXPR array_view(const etl::array< U, Size > &a, typename etl::enable_if< etl::is_same< typename etl::remove_cv< T >::type, typename etl::remove_cv< U >::type >::value, void >::type *=0) ETL_NOEXCEPT
Construct from etl::array.
Definition array_view.h:184
const_reference at(const size_t i) const
Returns a const reference to the indexed value.
Definition array_view.h:556
iterator begin() ETL_NOEXCEPT
Returns an iterator to the beginning of the array.
Definition array_view.h:368
array_view & operator=(const array_view &other) ETL_NOEXCEPT
Assign from a view.
Definition array_view.h:488
void fill(const T &value)
Fills the array.
Definition array_view.h:599
ETL_CONSTEXPR array_view(const 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 array_view.h:254
friend bool operator>(const array_view< T > &lhs, const array_view< T > &rhs)
Greater-than for array views.
Definition array_view.h:631
friend bool operator==(const array_view< T > &lhs, const array_view< T > &rhs)
Equality for array views.
Definition array_view.h:607
ETL_CONSTEXPR array_view(const TIterator begin_, const TIterator end_) ETL_NOEXCEPT
Construct from iterators.
Definition array_view.h:270
const_reverse_iterator rend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the array.
Definition array_view.h:448
void remove_prefix(const size_type n) ETL_NOEXCEPT
Shrinks the view by moving its start forward.
Definition array_view.h:577
ETL_CONSTEXPR array_view(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 array_view.h:238
pointer data() ETL_NOEXCEPT
Returns a pointer to the first element of the internal storage.
Definition array_view.h:352
friend bool operator>=(const array_view< T > &lhs, const array_view< T > &rhs)
Greater-than-equal for array views.
Definition array_view.h:647
void remove_suffix(const size_type n) ETL_NOEXCEPT
Shrinks the view by moving its end backward.
Definition array_view.h:588
ETL_CONSTEXPR array_view(const TIterator begin_, const TSize size_) ETL_NOEXCEPT
Construct from iterator and size.
Definition array_view.h:280
void assign(const TIterator begin_, const TIterator end_)
Assign from iterators.
Definition array_view.h:499
void assign(const TIterator begin_, const TSize size_)
Assign from iterator and size.
Definition array_view.h:509
const_reverse_iterator crend() const ETL_NOEXCEPT
Returns a const reverse iterator to the end of the array.
Definition array_view.h:456
friend bool operator<(const array_view< T > &lhs, const array_view< T > &rhs)
Less-than for array views.
Definition array_view.h:623
ETL_CONSTEXPR array_view(T(&begin_)[Array_Size]) ETL_NOEXCEPT
Construct from C array.
Definition array_view.h:290
reverse_iterator rend() ETL_NOEXCEPT
Returns a reverse iterator to the end of the array.
Definition array_view.h:440
const_reverse_iterator rbegin() const ETL_NOEXCEPT
Returns a const reverse iterator to the reverse beginning of the array.
Definition array_view.h:424
const_pointer data() const ETL_NOEXCEPT
Returns a const pointer to the first element of the internal storage.
Definition array_view.h:360
const_reference operator[](const size_t i) const ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS||ETL_NOT_CHECKING_INDEX_OPERATOR)
Definition array_view.h:534
reference back()
Definition array_view.h:332
const_reverse_iterator crbegin() const ETL_NOEXCEPT
Returns a const reverse iterator to the reverse beginning of the array.
Definition array_view.h:432
#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
Definition array_view.h:73
Definition array_view.h:87
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR T * to_address(T *p) ETL_NOEXCEPT
Definition memory.h:62
ETL_CONSTEXPR TContainer::const_iterator cend(const TContainer &container)
Definition iterator.h:1017
remove_cv
Definition type_traits.h:325
remove_reference
Definition type_traits.h:122