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 };
241 struct
242 {
247 };
248 struct
249 {
254 };
256 };
257 Array() = default;
258
259 constexpr Array(std::initializer_list<T> data)
260 {
261 size_t N_LIST = std::size(data);
262 for (size_t i = 0; i < 4; ++i)
263 _data[i] = i < N_LIST ? *(data.begin() + i) : T{};
264 }
265 constexpr const T& Get(size_t i) const
266 {
267 assert(i < 4);
268 return _data[i];
269 }
270 constexpr T Sum(size_t i, size_t j) const
271 {
272 assert(i < 4);
273 assert(j < 4);
274 return _data[i] + _data[j];
275 }
276 constexpr T& operator[](size_t i)
277 {
278 assert(i < 4);
279 return _data[i];
280 }
281 constexpr const T& operator[](size_t i) const
282 {
283 assert(i < 4);
284 return _data[i];
285 }
286 constexpr T& at(size_t i)
287 {
288 assert(i < 4);
289 if (i < 4)
290 return _data[i];
291 else
292 throw std::out_of_range("dl::Array::at outrange");
293 }
294 constexpr const T& at(size_t i) const
295 {
296 assert(i < 4);
297 if (i < 4)
298 return _data[i];
299 else
300 throw std::out_of_range("dl::Array::at outrange");
301 }
302
303 T* begin() { return &x; }
304 T* end() { return &x + 4; }
305 const T* begin() const { return &x; }
306 const T* end() const { return &x + 4; }
307 bool empty() const { return false; }
308};
309
310template<typename T>
311class Array<T, 0>
312{
313public:
314 using value_type = T;
316 Array() = default;
317
318 constexpr Array(std::initializer_list<T> data)
319 {
320 }
321 constexpr T& operator[](size_t i)
322 {
323 return *begin();
324 }
325 constexpr const T& operator[](size_t i) const
326 {
327 return *begin();
328 }
329 constexpr T& at(size_t i)
330 {
331 throw std::out_of_range("dl::Array::at outrange");
332 }
333 constexpr const T& at(size_t i) const
334 {
335 throw std::out_of_range("dl::Array::at outrange");
336 }
337
338 T* begin() { return nullptr; }
339 T* end() { return nullptr; }
340 const T* begin() const { return nullptr; }
341 const T* end() const { return nullptr; }
342 bool empty() const { return true; }
343};
344
345template<typename T, size_t N>
346constexpr bool operator==(const Array<T, N>& a, const Array<T, N>& b)
347{
348 for (size_t i = 0; i < N; ++i)
349 {
350 if (a[i] != b[i])
351 return false;
352 }
353 return true;
354}
355
356
357}
358#else
359template<typename T, size_t N>
360using Array = std::array<T, N>;
361#endif
362
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)