soo
3D game math library
Loading...
Searching...
No Matches
util.h
1// By notchcamo.
2
3#pragma once
4
5#include <limits>
6
10namespace soo::util
11{
15 constexpr double DEFAULT_TOLERANCE = 1e-8;
16
21 template <typename T>
22 requires std::is_arithmetic_v<T>
23 bool isEqual(const T a, const T b, const T tolerance = DEFAULT_TOLERANCE)
24 {
25 return std::abs(a - b) <= tolerance;
26 }
27
33 template <std::ranges::range Range>
34 requires std::is_arithmetic_v<std::ranges::range_value_t<Range>>
35 bool isEqual(const Range& a, const Range& b, const std::ranges::range_value_t<Range> tolerance = DEFAULT_TOLERANCE)
36 {
37 const auto distA = std::distance(std::cbegin(a), std::cend(a));
38 const auto distB = std::distance(std::cbegin(b), std::cend(b));
39 if (distA != distB)
40 {
41 return false;
42 }
43
44 auto iterA = std::cbegin(a);
45 auto iterB = std::cbegin(b);
46 while (iterA != std::cend(a))
47 {
48 if (!isEqual(*iterA, *iterB, tolerance))
49 {
50 return false;
51 }
52
53 ++iterA;
54 ++iterB;
55 }
56
57 return true;
58 }
59
64 template <typename T>
65 requires std::is_arithmetic_v<T>
66 bool isZero(const T num, const T tolerance = DEFAULT_TOLERANCE)
67 {
68 return isEqual(num, static_cast<T>(0), tolerance);
69 }
70
79 template <typename T, std::floating_point FP>
80 T lerp(const T a, const T b, const FP alpha)
81 {
82 if (alpha < FP(0) || alpha > FP(1))
83 {
84 throw std::invalid_argument(
85 "The alpha must be ranged from 0 to 1, but given value is " + std::to_string(alpha)
86 );
87 }
88
89 return a * (FP(1) - alpha) + b * alpha;
90 }
91} // namespace soo::util.
Namespace for utility functions.
Definition util.h:11
bool isZero(const T num, const T tolerance=DEFAULT_TOLERANCE)
Definition util.h:66
T lerp(const T a, const T b, const FP alpha)
Definition util.h:80
bool isEqual(const T a, const T b, const T tolerance=DEFAULT_TOLERANCE)
Definition util.h:23
constexpr double DEFAULT_TOLERANCE
Definition util.h:15