summaryrefslogtreecommitdiffhomepage
path: root/compat/math.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2018-01-18 19:35:08 +0100
committerStanislaw Halik <sthalik@misaki.pl>2018-01-18 19:35:29 +0100
commitd361f57c8064ce13a0478653050b169dc94e2e99 (patch)
tree73613b75bc4e6533455b6c3ad79c3fa39b8554fb /compat/math.hpp
parent2ab18fd01bc7c46043429511a3801846b998c749 (diff)
compat/util: retire
Adjust usages.
Diffstat (limited to 'compat/math.hpp')
-rw-r--r--compat/math.hpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/compat/math.hpp b/compat/math.hpp
new file mode 100644
index 00000000..5d80dace
--- /dev/null
+++ b/compat/math.hpp
@@ -0,0 +1,74 @@
+#pragma once
+
+#include "macros.hpp"
+
+#include <cmath>
+#include <type_traits>
+
+namespace util_detail {
+
+template<typename n>
+inline auto clamp_float(n val, n min_, n max_)
+{
+ return std::fmin(std::fmax(val, min_), max_);
+}
+
+template<typename t, typename n>
+struct clamp final
+{
+ static inline auto clamp_(const n& val, const n& min_, const n& max_)
+ {
+ if (unlikely(val > max_))
+ return max_;
+ if (unlikely(val < min_))
+ return min_;
+ return val;
+ }
+};
+
+template<typename t>
+struct clamp<float, t>
+{
+ static inline auto clamp_(float val, float min_, float max_)
+ {
+ return clamp_float(val, min_, max_);
+ }
+};
+
+template<typename t>
+struct clamp<double, t>
+{
+ static inline auto clamp_(double val, double min_, double max_)
+ {
+ return clamp_float(val, min_, max_);
+ }
+};
+
+} // ns util_detail
+
+template<typename t, typename u, typename w>
+inline auto clamp(const t& val, const u& min, const w& max)
+{
+ using tp = decltype(val + min + max);
+ return ::util_detail::clamp<std::decay_t<tp>, tp>::clamp_(val, min, max);
+}
+
+template<typename t>
+inline int iround(const t& val)
+{
+ return int(std::round(val));
+}
+
+template<typename t>
+inline unsigned uround(const t& val)
+{
+ return std::round(std::fmax(t(0), val));
+}
+
+#include "macros.hpp"
+
+template <typename T>
+static force_inline constexpr auto signum(T x)
+{
+ return x < T(0) ? -1 : 1;
+}