summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/maths.cpp12
-rw-r--r--lib/maths.h13
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/maths.cpp b/lib/maths.cpp
index ea245f0..f527881 100644
--- a/lib/maths.cpp
+++ b/lib/maths.cpp
@@ -116,6 +116,18 @@ normalize(float ang)
return ang;
}
+static_assert(pow(1, 0) == 1);
+static_assert(pow(1, 1) == 1);
+static_assert(pow(1, 2) == 1);
+static_assert(pow(2, 0) == 1);
+static_assert(pow(2, 1) == 2);
+static_assert(pow(2, 2) == 4);
+static_assert(pow(2, 3) == 8);
+static_assert(pow(3, 0) == 1);
+static_assert(pow(3, 1) == 3);
+static_assert(pow(3, 2) == 9);
+static_assert(pow(pi, 3) == 31.006278991699219F);
+
float
operator"" _mph(const long double v)
{
diff --git a/lib/maths.h b/lib/maths.h
index 32f2884..97b7ef5 100644
--- a/lib/maths.h
+++ b/lib/maths.h
@@ -261,6 +261,19 @@ midpoint(const std::pair<T, T> & v)
return std::midpoint(v.first, v.second);
}
+// std::pow is not constexpr
+template<typename T>
+ requires requires(T n) { n *= n; }
+constexpr inline T
+pow(const T base, std::integral auto exp)
+{
+ T res {1};
+ while (exp--) {
+ res *= base;
+ }
+ return res;
+}
+
// Conversions
template<typename T>
inline constexpr auto