A C++ template library for embedded applications
Designed and maintained by
Aster Consulting Ltd

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. There are mutating
and non-mutating versions. The non-mutating version has the same API as the mutating version except for the non-const
member functions.

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

etl::array_view<typename T>
etl::const_array_view<typename T>

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

array_view()
Default constructor.

template <typename TArray>
explicit array_view(TArray& a)
Construct from array or vector like class.

template <typename TIterator>
array_view(TIterator begin_, TIterator end_)
Construct from an iterator or pointer range.

template <typename TIterator, typename TSize>
array_view(TIterator begin_, TSize size_)
Construct from a start and size.
   
template<const size_t ARRAY_SIZE>
explicit array_view(T(&begin_)[ARRAY_SIZE])
Construct from a compile time sized C array.

array_view(const array_view& other)
Copy constructor.

Modifiers

template <typename TIterator>
void assign(TIterator begin_, TIterator end_)
Assign from an iterator range.

template <typename TIterator, typename TSize>
void assign(TIterator begin_, TSize size_)
Assign from a start iterator and length.

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

T& at(size_t i)
const T& 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.

T& operator[](size_t i)
const T& operator[](size_t i) const
Returns a reference or const reference to the indexed element.
Index out of range results in undefined behaviour.

T& front()
const T& front() const
Returns a reference or const reference to the first element.

T& back()
const T& back() const
Returns a reference or const reference to the last 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 for etl::hash for array_view and const_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