dl
dl_range_each.h
浏览该文件的文档.
1
12#pragma once
13
14#include "dl_concept.h"
15#include "base/dl_array.h"
16
18namespace dl::Each
19{
24template<typename T, size_t N>
26{
27 Array<T, N> ret;
28 for (size_t i = 0; i < N; ++i)
29 {
30 ret[i] = (std::min)(a[i], b[i]);
31 }
32 return ret;
33}
34
39template<typename T, size_t N>
41{
42 Array<T, N> ret;
43 for (size_t i = 0; i < N; ++i)
44 {
45 ret[i] = (std::max)(a[i], b[i]);
46 }
47 return ret;
48}
49
53template<IsInteger T, size_t N>
54void Limit(Array<T, N>& a, const Array<T, N>& min, const Array<T, N>& max)
55{
56 for (size_t i = 0; i < N; ++i)
57 {
58 if (a[i] < min[i])
59 a[i] = min[i];
60 else if (a[i] >= max[i])
61 a[i] = max[i] - 1;
62 }
63}
64
65template<IsInteger T, size_t N>
66[[nodiscard]]
67Array<T, N> Limit(const Array<T, N>& a, const Array<T, N>& min, const Array<T, N>& max)
68{
69 Array<T, N> ret = a;
70 Limit(ret, min, max);
71 return ret;
72}
73
78template<typename T, size_t N>
79constexpr bool Less(const Array<T, N>& a, const Array<T, N>& b)
80{
81 for (size_t i = 0; i < N; ++i)
82 {
83 if (!(a[i] < b[i]))
84 return false;
85 }
86 return true;
87}
88
94template<IsReal T, size_t N>
96{
97 Array<T, N> ret;
98 for (size_t i = 0; i < N; ++i)
99 {
100 ret[i] = std::lerp(a[i], b[i], t);
101 }
102 return ret;
103}
104
112template<typename T, size_t N, IsReal R>
113Array<T, N> Lerp(const Array<T, N>& a, const Array<T, N>& b, R t, R(*func)(R))
114{
115 Array<T, N> ret;
116 for (size_t i = 0; i < N; ++i)
117 {
118 ret[i] = (T)func(std::lerp((R)a[i], (R)b[i], t));
119 }
120 return ret;
121}
122
126template<typename T, size_t N>
128{
129 Array<T, N> ret;
130 for (size_t i = 0; i < N; ++i)
131 {
132 ret[i] = std::fmod(a[i], b[i]);
133 }
134 return ret;
135}
136
143template<typename C0, typename C1, typename F>
144bool Yes(const C0& container0, const C1& container1, F func)
145{
146 if (container0.size() != container1.size())
147 return false;
148 auto iter0 = container0.begin();
149 auto iter1 = container1.begin();
150 while (iter0 != container0.end())
151 {
152 if (!func(*iter0, *iter1))
153 return false;
154 ++iter0;
155 ++iter1;
156 }
157 return true;
158}
159
166template<typename C0, typename C1>
167void Clone(C1& tar, const C0& src)
168{
169 tar.resize(src.size());
170 auto iter0 = src.begin();
171 auto iter1 = tar.begin();
172 while (iter0 != src.end())
173 {
174 *iter1++ = *iter0++;
175 }
176}
177
184template<typename C0, typename C1>
185void Copy(C1& tar, const C0& src)
186{
187 std::size_t num = (std::min)(tar.size(), src.size());
188 auto iter0 = src.begin();
189 auto iter1 = tar.begin();
190 while (num--)
191 {
192 *iter1++ = *iter0++;
193 }
194}
195
196
197}
类似std::array,增加xyzw、wh等成员访问
用于模板限定,更好的报错信息
多对多遍历操作
Array< T, N > FMod(const Array< T, N > &a, const Array< T, N > &b)
浮点数求模
Array< T, N > Min(const Array< T, N > &a, const Array< T, N > &b)
取两者最小值为新元素
Array< T, N > Max(const Array< T, N > &a, const Array< T, N > &b)
取两者最大值为新元素
constexpr bool Less(const Array< T, N > &a, const Array< T, N > &b)
每个元素都小于返回真
void Clone(C1 &tar, const C0 &src)
克隆容器到另一个
Array< T, N > Lerp(const Array< T, N > &a, const Array< T, N > &b, T t)
线性插值
void Limit(Array< T, N > &a, const Array< T, N > &min, const Array< T, N > &max)
限制元素到 前闭后开区间(过大自动减1)
void Copy(C1 &tar, const C0 &src)
复制容器
bool Yes(const C0 &container0, const C1 &container1, F func)
判断两个容器 每个元素都满足条件