dl
dl_array.h
浏览该文件的文档.
1
13#pragma once
14
15#include <array>
16#include <cassert>
17#include <stdexcept>
18#include <type_traits>
19
20#if 1
21namespace dl
22{
23//#define DL_ALIGN16
24//#define DL_ALIGN16 alignas(16)
25
27template<typename T, size_t N>
28class Array
29{
30public:
31 using value_type = T;
33 Array() = default;
34
35 constexpr Array(std::initializer_list<T> data)
36 {
37 size_t i = 0;
38 for (auto iter : data)
39 {
40 _data[i] = iter;
41 ++i;
42 if (i >= N)
43 return;
44 }
45 for (; i < N; ++i)
46 _data[i] = {};
47 }
48 constexpr T& operator[](size_t i)
49 {
50 assert(i < N);
51 return _data[i];
52 }
53 constexpr const T& operator[](size_t i) const
54 {
55 assert(i < N);
56 return _data[i];
57 }
58 constexpr T& at(size_t i)
59 {
60 if (i >= N)
61 throw std::out_of_range("dl::Array::at outrange");
62 return _data[i];
63 }
64 constexpr const T& at(size_t i) const
65 {
66 if (i >= N)
67 throw std::out_of_range("dl::Array::at outrange");
68 return _data[i];
69 }
70
71 T* begin() { return &_data[0]; }
72 T* end() { return &_data[N]; }
73 const T* begin() const { return &_data[0]; }
74 const T* end() const { return &_data[N]; }
75 bool empty() const { return false; }
76};
77
78template<typename T>
79 requires std::is_trivial_v<T>
80class Array<T, 2>
81{
82public:
83 using value_type = T;
84 union
85 {
86 struct
87 {
90 };
91 struct
92 {
95 };
96 struct
97 {
100 };
102 };
103 Array() = default;
104
105 constexpr Array(std::initializer_list<T> data)
106 {
107 size_t N_LIST = std::size(data);
108 for (size_t i = 0; i < 2; ++i)
109 _data[i] = i < N_LIST ? *(data.begin() + i) : T{};
110 }
111 constexpr const T& Get(size_t i) const
112 {
113 assert(i < 2);
114 return _data[i];
115 }
116 constexpr T& operator[](size_t i)
117 {
118 assert(i < 2);
119 return _data[i];
120 }
121 constexpr const T& operator[](size_t i) const
122 {
123 assert(i < 2);
124 return _data[i];
125 }
126 constexpr T& at(size_t i)
127 {
128 assert(i < 2);
129 if (i < 2)
130 return _data[i];
131 else
132 throw std::out_of_range("dl::Array::at outrange");
133 }
134 constexpr const T& at(size_t i) const
135 {
136 assert(i < 2);
137 if (i < 2)
138 return _data[i];
139 else
140 throw std::out_of_range("dl::Array::at outrange");
141 }
142
143 T* begin() { return &x; }
144 T* end() { return &x + 2; }
145 const T* begin() const { return &x; }
146 const T* end() const { return &x + 2; }
147 bool empty() const { return false; }
148};
149
150template<typename T>
151 requires std::is_trivial_v<T>
152class Array<T, 3>
153{
154public:
155 using value_type = T;
156 union
157 {
158 struct
159 {
163 };
164 struct
165 {
169 };
171 };
172 Array() = default;
173
174 constexpr Array(std::initializer_list<T> data)
175 {
176 size_t N_LIST = std::size(data);
177 for (size_t i = 0; i < 3; ++i)
178 _data[i] = i < N_LIST ? *(data.begin() + i) : T{};
179 }
180 constexpr const T& Get(size_t i) const
181 {
182 assert(i < 3);
183 return _data[i];
184 }
185 constexpr T& operator[](size_t i)
186 {
187 assert(i < 3);
188 return _data[i];
189 }
190 constexpr const T& operator[](size_t i) const
191 {
192 assert(i < 3);
193 return _data[i];
194 }
195 constexpr T& at(size_t i)
196 {
197 assert(i < 3);
198 if (i < 3)
199 return _data[i];
200 else
201 throw std::out_of_range("dl::Array::at outrange");
202 }
203 constexpr const T& at(size_t i) const
204 {
205 assert(i < 3);
206 if (i < 3)
207 return _data[i];
208 else
209 throw std::out_of_range("dl::Array::at outrange");
210 }
211
212 T* begin() { return &x; }
213 T* end() { return &x + 3; }
214 const T* begin() const { return &x; }
215 const T* end() const { return &x + 3; }
216 bool empty() const { return false; }
217};
218
219template<typename T>
220 requires std::is_trivial_v<T>
221class Array<T, 4>
222{
223public:
224 using value_type = T;
225 union
226 {
227 struct
228 {
233 };
234 struct
235 {
240 };
242 };
243 Array() = default;
244
245 constexpr Array(std::initializer_list<T> data)
246 {
247 size_t N_LIST = std::size(data);
248 for (size_t i = 0; i < 4; ++i)
249 _data[i] = i < N_LIST ? *(data.begin() + i) : T{};
250 }
251 constexpr const T& Get(size_t i) const
252 {
253 assert(i < 4);
254 return _data[i];
255 }
256 constexpr T Sum(size_t i, size_t j) const
257 {
258 assert(i < 4);
259 assert(j < 4);
260 return _data[i] + _data[j];
261 }
262 constexpr T& operator[](size_t i)
263 {
264 assert(i < 4);
265 return _data[i];
266 }
267 constexpr const T& operator[](size_t i) const
268 {
269 assert(i < 4);
270 return _data[i];
271 }
272 constexpr T& at(size_t i)
273 {
274 assert(i < 4);
275 if (i < 4)
276 return _data[i];
277 else
278 throw std::out_of_range("dl::Array::at outrange");
279 }
280 constexpr const T& at(size_t i) const
281 {
282 assert(i < 4);
283 if (i < 4)
284 return _data[i];
285 else
286 throw std::out_of_range("dl::Array::at outrange");
287 }
288
289 T* begin() { return &x; }
290 T* end() { return &x + 4; }
291 const T* begin() const { return &x; }
292 const T* end() const { return &x + 4; }
293 bool empty() const { return false; }
294};
295
296template<typename T>
297class Array<T, 0>
298{
299public:
300 using value_type = T;
302 Array() = default;
303
304 constexpr Array(std::initializer_list<T> data)
305 {
306 }
307 constexpr T& operator[](size_t i)
308 {
309 return *begin();
310 }
311 constexpr const T& operator[](size_t i) const
312 {
313 return *begin();
314 }
315 constexpr T& at(size_t i)
316 {
317 throw std::out_of_range("dl::Array::at outrange");
318 }
319 constexpr const T& at(size_t i) const
320 {
321 throw std::out_of_range("dl::Array::at outrange");
322 }
323
324 T* begin() { return nullptr; }
325 T* end() { return nullptr; }
326 const T* begin() const { return nullptr; }
327 const T* end() const { return nullptr; }
328 bool empty() const { return true; }
329};
330
331template<typename T, size_t N>
332constexpr bool operator==(const Array<T, N>& a, const Array<T, N>& b)
333{
334 for (size_t i = 0; i < N; ++i)
335 {
336 if (a[i] != b[i])
337 return false;
338 }
339 return true;
340}
341}
342#else
343template<typename T, size_t N>
344using Array = std::array<T, N>;
345#endif
346
constexpr const T & at(size_t i) const
constexpr Array(std::initializer_list< T > data)
constexpr const T & operator[](size_t i) const
constexpr T & at(size_t i)
constexpr const T & Get(size_t i) const
constexpr const T & operator[](size_t i) const
constexpr const T & at(size_t i) const
constexpr T & operator[](size_t i)
constexpr T & operator[](size_t i)
const T * end() const
constexpr T & operator[](size_t i)
constexpr const T & at(size_t i) const
const T * end() const
Array()=default
const T * begin() const
bool empty() const
const T * end() const
constexpr T & at(size_t i)
constexpr Array(std::initializer_list< T > data)
constexpr const T & operator[](size_t i) const
constexpr const T & operator[](size_t i) const
constexpr T & at(size_t i)
constexpr const T & at(size_t i) const
const T * begin() const
constexpr T & at(size_t i)
constexpr const T & at(size_t i) const
constexpr const T & Get(size_t i) const
constexpr const T & operator[](size_t i) const
constexpr const T & Get(size_t i) const
constexpr Array(std::initializer_list< T > data)
constexpr T & operator[](size_t i)
constexpr T Sum(size_t i, size_t j) const
constexpr Array(std::initializer_list< T > data)
constexpr Array(std::initializer_list< T > data)
const T * begin() const
constexpr T & operator[](size_t i)
const T * end() const
const T * end() const
constexpr T & at(size_t i)
const T * begin() const
const T * begin() const
constexpr bool operator==(const Array< T, N > &a, const Array< T, N > &b)