dl
dl_type_convert.h
浏览该文件的文档.
1
12#pragma once
13
14#include <array>
15#include <vector>
16#include <initializer_list>
17#include <cassert>
18
19#include "dl_type_def.h"
20
21namespace dl
22{
23template<typename T1, typename T, std::size_t N>
24constexpr Array<T1, N> toArray(const Array<T, N>& a)
25{
26 Array<T1, N> ret;
27 for (std::size_t i = 0; i < N; ++i)
28 {
29 ret[i] = static_cast<T1>(a[i]);
30 }
31 return ret;
32}
33template<typename T, std::size_t N>
34constexpr Array<T, N> toArray(const std::array<T, N>& a)
35{
36 Array<T, N> ret;
37 for (std::size_t i = 0; i < N; ++i)
38 {
39 ret[i] = a[i];
40 }
41 return ret;
42}
43
46template<typename T, std::size_t N>
51
54template<typename T, std::size_t N>
59
60
61template<typename T, std::size_t N, typename T1, typename ...Args>
62constexpr void toArrayImp(Array<T, N>& arr, const T1& a, Args... args)
63{
64 arr[N - sizeof...(Args) - 1] = static_cast<T>(a);
65 if constexpr (sizeof...(Args) > 0)
66 toArrayImp(arr, args...);
67}
68
69template<typename T, typename T1, typename ...Args>
70constexpr Array<T, sizeof...(Args) + 1> toArray(const T1& a, Args... args)
71{
72 Array<T, sizeof...(Args) + 1> ret;
73 toArrayImp(ret, a, args...);
74 return ret;
75}
76
79template<typename ...Args>
80constexpr Array<Position::value_type, sizeof...(Args)> toPosition(Args... args)
81{
82 return toArray<Position::value_type>(args...);
83}
84
88template<typename ...Args>
89constexpr Array<Point::value_type, sizeof...(Args)> toPoint(Args... args)
90{
91 return toArray<Point::value_type>(args...);
92}
93
94
95template<typename T, typename ...Args>
96constexpr void CheckPositive(const T& a, Args... args)
97{
98 assert(a >= 0);
99 if constexpr (sizeof...(Args) > 0)
100 CheckPositive(args...);
101}
102
106template<typename ...Args>
107constexpr Array<Size::value_type, sizeof...(Args)> toSize(Args... args)
108{
109 CheckPositive(args...);
110 return toArray<Size::value_type>(args...);
111}
112template<typename T, size_t N>
114{
116 for (int i = 0; i < N; ++i)
117 {
118 assert(a[i] >= 0);
119 ret[i] = static_cast<Size::value_type>(a[i]);
120 }
121 return ret;
122}
123
127template<typename T, size_t N>
129{
131 for (int i = 0; i < N; ++i)
132 {
133 if (a[i] < 0)
134 {
135 ret[i] = 0;
136 }
137 else
138 ret[i] = static_cast<Size::value_type>(a[i]);
139 }
140 return ret;
141}
142
146template<typename T, size_t N>
148{
150 for (int i = 0; i < N; ++i)
151 ret[i] = static_cast<PointU::value_type>(a[i]);
152 return ret;
153}
154
159template<typename ...Args>
160constexpr Array<SizeT::value_type, sizeof...(Args)> toSizeT(Args... args)
161{
162 CheckPositive(args...);
163 return toArray<SizeT::value_type>(args...);
164}
165template<typename T, size_t N>
167{
169 for (int i = 0; i < N; ++i)
170 {
171 assert(a[i] >= 0);
172 ret[i] = static_cast<SizeT::value_type>(a[i]);
173 }
174 return ret;
175}
176
180template<typename T, size_t N>
182{
184 for (int i = 0; i < N; ++i)
185 {
186 if (a[i] < 0)
187 {
188 ret[i] = 0;
189 }
190 else
191 ret[i] = static_cast<Size::value_type>(a[i]);
192 }
193 return ret;
194}
195
199template<typename T, size_t N>
201{
203 for (int i = 0; i < N; ++i)
204 ret[i] = static_cast<SizeT::value_type>(a[i]);
205 return ret;
206}
207
211template<size_t M = 1, typename T, size_t N>
212constexpr Array<T, N + M> toLonger(const Array<T, N>& a, const T& v = {})
213{
214 Array<T, N + M> ret;
215 for (size_t i = 0; i < N; ++i)
216 ret[i] = a[i];
217 for (size_t i = N; i < N + M; ++i)
218 ret[i] = v;
219 return ret;
220}
221template<size_t M = 1, typename T>
222constexpr Array<T, M + 1> toLonger(const T& v)
223{
224 Array<T, M + 1> ret;
225 for (size_t i = 0; i < M + 1; ++i)
226 ret._data[i] = v; // clang需要直接访问_data才能生成常量表达式
227 return ret;
228}
229
232template<size_t M = 1, typename T, size_t N>
233constexpr Array<T, N - M> toShorter(const Array<T, N>& a)
234{
235 static_assert(M <= N);
236 Array<T, N - M> ret;
237 for (size_t i = 0; i < N - M; ++i)
238 ret[i] = a[i];
239 return ret;
240}
241//------------------------------------vector---------------------------------------
242template<typename T>
243constexpr std::vector<T> toVector(const T& a, size_t n)
244{
245 std::vector<T> ret;
246 ret.resize(n, a);
247 return ret;
248}
249}
通用类型定义
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
constexpr void toArrayImp(Array< T, N > &arr, const T1 &a, Args... args)
constexpr void CheckPositive(const T &a, Args... args)
constexpr Array< Size::value_type, sizeof...(Args)> toSize(Args... args)
转换到Size,变长参数
constexpr ArrayS2< T, N - M > toShorter(const ArrayS2< T, N > &a)
constexpr Array< T, N+M > toLonger(const Array< T, N > &a, const T &v={})
长度+M
constexpr Array< SizeT::value_type, N > toSizeTNeg2Zero(const Array< T, N > &a)
转换到Size,出现负数时转为0
constexpr Array< PointU::value_type, N > toSizeDefault(const Array< T, N > &a)
有符号转无符号,直接转换,负数会直接转为大正数
constexpr Array< Size::value_type, N > toSizeNeg2Zero(const Array< T, N > &a)
转换到Size,出现负数时转为0
constexpr Array< Point::value_type, N > toPoint(const Array< T, N > &a)
转换到Point,已知长度
constexpr Array< T1, N > toArray(const Array< T, N > &a)
constexpr Array< SizeT::value_type, sizeof...(Args)> toSizeT(Args... args)
转换到Size,变长参数
constexpr std::vector< T > toVector(const T &a, size_t n)
constexpr Array< SizeT::value_type, N > toSizeTDefault(const Array< T, N > &a)
有符号转无符号,直接转换,负数会直接转为大正数