MIP_SDK  v3.0.0-533-g58dc0c0
MicroStrain Communications Library for embedded systems
array_view.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <type_traits>
4 #include <stdint.h>
5 #include <stddef.h>
6 #include <assert.h>
7 
8 namespace microstrain
9 {
10 
11 
12 static constexpr size_t DYNAMIC_EXTENT = SIZE_MAX;
13 
43 template<class T, size_t Extent=DYNAMIC_EXTENT>
44 struct ArrayView
45 {
46  static constexpr size_t extent = Extent;
47 
48  using element_type = T;
49  using value_type = typename std::remove_cv<T>::type;
50  using difference_type = ptrdiff_t;
51  using pointer = T*;
52  using reference = T&;
53  using iterator = T*;
54  using const_pointer = const T*;
55  using const_reference = const T&;
56  using const_iterator = const T*;
57 
58  constexpr ArrayView(pointer ptr, size_t count) : m_ptr(ptr) { assert(count==extent); }
59 
60  constexpr pointer begin() const noexcept { return m_ptr; }
61  constexpr pointer end() const noexcept { return m_ptr+extent; }
62 
63  constexpr element_type front() const noexcept { return *m_ptr; }
64  constexpr element_type back() const noexcept { return *m_ptr[extent-1]; }
65 
66  constexpr reference operator[](size_t idx) noexcept { return m_ptr[idx]; }
67  constexpr const_reference operator[](size_t idx) const noexcept { return m_ptr[idx]; }
68 
69  constexpr pointer data() const noexcept { return m_ptr; }
70 
71  [[nodiscard]] constexpr size_t size() const noexcept { return extent; }
72  [[nodiscard]] constexpr bool empty() const noexcept { return extent == 0; }
73 
74  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> subspan(size_t index, size_t length) const { return {m_ptr+index, length}; }
75  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> subspan(size_t index) const { return {m_ptr+index, extent-index}; }
76  template<size_t Offset, size_t Count = DYNAMIC_EXTENT>
77  [[nodiscard]] constexpr ArrayView<T, Count == DYNAMIC_EXTENT ? DYNAMIC_EXTENT : Extent-Count> subspan() const { return {m_ptr+Offset}; }
78 
79  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> first(size_t count) const { return {m_ptr, count};}
80  template<size_t Count>
81  [[nodiscard]] constexpr ArrayView<T, Count> first() const { static_assert(Count<=Extent, "Count out of range"); return {m_ptr}; }
82 
83  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> last(size_t count) const { return {m_ptr+(size()-count), count};}
84  template<size_t Count>
85  [[nodiscard]] constexpr ArrayView<T, Count> last() const { static_assert(Count<=Extent, "Count out of range"); return {m_ptr+(Extent-Count)}; }
86 
87 private:
88  pointer m_ptr = nullptr;
89 };
90 
91 
92 template<class T>
93 struct ArrayView<T, DYNAMIC_EXTENT>
94 {
95  using element_type = T;
96  using value_type = typename std::remove_cv<T>::type;
97  using difference_type = ptrdiff_t;
98  using pointer = T*;
99  using reference = T&;
100  using iterator = T*;
101  using const_pointer = const T*;
102  using const_reference = const T&;
103  using const_iterator = const T*;
104 
105  constexpr ArrayView() = default;
106  constexpr ArrayView(pointer ptr, size_t cnt) : m_ptr(ptr), m_cnt(cnt) {}
107  template<size_t N>
108  constexpr ArrayView(T (&arr)[N]) : m_ptr(arr), m_cnt(N) {}
109 
110  constexpr pointer begin() const noexcept { return m_ptr; }
111  constexpr pointer end() const noexcept { return m_ptr+m_cnt; }
112 
113  constexpr element_type front() const noexcept { return *m_ptr; }
114  constexpr element_type back() const noexcept { return *m_ptr[m_cnt-1]; }
115 
116  constexpr reference operator[](size_t idx) noexcept { return m_ptr[idx]; }
117  constexpr const_reference operator[](size_t idx) const noexcept { return m_ptr[idx]; }
118 
119  constexpr pointer data() const noexcept { return m_ptr; }
120 
121  [[nodiscard]] constexpr size_t size() const noexcept { return m_cnt; }
122  [[nodiscard]] constexpr bool empty() const noexcept { return m_cnt == 0; }
123 
124  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> subspan(size_t index, size_t length) const { return {m_ptr+index, length}; }
125  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> subspan(size_t index) const { return {m_ptr+index, m_cnt-index}; }
126  template<size_t Offset, size_t Count = DYNAMIC_EXTENT>
127  [[nodiscard]] constexpr ArrayView<T, Count> subspan() const { return {m_ptr+Offset, Count}; }
128 
129  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> first(size_t count) const { return {m_ptr, count};}
130  template<size_t Count>
131  [[nodiscard]] constexpr ArrayView<T, Count> first() const { return {m_ptr}; }
132 
133  [[nodiscard]] constexpr ArrayView<T, DYNAMIC_EXTENT> last(size_t count) const { return {m_ptr+(size()-count), count};}
134  template<size_t Count>
135  [[nodiscard]] constexpr ArrayView<T, Count> last() const { return {m_ptr+(size()-Count)}; }
136 
137 private:
138  pointer m_ptr = nullptr;
139  size_t m_cnt = 0;
140 };
141 
142 
143 template<class T>
145 
148 
151 
152 
153 } // namespace microstrain
microstrain::ArrayView::last
constexpr ArrayView< T, Count > last() const
Definition: array_view.hpp:85
microstrain::ArrayView< T, DYNAMIC_EXTENT >::pointer
T * pointer
Definition: array_view.hpp:98
microstrain::ArrayView< T, DYNAMIC_EXTENT >::const_iterator
const T * const_iterator
Definition: array_view.hpp:103
microstrain::ArrayView::extent
static constexpr size_t extent
Definition: array_view.hpp:46
microstrain::ArrayView::const_reference
const T & const_reference
Definition: array_view.hpp:55
microstrain::ArrayView< T, DYNAMIC_EXTENT >::data
constexpr pointer data() const noexcept
Definition: array_view.hpp:119
microstrain::ArrayView::operator[]
constexpr reference operator[](size_t idx) noexcept
Definition: array_view.hpp:66
microstrain::ArrayView< T, DYNAMIC_EXTENT >::ArrayView
constexpr ArrayView(T(&arr)[N])
Definition: array_view.hpp:108
microstrain::ArrayView::value_type
typename std::remove_cv< T >::type value_type
Definition: array_view.hpp:49
microstrain::ArrayView::reference
T & reference
Definition: array_view.hpp:52
microstrain::ArrayView< T, DYNAMIC_EXTENT >::subspan
constexpr ArrayView< T, DYNAMIC_EXTENT > subspan(size_t index, size_t length) const
Definition: array_view.hpp:124
microstrain::ArrayView::begin
constexpr pointer begin() const noexcept
Definition: array_view.hpp:60
microstrain::ArrayView::last
constexpr ArrayView< T, DYNAMIC_EXTENT > last(size_t count) const
Definition: array_view.hpp:83
microstrain::ArrayView< T, DYNAMIC_EXTENT >::first
constexpr ArrayView< T, DYNAMIC_EXTENT > first(size_t count) const
Definition: array_view.hpp:129
microstrain::ArrayView< T, DYNAMIC_EXTENT >::subspan
constexpr ArrayView< T, Count > subspan() const
Definition: array_view.hpp:127
microstrain::ArrayView< T, DYNAMIC_EXTENT >::value_type
typename std::remove_cv< T >::type value_type
Definition: array_view.hpp:96
microstrain::ArrayView< T, DYNAMIC_EXTENT >::operator[]
constexpr const_reference operator[](size_t idx) const noexcept
Definition: array_view.hpp:117
microstrain::ArrayView::subspan
constexpr ArrayView< T, DYNAMIC_EXTENT > subspan(size_t index) const
Definition: array_view.hpp:75
microstrain::ArrayView< T, DYNAMIC_EXTENT >::ArrayView
constexpr ArrayView(pointer ptr, size_t cnt)
Definition: array_view.hpp:106
microstrain::ArrayView< T, DYNAMIC_EXTENT >
Definition: array_view.hpp:93
microstrain::ArrayView::first
constexpr ArrayView< T, Count > first() const
Definition: array_view.hpp:81
microstrain::ArrayView< T, DYNAMIC_EXTENT >::element_type
T element_type
Definition: array_view.hpp:95
microstrain::ArrayView< T, DYNAMIC_EXTENT >::first
constexpr ArrayView< T, Count > first() const
Definition: array_view.hpp:131
microstrain::ArrayView< T, DYNAMIC_EXTENT >::last
constexpr ArrayView< T, Count > last() const
Definition: array_view.hpp:135
microstrain::ArrayView< T, DYNAMIC_EXTENT >::front
constexpr element_type front() const noexcept
Definition: array_view.hpp:113
microstrain::ArrayView::const_pointer
const T * const_pointer
Definition: array_view.hpp:54
microstrain::ArrayView::end
constexpr pointer end() const noexcept
Definition: array_view.hpp:61
microstrain::ArrayView::front
constexpr element_type front() const noexcept
Definition: array_view.hpp:63
microstrain::ArrayView< T, DYNAMIC_EXTENT >::last
constexpr ArrayView< T, DYNAMIC_EXTENT > last(size_t count) const
Definition: array_view.hpp:133
microstrain::ArrayView::subspan
constexpr ArrayView< T, DYNAMIC_EXTENT > subspan(size_t index, size_t length) const
Definition: array_view.hpp:74
microstrain::ArrayView::subspan
constexpr ArrayView< T, Count==DYNAMIC_EXTENT ? DYNAMIC_EXTENT :Extent-Count > subspan() const
Definition: array_view.hpp:77
microstrain::ArrayView< T, DYNAMIC_EXTENT >::end
constexpr pointer end() const noexcept
Definition: array_view.hpp:111
microstrain::ArrayView::operator[]
constexpr const_reference operator[](size_t idx) const noexcept
Definition: array_view.hpp:67
microstrain::ArrayView::pointer
T * pointer
Definition: array_view.hpp:51
microstrain::ArrayView::data
constexpr pointer data() const noexcept
Definition: array_view.hpp:69
microstrain::ArrayView::back
constexpr element_type back() const noexcept
Definition: array_view.hpp:64
microstrain::ArrayView< T, DYNAMIC_EXTENT >::difference_type
ptrdiff_t difference_type
Definition: array_view.hpp:97
microstrain::ArrayView< T, DYNAMIC_EXTENT >::const_pointer
const T * const_pointer
Definition: array_view.hpp:101
microstrain::ArrayView< T, DYNAMIC_EXTENT >::operator[]
constexpr reference operator[](size_t idx) noexcept
Definition: array_view.hpp:116
microstrain::ArrayView< T, DYNAMIC_EXTENT >::subspan
constexpr ArrayView< T, DYNAMIC_EXTENT > subspan(size_t index) const
Definition: array_view.hpp:125
microstrain::ArrayView
Represents a view over a contiguous array of objects, similar to std::span, and is implemented as a p...
Definition: array_view.hpp:44
microstrain::ArrayView::first
constexpr ArrayView< T, DYNAMIC_EXTENT > first(size_t count) const
Definition: array_view.hpp:79
microstrain::ArrayView< T, DYNAMIC_EXTENT >::reference
T & reference
Definition: array_view.hpp:99
microstrain::ArrayView< T, DYNAMIC_EXTENT >::back
constexpr element_type back() const noexcept
Definition: array_view.hpp:114
microstrain::ArrayView::const_iterator
const T * const_iterator
Definition: array_view.hpp:56
microstrain::ArrayView::element_type
T element_type
Definition: array_view.hpp:48
microstrain::ArrayView< T, DYNAMIC_EXTENT >::empty
constexpr bool empty() const noexcept
Definition: array_view.hpp:122
microstrain::ArrayView< T, DYNAMIC_EXTENT >::iterator
T * iterator
Definition: array_view.hpp:100
microstrain::ArrayView< T, DYNAMIC_EXTENT >::const_reference
const T & const_reference
Definition: array_view.hpp:102
microstrain::ArrayView::size
constexpr size_t size() const noexcept
Definition: array_view.hpp:71
microstrain::ArrayView::difference_type
ptrdiff_t difference_type
Definition: array_view.hpp:50
microstrain::ArrayView< T, DYNAMIC_EXTENT >::begin
constexpr pointer begin() const noexcept
Definition: array_view.hpp:110
microstrain::ArrayView::empty
constexpr bool empty() const noexcept
Definition: array_view.hpp:72
microstrain::ArrayView::iterator
T * iterator
Definition: array_view.hpp:53
microstrain
Definition: embedded_time.h:8
microstrain::ArrayView< T, DYNAMIC_EXTENT >::size
constexpr size_t size() const noexcept
Definition: array_view.hpp:121
microstrain::ArrayView::ArrayView
constexpr ArrayView(pointer ptr, size_t count)
Definition: array_view.hpp:58