MIP_SDK  v3.0.0-502-gc890c1c
MicroStrain Communications Library for embedded systems
span.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #ifdef MICROSTRAIN_USE_STD_SPAN
4 
5 #include <span>
6 
7 namespace microstrain
8 {
9 
10  static inline constexpr size_t DYNAMIC_EXTENT = std::dynamic_extent;
11 
12  template<class T, size_t Size=DYNAMIC_EXTENT>
13  using Span = std::span<T, Size>;
14 
15 } // namespace microstrain
16 
17 #else // MICROSTRAIN_USE_STD_SPAN
18 
19 #include <type_traits>
20 #include <stdint.h>
21 #include <stddef.h>
22 #include <assert.h>
23 
24 namespace microstrain
25 {
26 
27 
28 static constexpr size_t DYNAMIC_EXTENT = SIZE_MAX;
29 
41 template<class T, size_t Extent=DYNAMIC_EXTENT>
42 struct Span
43 {
44  static constexpr size_t extent = Extent;
45 
46  using element_type = T;
47  using value_type = typename std::remove_cv<T>::type;
48  using difference_type = ptrdiff_t;
49  using pointer = T*;
50  using reference = T&;
51  using iterator = T*;
52  using const_pointer = const T*;
53  using const_reference = const T&;
54  using const_iterator = const T*;
55 
56  constexpr Span(pointer ptr, size_t count) : m_ptr(ptr) { assert(count==extent); }
57 
58  constexpr pointer begin() const noexcept { return m_ptr; }
59  constexpr pointer end() const noexcept { return m_ptr+extent; }
60 
61  constexpr element_type front() const noexcept { return *m_ptr; }
62  constexpr element_type back() const noexcept { return *m_ptr[extent-1]; }
63 
64  constexpr reference operator[](size_t idx) noexcept { return m_ptr[idx]; }
65  constexpr const_reference operator[](size_t idx) const noexcept { return m_ptr[idx]; }
66 
67  constexpr pointer data() const noexcept { return m_ptr; }
68 
69  [[nodiscard]] constexpr size_t size() const noexcept { return extent; }
70  [[nodiscard]] constexpr bool empty() const noexcept { return extent == 0; }
71 
72  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> subspan(size_t index, size_t length) const { return {m_ptr+index, length}; }
73  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> subspan(size_t index) const { return {m_ptr+index, extent-index}; }
74  template<size_t Offset, size_t Count = DYNAMIC_EXTENT>
75  [[nodiscard]] constexpr Span<T, Count == DYNAMIC_EXTENT ? DYNAMIC_EXTENT : Extent-Count> subspan() const { return {m_ptr+Offset}; }
76 
77  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> first(size_t count) const { return {m_ptr, count};}
78  template<size_t Count>
79  [[nodiscard]] constexpr Span<T, Count> first() const { static_assert(Count<=Extent, "Count out of range"); return {m_ptr}; }
80 
81  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> last(size_t count) const { return {m_ptr+(size()-count), count};}
82  template<size_t Count>
83  [[nodiscard]] constexpr Span<T, Count> last() const { static_assert(Count<=Extent, "Count out of range"); return {m_ptr+(Extent-Count)}; }
84 
85 private:
86  pointer m_ptr = nullptr;
87 };
88 
89 
90 template<class T>
91 struct Span<T, DYNAMIC_EXTENT>
92 {
93  using element_type = T;
94  using value_type = typename std::remove_cv<T>::type;
95  using difference_type = ptrdiff_t;
96  using pointer = T*;
97  using reference = T&;
98  using iterator = T*;
99  using const_pointer = const T*;
100  using const_reference = const T&;
101  using const_iterator = const T*;
102 
103  constexpr Span() = default;
104  constexpr Span(pointer ptr, size_t cnt) : m_ptr(ptr), m_cnt(cnt) {}
105  template<size_t N>
106  constexpr Span(T (&arr)[N]) : m_ptr(arr), m_cnt(N) {}
107 
108  constexpr pointer begin() const noexcept { return m_ptr; }
109  constexpr pointer end() const noexcept { return m_ptr+m_cnt; }
110 
111  constexpr element_type front() const noexcept { return *m_ptr; }
112  constexpr element_type back() const noexcept { return *m_ptr[m_cnt-1]; }
113 
114  constexpr reference operator[](size_t idx) noexcept { return m_ptr[idx]; }
115  constexpr const_reference operator[](size_t idx) const noexcept { return m_ptr[idx]; }
116 
117  constexpr pointer data() const noexcept { return m_ptr; }
118 
119  [[nodiscard]] constexpr size_t size() const noexcept { return m_cnt; }
120  [[nodiscard]] constexpr bool empty() const noexcept { return m_cnt == 0; }
121 
122  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> subspan(size_t index, size_t length) const { return {m_ptr+index, length}; }
123  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> subspan(size_t index) const { return {m_ptr+index, m_cnt-index}; }
124  template<size_t Offset, size_t Count = DYNAMIC_EXTENT>
125  [[nodiscard]] constexpr Span<T, Count> subspan() const { return {m_ptr+Offset, Count}; }
126 
127  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> first(size_t count) const { return {m_ptr, count};}
128  template<size_t Count>
129  [[nodiscard]] constexpr Span<T, Count> first() const { return {m_ptr}; }
130 
131  [[nodiscard]] constexpr Span<T, DYNAMIC_EXTENT> last(size_t count) const { return {m_ptr+(size()-count), count};}
132  template<size_t Count>
133  [[nodiscard]] constexpr Span<T, Count> last() const { return {m_ptr+(size()-Count)}; }
134 
135 private:
136  pointer m_ptr = nullptr;
137  size_t m_cnt = 0;
138 };
139 
140 
141 } // namespace microstrain
142 
143 #endif // MICROSTRAIN_USE_STD_SPAN
microstrain::Span< T, DYNAMIC_EXTENT >
Definition: span.hpp:91
microstrain::Span::data
constexpr pointer data() const noexcept
Definition: span.hpp:67
microstrain::Span::Span
constexpr Span(pointer ptr, size_t count)
Definition: span.hpp:56
microstrain::Span::subspan
constexpr Span< T, DYNAMIC_EXTENT > subspan(size_t index) const
Definition: span.hpp:73
microstrain::Span::pointer
T * pointer
Definition: span.hpp:49
microstrain::Span< T, DYNAMIC_EXTENT >::element_type
T element_type
Definition: span.hpp:93
microstrain::Span< T, DYNAMIC_EXTENT >::last
constexpr Span< T, DYNAMIC_EXTENT > last(size_t count) const
Definition: span.hpp:131
microstrain::Span::first
constexpr Span< T, DYNAMIC_EXTENT > first(size_t count) const
Definition: span.hpp:77
microstrain::Span< T, DYNAMIC_EXTENT >::subspan
constexpr Span< T, DYNAMIC_EXTENT > subspan(size_t index, size_t length) const
Definition: span.hpp:122
microstrain::Span::front
constexpr element_type front() const noexcept
Definition: span.hpp:61
microstrain::Span< T, DYNAMIC_EXTENT >::last
constexpr Span< T, Count > last() const
Definition: span.hpp:133
microstrain::Span< T, DYNAMIC_EXTENT >::iterator
T * iterator
Definition: span.hpp:98
microstrain::Span::subspan
constexpr Span< T, DYNAMIC_EXTENT > subspan(size_t index, size_t length) const
Definition: span.hpp:72
microstrain::Span< T, DYNAMIC_EXTENT >::front
constexpr element_type front() const noexcept
Definition: span.hpp:111
microstrain::Span::size
constexpr size_t size() const noexcept
Definition: span.hpp:69
microstrain::Span< T, DYNAMIC_EXTENT >::const_pointer
const T * const_pointer
Definition: span.hpp:99
microstrain::Span::operator[]
constexpr const_reference operator[](size_t idx) const noexcept
Definition: span.hpp:65
microstrain::Span< T, DYNAMIC_EXTENT >::end
constexpr pointer end() const noexcept
Definition: span.hpp:109
microstrain::Span< T, DYNAMIC_EXTENT >::difference_type
ptrdiff_t difference_type
Definition: span.hpp:95
microstrain::Span
Implementation of std::span from C++20.
Definition: span.hpp:42
microstrain::Span< T, DYNAMIC_EXTENT >::empty
constexpr bool empty() const noexcept
Definition: span.hpp:120
microstrain::Span< T, DYNAMIC_EXTENT >::pointer
T * pointer
Definition: span.hpp:96
microstrain::Span< T, DYNAMIC_EXTENT >::value_type
typename std::remove_cv< T >::type value_type
Definition: span.hpp:94
microstrain::Span::first
constexpr Span< T, Count > first() const
Definition: span.hpp:79
mip::metadata::ParameterInfo
Definition: mip_structures.hpp:158
microstrain::Span::subspan
constexpr Span< T, Count==DYNAMIC_EXTENT ? DYNAMIC_EXTENT :Extent-Count > subspan() const
Definition: span.hpp:75
microstrain::Span< T, DYNAMIC_EXTENT >::const_reference
const T & const_reference
Definition: span.hpp:100
microstrain::Span< T, DYNAMIC_EXTENT >::data
constexpr pointer data() const noexcept
Definition: span.hpp:117
microstrain::Span::begin
constexpr pointer begin() const noexcept
Definition: span.hpp:58
microstrain::Span< T, DYNAMIC_EXTENT >::const_iterator
const T * const_iterator
Definition: span.hpp:101
microstrain::Span::last
constexpr Span< T, Count > last() const
Definition: span.hpp:83
microstrain::Span< T, DYNAMIC_EXTENT >::subspan
constexpr Span< T, DYNAMIC_EXTENT > subspan(size_t index) const
Definition: span.hpp:123
microstrain::Span< const mip::metadata::ParameterInfo >::const_reference
const const mip::metadata::ParameterInfo & const_reference
Definition: span.hpp:53
microstrain::Span< T, DYNAMIC_EXTENT >::begin
constexpr pointer begin() const noexcept
Definition: span.hpp:108
microstrain::Span< const mip::metadata::ParameterInfo >::const_pointer
const const mip::metadata::ParameterInfo * const_pointer
Definition: span.hpp:52
microstrain::Span< T, DYNAMIC_EXTENT >::size
constexpr size_t size() const noexcept
Definition: span.hpp:119
microstrain::Span< const mip::metadata::ParameterInfo >::difference_type
ptrdiff_t difference_type
Definition: span.hpp:48
microstrain::Span::operator[]
constexpr reference operator[](size_t idx) noexcept
Definition: span.hpp:64
microstrain::Span::empty
constexpr bool empty() const noexcept
Definition: span.hpp:70
microstrain::Span::end
constexpr pointer end() const noexcept
Definition: span.hpp:59
microstrain::Span< T, DYNAMIC_EXTENT >::first
constexpr Span< T, Count > first() const
Definition: span.hpp:129
microstrain::Span< T, DYNAMIC_EXTENT >::first
constexpr Span< T, DYNAMIC_EXTENT > first(size_t count) const
Definition: span.hpp:127
microstrain::Span< T, DYNAMIC_EXTENT >::back
constexpr element_type back() const noexcept
Definition: span.hpp:112
microstrain::Span< T, DYNAMIC_EXTENT >::reference
T & reference
Definition: span.hpp:97
microstrain::Span< T, DYNAMIC_EXTENT >::subspan
constexpr Span< T, Count > subspan() const
Definition: span.hpp:125
microstrain::Span::back
constexpr element_type back() const noexcept
Definition: span.hpp:62
microstrain::Span::last
constexpr Span< T, DYNAMIC_EXTENT > last(size_t count) const
Definition: span.hpp:81
microstrain::Span< const mip::metadata::ParameterInfo >::value_type
typename std::remove_cv< const mip::metadata::ParameterInfo >::type value_type
Definition: span.hpp:47
microstrain::Span::extent
static constexpr size_t extent
Definition: span.hpp:44
microstrain::Span< T, DYNAMIC_EXTENT >::Span
constexpr Span(pointer ptr, size_t cnt)
Definition: span.hpp:104
microstrain::Span< T, DYNAMIC_EXTENT >::operator[]
constexpr reference operator[](size_t idx) noexcept
Definition: span.hpp:114
microstrain::Span< T, DYNAMIC_EXTENT >::operator[]
constexpr const_reference operator[](size_t idx) const noexcept
Definition: span.hpp:115
microstrain
Definition: embedded_time.h:8
microstrain::Span< const mip::metadata::ParameterInfo >::const_iterator
const const mip::metadata::ParameterInfo * const_iterator
Definition: span.hpp:54
mip::metadata::Span
microstrain::Span< T > Span
Definition: mip_structures.hpp:12
microstrain::Span< T, DYNAMIC_EXTENT >::Span
constexpr Span(T(&arr)[N])
Definition: span.hpp:106