diff options
author | 杨宇千 <crupest@outlook.com> | 2019-03-28 20:39:36 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-28 20:39:36 +0800 |
commit | c45a6e62298e972f5945f5f3461ed723aea80317 (patch) | |
tree | f46ef303ee87a8e3814ea8743bd7062d432bfee3 /src/util/math_util.hpp | |
parent | b028e74a48de181ca078ad3bf4ababf4fa146cd3 (diff) | |
parent | 37216f211b0e22205a3a0d3373d985fc68aea59b (diff) | |
download | cru-c45a6e62298e972f5945f5f3461ed723aea80317.tar.gz cru-c45a6e62298e972f5945f5f3461ed723aea80317.tar.bz2 cru-c45a6e62298e972f5945f5f3461ed723aea80317.zip |
Merge pull request #37 from crupest/render
Refactor.
Diffstat (limited to 'src/util/math_util.hpp')
-rw-r--r-- | src/util/math_util.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/util/math_util.hpp b/src/util/math_util.hpp new file mode 100644 index 00000000..01348641 --- /dev/null +++ b/src/util/math_util.hpp @@ -0,0 +1,51 @@ +#pragma once +#include "pre.hpp" + +#include <optional> +#include <type_traits> + +namespace cru::util { +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const std::optional<T> min, + const std::optional<T> max) { + if (min.has_value() && n < min.value()) return min.value(); + if (max.has_value() && n > max.value()) return max.value(); + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const T min, const T max) { + if (n < min) return min; + if (n > max) return max; + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const std::nullopt_t, const std::optional<T> max) { + if (max.has_value() && n > max.value()) return max.value(); + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const std::optional<T> min, const std::nullopt_t) { + if (min.has_value() && n < min.value()) return min.value(); + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const std::nullopt_t, const T max) { + if (n > max) return max; + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +float Coerce(const T n, const T min, const std::nullopt_t) { + if (n < min) return min; + return n; +} + +template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> +T AtLeast0(const T value) { + return value < static_cast<T>(0) ? static_cast<T>(0) : value; +} +} // namespace cru::util |