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