Sen API
Sen Libraries
Loading...
Searching...
No Matches
span.h
Go to the documentation of this file.
1// === span.h ==========================================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_CORE_BASE_SPAN_H
9#define SEN_CORE_BASE_SPAN_H
10
11// sen
14
15// std
16#include <array>
17#include <iterator>
18#include <vector>
19
20namespace sen
21{
22
25
32template <class T>
33class Span
34{
35public:
36 SEN_COPY_MOVE(Span)
37
38public:
39 using element_type = T; // NOLINT
40 using value_type = std::remove_cv_t<T>; // NOLINT
41 using index_type = std::size_t; // NOLINT
42 using difference_type = ptrdiff_t; // NOLINT
43 using pointer = T*; // NOLINT
44 using reference = T&; // NOLINT
45 using iterator = T*; // NOLINT
46 using const_iterator = const T*; // NOLINT
47 using reverse_iterator = std::reverse_iterator<iterator>; // NOLINT
48 using const_reverse_iterator = std::reverse_iterator<const_iterator>; // NOLINT
49
50public: // defaulted members
51 Span() noexcept = default;
52 ~Span() noexcept = default;
53
54public: // constructors
56 template <typename U, std::enable_if_t<std::is_convertible_v<U*, T*>, int> = 0>
57 constexpr Span(const Span<U>& other) noexcept // NOLINT(hicpp-explicit-conversions)
58 : data_(other.data_), size_(other.size_)
59 {
60 }
61
64 constexpr Span(pointer ptr, index_type count) noexcept: data_(ptr), size_(count) {}
65
67 template <std::size_t n> // NOLINTNEXTLINE(hicpp-explicit-conversions)
68 constexpr Span(std::array<value_type, n>& array) noexcept: data_(array.data()), size_(array.size())
69 {
70 }
71
73 template <std::size_t n> // NOLINTNEXTLINE(hicpp-explicit-conversions)
74 constexpr Span(const std::array<value_type, n>& array) noexcept: data_(array.data()), size_(array.size())
75 {
76 }
77
79 template <typename U, std::size_t n, std::enable_if_t<std::is_convertible_v<U*, T*>, int> = 0>
80 constexpr Span(std::array<U, n>& array) noexcept // NOLINT(hicpp-explicit-conversions)
81 : data_(array.data()), size_(array.size())
82 {
83 }
84
86 template <typename U, std::size_t n, std::enable_if_t<std::is_convertible_v<U*, T*>, int> = 0>
87 constexpr Span(const std::array<U, n>& array) noexcept // NOLINT(hicpp-explicit-conversions)
88 : data_(array.data()), size_(array.size())
89 {
90 }
91
93 constexpr Span(std::vector<value_type>& vector) noexcept: data_(vector.data()), size_(vector.size()) {}
94
96 constexpr Span(const std::vector<value_type>& vector) noexcept: data_(vector.data()), size_(vector.size()) {}
97
99 template <typename U, std::enable_if_t<std::is_convertible_v<U*, T*>, int> = 0>
100 constexpr Span(std::vector<U>& vector) noexcept // NOLINT(hicpp-explicit-conversions)
101 : data_(vector.data()), size_(vector.size())
102 {
103 }
104
106 template <typename U, std::enable_if_t<std::is_convertible_v<U*, T*>, int> = 0>
107 constexpr Span(const std::vector<U>& vector) noexcept // NOLINT(hicpp-explicit-conversions)
108 : data_(vector.data()), size_(vector.size())
109 {
110 }
111
112public: // subviews
115 [[nodiscard]] Span first(index_type count) const noexcept;
116
119 [[nodiscard]] Span last(index_type count) const noexcept;
120
124 [[nodiscard]] Span subspan(index_type offset = 0) const noexcept;
125
129 [[nodiscard]] Span subspan(index_type offset, index_type count) const noexcept;
130
131public: // observers
133 [[nodiscard]] constexpr std::size_t size() const noexcept { return size_; }
134
136 [[nodiscard]] constexpr bool empty() const noexcept { return size_ == 0; }
137
138public: // element access
149 [[nodiscard]] reference operator[](index_type i) const noexcept;
150
153 [[nodiscard]] constexpr pointer data() const noexcept { return data_; }
154
155public: // iterator support
159 [[nodiscard]] constexpr iterator begin() const noexcept { return {data()}; }
160
163 [[nodiscard]] constexpr iterator end() const noexcept { return {data() + size()}; }
164
168 [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return {data()}; }
169
172 [[nodiscard]] constexpr const_iterator cend() const noexcept { return {data() + size()}; }
173
174private:
175 pointer data_ = nullptr;
176 index_type size_ = 0U;
177};
178
179//--------------------------------------------------------------------------------------------------------------
180// Comparison operators
181//--------------------------------------------------------------------------------------------------------------
182
183template <typename T>
184[[nodiscard]] constexpr bool operator==(const Span<T>& lhs, const Span<T>& rhs) noexcept
185{
186 return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin());
187}
188
189template <typename T>
190[[nodiscard]] constexpr bool operator!=(const Span<T>& lhs, const Span<T>& rhs) noexcept
191{
192 return !(lhs == rhs);
193}
194
195//--------------------------------------------------------------------------------------------------------------
196// makeSpan
197//--------------------------------------------------------------------------------------------------------------
198
200template <typename T>
201[[nodiscard]] constexpr Span<T> makeSpan(T* ptr, std::size_t size) noexcept
202{
203 return Span<T>(ptr, size);
204}
205
207template <typename T, std::size_t n>
208[[nodiscard]] constexpr Span<T> makeSpan(T (&arr)[n]) noexcept
209{
210 return makeSpan(arr, n);
211}
212
214template <typename T>
215[[nodiscard]] constexpr Span<T> makeSpan(T& val) noexcept
216{
217 return makeSpan(&val, 1UL);
218}
219
221template <typename Iterator, typename T = typename std::iterator_traits<Iterator>::value_type>
222[[nodiscard]] constexpr Span<T> makeSpan(Iterator first, Iterator last) noexcept
223{
224 return makeSpan(&*first, static_cast<std::size_t>(std::distance(first, last)));
225}
226
228template <typename T>
229[[nodiscard]] constexpr Span<T> makeSpan(std::vector<T>& vector) noexcept
230{
231 return Span<T>(vector);
232}
233
235template <typename T, std::size_t s>
236[[nodiscard]] constexpr Span<T> makeSpan(std::array<T, s>& array) noexcept
237{
238 return Span<T>(array);
239}
240
241//--------------------------------------------------------------------------------------------------------------
242// makeConstSpan
243//--------------------------------------------------------------------------------------------------------------
244
247template <typename T>
248[[nodiscard]] constexpr Span<const T> makeConstSpan(const T* ptr, std::size_t size) noexcept
249{
250 return Span<const T>(ptr, size);
251}
252
255template <typename T, std::size_t n>
256[[nodiscard]] constexpr Span<const T> makeConstSpan(const T (&arr)[n]) noexcept
257{
258 return makeConstSpan(arr, n);
259}
260
263template <typename Iterator, typename T = typename std::iterator_traits<Iterator>::value_type>
264[[nodiscard]] constexpr Span<const T> makeConstSpan(Iterator first, Iterator last) noexcept
265{
266 return makeConstSpan(&*first, static_cast<std::size_t>(std::distance(first, last)));
267}
268
271template <typename T>
272[[nodiscard]] constexpr Span<const T> makeConstSpan(const std::vector<T>& vector) noexcept
273{
274 return Span<const T>(vector);
275}
276
279template <typename T, std::size_t s>
280[[nodiscard]] constexpr Span<const T> makeConstSpan(const std::array<T, s>& array) noexcept
281{
282 return Span<const T>(array);
283}
284
286
287//----------------------------------------------------------------------------------------------------------------------
288// Inline implementation
289//----------------------------------------------------------------------------------------------------------------------
290
291template <typename T>
292Span<T> Span<T>::first(index_type count) const noexcept
293{
294 SEN_EXPECT(count <= size());
295 return {data(), count};
296}
297
298template <typename T>
299Span<T> Span<T>::last(index_type count) const noexcept
300{
301 SEN_EXPECT(count <= size());
302 return {data() + (size() - count), count}; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
303}
304
305template <typename T>
306Span<T> Span<T>::subspan(index_type offset) const noexcept
307{
308 SEN_EXPECT(offset <= size());
309 return {data() + offset, size() - offset}; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
310}
311
312template <typename T>
313Span<T> Span<T>::subspan(index_type offset, std::size_t count) const noexcept
314{
315 SEN_EXPECT(offset <= size());
316 SEN_EXPECT(count <= (size() - offset));
317 return {data() + offset, count}; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
318}
319
320template <typename T>
322{
323 SEN_EXPECT(i < size());
324 return *(data() + i); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
325}
326
327} // namespace sen
328
329#endif // SEN_CORE_BASE_SPAN_H
The following macros implement a replacement of assert that is connected to the overall fault handlin...
Contiguous view of elements of type T. Inspired by http://www.open-std.org/jtc1/sc22/wg21/docs/papers...
Definition span.h:34
Span() noexcept=default
reference operator[](index_type i) const noexcept
Gets the element at index i. Complexity: constant.
Definition span.h:321
constexpr bool empty() const noexcept
Definition span.h:136
Span last(index_type count) const noexcept
Returns a new Span over the last count elements of *this.
Definition span.h:299
std::remove_cv_t< T > value_type
Definition span.h:40
const T * const_iterator
Definition span.h:46
T & reference
Definition span.h:44
T element_type
Definition span.h:39
std::reverse_iterator< iterator > reverse_iterator
Definition span.h:47
constexpr const_iterator cbegin() const noexcept
Returns a const iterator to the first element of the vector. If the Span is empty,...
Definition span.h:168
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition span.h:48
ptrdiff_t difference_type
Definition span.h:42
Span first(index_type count) const noexcept
Returns a new span over the first count elements of *this.
Definition span.h:292
T * iterator
Definition span.h:45
constexpr pointer data() const noexcept
Direct access to the underlying storage. Complexity: constant.
Definition span.h:153
constexpr Span(std::array< value_type, n > &array) noexcept
Builds a Span out of an array.
Definition span.h:68
constexpr iterator begin() const noexcept
Returns an iterator to the first element of the Span. If the vector is empty, the returned iterator w...
Definition span.h:159
constexpr Span(const std::array< U, n > &array) noexcept
Builds a Span out of a const array.
Definition span.h:87
constexpr iterator end() const noexcept
Iterator to the element following the last element. Complexity: constant. NOLINTNEXTLINE(cppcoreguide...
Definition span.h:163
constexpr Span(const std::array< value_type, n > &array) noexcept
Builds a Span out of an array.
Definition span.h:74
constexpr Span(const std::vector< U > &vector) noexcept
Builds a Span out of a const compatible vector.
Definition span.h:107
constexpr std::size_t size() const noexcept
Definition span.h:133
constexpr Span(pointer ptr, index_type count) noexcept
Builds a Span out of a pointer and an element count.
Definition span.h:64
constexpr Span(std::vector< U > &vector) noexcept
Builds a Span out of a compatible vector.
Definition span.h:100
constexpr Span(std::vector< value_type > &vector) noexcept
Builds a Span out of a vector. NOLINTNEXTLINE(hicpp-explicit-conversions).
Definition span.h:93
T * pointer
Definition span.h:43
constexpr Span(std::array< U, n > &array) noexcept
Builds a Span out of an array.
Definition span.h:80
Span subspan(index_type offset=0) const noexcept
Returns a new Span over the elements of *this beginning at offset and extending for size() - offset e...
Definition span.h:306
constexpr const_iterator cend() const noexcept
Constant iterator to the element following the last element. Complexity: constant....
Definition span.h:172
constexpr Span(const std::vector< value_type > &vector) noexcept
Builds a Span out of a vector. NOLINTNEXTLINE(hicpp-explicit-conversions).
Definition span.h:96
std::size_t index_type
Definition span.h:41
#define SEN_EXPECT(expr)
Checks a pre-condition of a procedure (function parameter for example). NOLINTNEXTLINE.
Definition assert.h:36
constexpr bool operator!=(const Span< T > &lhs, const Span< T > &rhs) noexcept
Definition span.h:190
constexpr bool operator==(const Span< T > &lhs, const Span< T > &rhs) noexcept
Definition span.h:184
constexpr Span< T > makeSpan(T *ptr, std::size_t size) noexcept
Takes in a type that can be passed to a contiguous range and returns a Span.
Definition span.h:201
constexpr Span< const T > makeConstSpan(const T *ptr, std::size_t size) noexcept
Takes in a type that can be passed to a contiguous range and returns a Span. The element types will b...
Definition span.h:248
Definition assert.h:17
STL namespace.