🛰️航天仿真算法库 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#if 0 // 暂时不支持其他容器类型,因为无法确定其内存是否连续
121 template <typename Container>
122 constexpr Span(Container& cont) noexcept
123 : storage_(cont.data(), cont.size()) {}
124
125 template <typename Container>
126 constexpr Span(const Container& cont) noexcept
127 : storage_(cont.data(), cont.size()) {}
128#endif
129
130 // 元素访问
131 constexpr reference operator[](index_type idx) const noexcept {
132 return data()[idx];
133 }
134
135 constexpr reference front() const noexcept {
136 return data()[0];
137 }
138
139 constexpr reference back() const noexcept {
140 return data()[size() - 1];
141 }
142
143 constexpr pointer data() const noexcept {
144 return storage_.data_;
145 }
146
147 // 迭代器
148 constexpr iterator begin() const noexcept {
149 return data();
150 }
151
152 constexpr iterator end() const noexcept {
153 return data() + size();
154 }
155
156 constexpr const_iterator cbegin() const noexcept {
157 return data();
158 }
159
160 constexpr const_iterator cend() const noexcept {
161 return data() + size();
162 }
163
164 constexpr reverse_iterator rbegin() const noexcept {
165 return reverse_iterator(end());
166 }
167
168 constexpr reverse_iterator rend() const noexcept {
169 return reverse_iterator(begin());
170 }
171
172 constexpr const_reverse_iterator crbegin() const noexcept {
173 return const_reverse_iterator(cend());
174 }
175
176 constexpr const_reverse_iterator crend() const noexcept {
177 return const_reverse_iterator(cbegin());
178 }
179
180 // 容量
181 constexpr bool empty() const noexcept {
182 return size() == 0;
183 }
184
185 constexpr index_type size() const noexcept {
186 return storage_.size_;
187 }
188
189 constexpr index_type size_bytes() const noexcept {
190 return size() * sizeof(element_type);
191 }
192
193 // 子视图
194 A_CONSTEXPR_CXX14 Span subspan(index_type offset, index_type count = static_cast<index_type>(-1)) const noexcept {
195 if (count == static_cast<index_type>(-1)) {
196 count = size() - offset;
197 }
198 return Span(data() + offset, count);
199 }
200
201 constexpr Span first(index_type count) const noexcept {
202 return Span(data(), count);
203 }
204
205 constexpr Span last(index_type count) const noexcept {
206 return Span(data() + size() - count, count);
207 }
208
209private:
210 SpanStorage<T, Extent> storage_;
211};
212
213#ifdef A_CXX17
214// 推导指南
215template <typename T, std::size_t N>
216Span(T (&)[N]) -> Span<T, N>;
217
218template <typename T, std::size_t N>
219Span(std::array<T, N>&) -> Span<T, N>;
220
221template <typename T, std::size_t N>
222Span(const std::array<T, N>&) -> Span<const T, N>;
223
224template <typename Container>
226
227template <typename Container>
229#endif
230
233AST_NAMESPACE_END
Unit N
牛顿
定义 Unit.cpp:447
定义 Span.hpp:40
非拥有的连续对象序列视图
定义 Span.hpp:71