12#include <initializer_list>
23 template<std::
signed_
integral T>
30 template<std::
floating_po
int T>
33 return std::fabs(num);
39 {
abs(x) } -> std::same_as<T>;
43 template<HasAbsFunction T,
size_t N>
46 return map(x, [](
const T& xv) {
return abs(xv); });
50 template<std::
floating_po
int T>
53 return std::floor(num);
59 {
floor(x) } -> std::same_as<T>;
63 template<HasFloorFunction T,
size_t N>
66 return map(x, [](
const T& xv) {
return floor(xv); });
70 template<std::
floating_po
int T>
73 return std::copysign(mag, sgn);
77 template<std::
integral T>
84 template<std::
floating_po
int T>
87 return std::fmod(x, y);
93 {
mod(x, y) } -> std::same_as<T>;
97 template<HasModFunction T,
size_t N>
100 return map(x, y, [](
const T& xv,
const T& yv) {
return mod(xv, yv); });
106 {
min(x, y) } -> std::convertible_to<T>;
110 template<HasMinFunction T,
size_t N>
113 return map(x, y, [](
const T& xv,
const T& yv) {
return min(xv, yv); });
119 {
max(x, y) } -> std::convertible_to<T>;
123 template<HasMaxFunction T,
size_t N>
124 requires std::is_arithmetic_v<T>
127 return map(x, y, [](
const T& xv,
const T& yv) {
return max(xv, yv); });
133 {
clamp(v, lo, hi) } -> std::convertible_to<T>;
137 template<HasClampFunction T,
size_t N>
140 return map(v, lo, hi, [](
const T& vv,
const T& lov,
const T& hiv) {
return clamp(vv, lov, hiv); });
144 template<HasClampFunction T,
size_t N>
147 return map(v, [&lo, &hi](
const T& vv) {
return clamp(vv, lo, hi); });
151 template<std::
floating_po
int T>
154 return clamp(num,
static_cast<T>(0),
static_cast<T>(1));
160 {
saturate(x) } -> std::convertible_to<T>;
164 template<HasSaturateFunction T,
size_t N>
167 return map(x, [](
const T& xv) {
return saturate(xv); });
172 typename Arithmetic1,
173 typename Arithmetic2,
177 std::is_arithmetic_v<Arithmetic1>
and
178 std::is_arithmetic_v<Arithmetic2>
and
179 std::is_arithmetic_v<Arithmetic3>
180 constexpr auto lerp(
const Arithmetic1& a,
const Arithmetic2& b,
const Arithmetic3& t)
182 return std::lerp(a, b, t);
186 template<
typename T,
typename TInterpolant>
188 {
lerp(a, b, t) } -> std::convertible_to<T>;
192 template<
typename T,
size_t N,
typename TInterpolant>
196 return map(x, y, [&t](
const T& xv,
const T& yv) {
return lerp(xv, yv, t); });
200 template<std::equality_comparable T,
size_t N>
203 return map(x, y, std::equal_to<T>{});
209 { x < y } -> std::convertible_to<bool>;
213 template<LessThanComparable T,
size_t N>
216 return map(x, y, std::less<T>{});
220 template<LessThanComparable T,
size_t N>
223 return map(x, [&v](
const T& el) {
return std::less<T>{}(el, v); });
229 { x <= y } -> std::convertible_to<bool>;
233 template<LessThanOrEqualToComparable T,
size_t N>
236 return map(x, y, std::less_equal<T>{});
241 requires HasAbsFunction<T>
and LessThanComparable<T>
244 return abs(x - y) <= absdiff;
248 template<
typename T,
size_t N>
249 requires HasAbsFunction<T>
and LessThanComparable<T>
252 return map(x, y, absdiff, equal_within_absdiff<T>);
256 template<
typename T,
size_t N>
257 requires HasAbsFunction<T>
and LessThanComparable<T>
264 template<std::
floating_po
int T>
271 template<std::
floating_po
int T,
size_t N>
279 template<std::
floating_po
int T>
291 const T scaled_epsilon =
max(
static_cast<T>(1.0),
max(
abs(x),
abs(y))) * epsilon_v<T>;
292 return abs(x - y) < scaled_epsilon;
296 template<std::
floating_po
int T>
311 template<std::
floating_po
int T,
size_t N>
318 template<std::
floating_po
int T>
321 return std::isnan(num);
325 template<std::
floating_po
int T,
size_t N>
328 return map(x, isnan<T>);
332 template<std::
floating_po
int T>
335 return std::log(num);
339 template<std::
floating_po
int T>
342 return std::pow(base, exp);
347 requires std::is_integral_v<T> or std::is_floating_point_v<T> or std::is_pointer_v<T>
350 return std::midpoint(a, b);
356 {
midpoint(x, y) } -> std::convertible_to<T>;
360 template<
typename T,
size_t N>
363 return map(x, y, [](
const T& xv,
const T& yv) {
return midpoint(xv, yv); });
368 std::ranges::range
R,
369 typename T =
typename std::ranges::range_value_t<R>::value_type,
370 size_t N = std::tuple_size_v<typename std::ranges::range_value_t<R>>
372 requires std::is_arithmetic_v<T>
375 return std::reduce(std::ranges::begin(r), std::ranges::end(r)) /
static_cast<T>(std::ranges::size(r));
379 template<
typename T,
size_t N>
380 requires std::is_arithmetic_v<T>
Definition common_functions.h:38
Definition common_functions.h:132
Definition common_functions.h:58
Definition common_functions.h:187
Definition common_functions.h:118
Definition common_functions.h:355
Definition common_functions.h:105
Definition common_functions.h:92
Definition common_functions.h:159
Definition common_functions.h:208
Definition common_functions.h:228
Definition custom_decoration_generator.h:5
bool equal_within_epsilon(T x, T y)
Definition common_functions.h:265
constexpr auto min(Angle< Rep1, Units1 > x, Angle< Rep2, Units2 > y) -> std::common_type_t< decltype(x), decltype(y)>
Definition angle.h:284
constexpr Angle< Rep, Units > clamp(const Angle< Rep, Units > &v, const AngleMin &min, const AngleMax &max)
Definition angle.h:320
constexpr auto map(const Rgba< T > &x, UnaryOperation op) -> Rgba< decltype(std::invoke(op, x[0]))>
Definition rgba.h:208
constexpr Vector3 centroid_of(const AABB &aabb)
Definition aabb_functions.h:22
bool equal_within_reldiff(T x, T y, T reldiff)
Definition common_functions.h:297
constexpr auto max(Angle< Rep1, Units1 > x, Angle< Rep2, Units2 > y) -> std::common_type_t< decltype(x), decltype(y)>
Definition angle.h:300
constexpr Vector< T, N > elementwise_clamp(const Vector< T, N > &v, const Vector< T, N > &lo, const Vector< T, N > &hi)
Definition common_functions.h:138
constexpr auto lerp(const Rgba< T > &x, const Rgba< T > &y, TInterpolant t)
Definition rgba.h:230
and LessThanComparable< T > bool equal_within_absdiff(T x, T y, T absdiff)
Definition common_functions.h:242
constexpr Rgba< T > saturate(const Rgba< T > &x)
Definition rgba.h:237
T abs(T num)
Definition common_functions.h:24
auto mod(Angle< Rep1, Units1 > x, Angle< Rep2, Units2 > y) -> std::common_type_t< decltype(x), decltype(y)>
Definition angle.h:268
T pow(T base, T exp)
Definition common_functions.h:340
or std::is_floating_point_v< T > or std::is_pointer_v< T > constexpr T midpoint(T a, T b)
Definition common_functions.h:348
bool equal_within_scaled_epsilon(T x, T y)
Definition common_functions.h:280
constexpr Vector< bool, N > elementwise_less(const Vector< T, N > &x, const Vector< T, N > &y)
Definition common_functions.h:214
bool isnan(T num)
Definition common_functions.h:319
constexpr Vector< bool, N > elementwise_equal(const Vector< T, N > &x, const Vector< T, N > &y)
Definition common_functions.h:201
constexpr Vector< T, N > elementwise_max(const Vector< T, N > &x, const Vector< T, N > &y)
Definition common_functions.h:125
constexpr Vector< T, N > elementwise_min(const Vector< T, N > &x, const Vector< T, N > &y)
Definition common_functions.h:111
and
Definition algorithms.h:158
T copysign(T mag, T sgn)
Definition common_functions.h:71
T floor(T num)
Definition common_functions.h:51
T log(T num)
Definition common_functions.h:333
constexpr Vector< bool, N > elementwise_less_equal(const Vector< T, N > &x, const Vector< T, N > &y)
Definition common_functions.h:234