A C++ template library for embedded applications
MIT licensed
Join the ETL community
Designed and
maintained by
John Wellbelove
Like the ETL? Become a patron!
or
array_view

This class implements a view in to a range of a C array, etl::array, std::array, etl::vector and std::vector. It will support
construction from any class that supports data() and size() member functions as well as plain C arrays.

STL equivalent: None at the moment. Similar to the proposed addition to C++17 but restricts the range to a single
dimension.

If ETL_ARRAY_VIEW_IS_MUTABLE is defined, then the contents of the view are mutable.
The view is non-mutable by default, which is the opposite to the behaviour in 17.5.0 or earlier.

etl::array_view<typename T>
____________________________________________________________________________________________________
Template deduction guides
C++17 and above


template <typename TArray>
etl::array_view(TArray& a)
  -> etl::array_view<typename TArray::value_type>;

template <typename TIterator>
etl::array_view(const TIterator begin_, const TIterator end_)
  -> etl::array_view<etl::remove_pointer_t<TIterator>>;

template <typename TIterator, typename TSize>
etl::array_view(const TIterator begin_, const TSize size_)
  -> etl::array_view<etl::remove_pointer_t<TIterator>>;

Examples

etl::array data{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
     
etl::array_view view1{ data };
etl::array_view view2{ data.begin(), data.end() };
etl::array_view view3{ data.begin(), data.size() };
etl::array_view view4{ view1 };
____________________________________________________________________________________________________
Member types

value_type              T
size_type               std::size_t
difference_type         std::ptrdiff_t
reference               value_type&
const_reference         const value_type&
pointer                 value_type*
const_pointer           const value_type*
iterator                Random access iterator
const_iterator          Constant random access iterator
reverse_iterator        std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>
____________________________________________________________________________________________________
Constructors

ETL_CONSTEXPR array_view()
Default constructor.
____________________________________________________________________________________________________
template <typename TArray>
ETL_CONSTEXPR explicit array_view(TArray& a)
Construct from array or vector like class.
____________________________________________________________________________________________________
template <typename TIterator>
ETL_CONSTEXPR array_view(TIterator begin_, TIterator end_)

Construct from an iterator or pointer range.
____________________________________________________________________________________________________
template <typename TIterator, typename TSize>
ETL_CONSTEXPR array_view(TIterator begin_, TSize size_)
Construct from a start and size
___________________________________________________________________________________________________
template<const size_t ARRAY_SIZE>
ETL_CONSTEXPR explicit array_view(T(&begin_)[ARRAY_SIZE])
Construct from a compile time sized C array.
____________________________________________________________________________________________________
ETL_CONSTEXPR array_view(const array_view& other)
Copy constructor.
____________________________________________________________________________________________________
Modifiers

template <typename TIterator>
void assign(TIterator begin_, TIterator end_)
Assigns begin and end of the supplied range.
Does not copy the elements in the range.
____________________________________________________________________________________________________
template <typename TIterator, typename TSize>
void assign(TIterator begin_, TSize size_)
Assign from a start iterator and length.
Does not copy the elements in the range.
____________________________________________________________________________________________________
void remove_prefix(size_type n)
Shrinks the view from the front.
A value of n larger than the array will result in undefined behaviour.
____________________________________________________________________________________________________
void remove_suffix(size_type n)
Shrinks the view from the back.
A value of n larger than the array will result in undefined behaviour.
____________________________________________________________________________________________________
Element access

Mutable access is only possible by defining the macro ETL_ARRAY_VIEW_IS_MUTABLE.
In this case, reference, pointer, iterator and reverse_iterator are defined as their const counterparts.

reference at(size_t i)
const_reference at(size_t i) const
Returns a reference or const reference to the indexed element.
Emits an etl::array_view_uninitialised if the view is not initialised.
Emits an etl::array_view_bounds if the index is not in range.
If asserts or exceptions are not enabled then undefined behaviour occurs.
____________________________________________________________________________________________________
reference operator[](size_t i)
const_reference operator[](size_t i) const
Returns a reference or const reference to the indexed element.
Index out of range results in undefined behaviour.
____________________________________________________________________________________________________
reference front()
const_reference front() const
Returns a reference or const reference to the first element.
____________________________________________________________________________________________________
reference back()
const_reference back() const
Returns a reference or const reference to the last element.
____________________________________________________________________________________________________
pointer data()
const_pointer data() const
Returns a pointer or const pointer to the first element.
____________________________________________________________________________________________________
Iterators

iterator begin()
const_iterator begin() const
const_iterator cbegin() const
Returns an iterator to the beginning of the array view.
____________________________________________________________________________________________________
iterator end()
const_iterator end() const
const_iterator cend() const
Returns an iterator to the end of the array view.
____________________________________________________________________________________________________
iterator rbegin()
const_iterator rbegin() const
const_iterator crbegin() const
Returns a reverse iterator to the beginning of the array view.
____________________________________________________________________________________________________
iterator rend()
const_iterator rend() const
const_iterator crend() const
Returns a reverse iterator to the end of the array view.
____________________________________________________________________________________________________
Capacity

bool empty() const
Returns true if the size of the array view is zero, otherwise false.
____________________________________________________________________________________________________
size_t size() const
Returns the size of the view.
____________________________________________________________________________________________________
size_t max_size() const
Returns the maximum possible size of the view.
____________________________________________________________________________________________________
Non-member functions
Lexicographically comparisons

== true if the contents of the array views are equal, otherwise false.
!= true if the contents of the array views are not equal, otherwise false.
true if the contents of the lhs are lexicographically less than the contents of the rhs,  otherwise false.
<= true if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise false.
true if the contents of the lhs are lexicographically greater than the contents of the rhs,  otherwise false.
>= true if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise false

Hash
There are specialisations of etl::hash for array_view

____________________________________________________________________________________________________
Example

etl::array<int, 10> data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

typedef etl::array_view<int> View;

View view(data.begin() + 2, data.end() - 2);

void Print(const View& view)
{
  for (size_t i = 0; i < view.size(); ++i)
  {
    std::cout << view[i] << " ";
  }
}

Print(view); // Prints "3 4 5 6 7 8"

size_t hashvalue = etl::hash<View>()(view);
array_view.h