🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
Span.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include <vector>
25#include <cstddef>
26#include <iterator>
27#include <type_traits>
28#include <initializer_list>
29
30AST_NAMESPACE_BEGIN
31
37constexpr size_t dynamic_extent = static_cast<size_t>(-1);
38
39template<typename T, size_t Extent>
41public:
42 A_CONSTEXPR_CXX14 SpanStorage(T* data, size_t size) noexcept
43 : data_(data)
44 {
45 static_assert(size == Extent, "Size must match the extent for fixed-size spans");
46 }
47 T* data() const noexcept { return data_; }
48 A_CONSTEXPR_CXX14 size_t size() const noexcept { return Extent; }
49public:
50 T* data_;
51};
52
53
54template<typename T>
55class SpanStorage<T, dynamic_extent>{
56public:
57 SpanStorage(T* data, size_t size) noexcept : data_(data), size_(size) {}
58 T* data() const noexcept { return data_; }
59 size_t size() const noexcept { return size_; }
60public:
61 T* data_;
62 size_t size_;
63};
64
69template <typename T, size_t Extent = dynamic_extent>
70class Span
71{
72public:
73 using element_type = T;
74 using value_type = typename std::remove_cv<T>::type;
75 using index_type = std::size_t;
76 using difference_type = std::ptrdiff_t;
77 using pointer = T*;
78 using reference = T&;
79 using const_pointer = const T*;
80 using const_reference = const T&;
81 using iterator = pointer;
82 using const_iterator = const_pointer;
83 using reverse_iterator = std::reverse_iterator<iterator>;
84 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
85
86 static constexpr std::ptrdiff_t extent = Extent;
87
88 // 构造函数
89 constexpr Span() noexcept
90 : storage_(nullptr, 0)
91 {}
92
93 constexpr Span(std::initializer_list<T> init) noexcept
94 : storage_(init.begin(), init.size()) {}
95
96 constexpr Span(pointer ptr, index_type count) noexcept
97 : storage_(ptr, count) {}
98
99 constexpr Span(pointer first, pointer last) noexcept
100 : storage_(first, last - first) {}
101
102 template <std::size_t N>
103 constexpr
104 /*explicit*/
105 Span(element_type (&arr)[N]) noexcept
106 : storage_(arr, N) {}
107
108 template <typename U, std::size_t N>
109 constexpr explicit Span(std::array<U, N>& arr) noexcept
110 : storage_(arr.data(), N) {}
111
112 template <typename U, std::size_t N>
113 constexpr explicit Span(const std::array<U, N>& arr) noexcept
114 : storage_(arr.data(), N) {}
115
116 template <typename U>
117 constexpr explicit Span(const std::vector<U>& span) noexcept
118 : storage_(span.data(), span.size()) {}
119
120 template <typename U>
121 constexpr explicit Span(std::vector<U>& span) noexcept
122 : storage_(span.data(), span.size()) {}
123
124#if 0 // 暂时不支持其他容器类型,因为无法确定其内存是否连续
125 template <typename Container>
126 constexpr Span(Container& cont) noexcept
127 : storage_(cont.data(), cont.size()) {}
128
129 template <typename Container>
130 constexpr Span(const Container& cont) noexcept
131 : storage_(cont.data(), cont.size()) {}
132#endif
133
134 // 元素访问
135 constexpr reference operator[](index_type idx) const noexcept {
136 return data()[idx];
137 }
138
139 constexpr reference front() const noexcept {
140 return data()[0];
141 }
142
143 constexpr reference back() const noexcept {
144 return data()[size() - 1];
145 }
146
147 constexpr pointer data() const noexcept {
148 return storage_.data_;
149 }
150
151 // 迭代器
152 constexpr iterator begin() const noexcept {
153 return data();
154 }
155
156 constexpr iterator end() const noexcept {
157 return data() + size();
158 }
159
160 constexpr const_iterator cbegin() const noexcept {
161 return data();
162 }
163
164 constexpr const_iterator cend() const noexcept {
165 return data() + size();
166 }
167
168 constexpr reverse_iterator rbegin() const noexcept {
169 return reverse_iterator(end());
170 }
171
172 constexpr reverse_iterator rend() const noexcept {
173 return reverse_iterator(begin());
174 }
175
176 constexpr const_reverse_iterator crbegin() const noexcept {
177 return const_reverse_iterator(cend());
178 }
179
180 constexpr const_reverse_iterator crend() const noexcept {
181 return const_reverse_iterator(cbegin());
182 }
183
184 // 容量
185 constexpr bool empty() const noexcept {
186 return size() == 0;
187 }
188
189 constexpr index_type size() const noexcept {
190 return storage_.size_;
191 }
192
193 constexpr index_type size_bytes() const noexcept {
194 return size() * sizeof(element_type);
195 }
196
197 // 子视图
198 A_CONSTEXPR_CXX14 Span subspan(index_type offset, index_type count = static_cast<index_type>(-1)) const noexcept {
199 if (count == static_cast<index_type>(-1)) {
200 count = size() - offset;
201 }
202 return Span(data() + offset, count);
203 }
204
205 constexpr Span first(index_type count) const noexcept {
206 return Span(data(), count);
207 }
208
209 constexpr Span last(index_type count) const noexcept {
210 return Span(data() + size() - count, count);
211 }
212
213private:
214 SpanStorage<T, Extent> storage_;
215};
216
217#ifdef A_CXX17
218// 推导指南
219template <typename T, std::size_t N>
220Span(T (&)[N]) -> Span<T, N>;
221
222template <typename T, std::size_t N>
223Span(std::array<T, N>&) -> Span<T, N>;
224
225template <typename T, std::size_t N>
226Span(const std::array<T, N>&) -> Span<const T, N>;
227
228template <typename Container>
230
231template <typename Container>
233#endif
234
237AST_NAMESPACE_END
定义 Span.hpp:40
非拥有的连续对象序列视图
定义 Span.hpp:71
Unit T
特斯拉
定义 Unit.cpp:492
Unit N
牛顿
定义 Unit.cpp:477