From d1c04ea956d40ba3ccc4977b7427c1f4acae8597 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 19 Nov 2022 13:01:10 +0100 Subject: entity/contraints: fix clamping to T's range --- entity/constraints.hpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'entity') diff --git a/entity/constraints.hpp b/entity/constraints.hpp index 21d549c5..f629b149 100644 --- a/entity/constraints.hpp +++ b/entity/constraints.hpp @@ -1,8 +1,9 @@ #pragma once +#include #include #include +#include #include -#include #include namespace floormat::entities::erased_constraints { @@ -28,16 +29,23 @@ struct range final { template constexpr std::pair range::convert() const { + using std::size_t; + static_assert(sizeof(T) <= sizeof(size_t) || !std::is_integral_v); + + constexpr auto min_ = [](U a, U b) { return a < b ? a : b; }; + constexpr auto max_ = [](U a, U b) { return a > b ? a : b; }; using limits = std::numeric_limits; + constexpr auto lmin = limits::min(), lmax = limits::max(); + switch (type) { case type_float: if constexpr (limits::is_integer()) return { T(std::floor(min.f)), T(std::ceil(max.f)) }; else return { min.f, max.f }; - case type_uint: return { std::max(T(min.u), limits::min()), std::min(T(max.u), limits::max()) }; - case type_int: return { std::max(T(min.i), limits::min()), std::min(T(max.i), limits::max()) }; - default: case type_none: return { limits::min(), limits::max() }; + case type_uint: return { max_(T(min.u), lmin), T(min_(size_t(max.u), size_t(lmax))) }; + case type_int: return { max_(T(min.i), lmin), T(min_(size_t(max.i), size_t(lmax))) }; + default: case type_none: return { lmin, lmax }; } } -- cgit v1.2.3