From cf6c2ba03d9029a064f624bcbad227259e02276a Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 19 Nov 2022 13:44:11 +0100 Subject: entity: move out erased constraints --- entity/constraints.hpp | 55 +-------------------------------------- entity/erased-constraints.hpp | 60 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 54 deletions(-) create mode 100644 entity/erased-constraints.hpp diff --git a/entity/constraints.hpp b/entity/constraints.hpp index 248a8422..3e106f21 100644 --- a/entity/constraints.hpp +++ b/entity/constraints.hpp @@ -1,4 +1,5 @@ #pragma once +#include "erased-constraints.hpp" #include #include #include @@ -6,60 +7,6 @@ #include #include -namespace floormat::entities::erased_constraints { - -static_assert(sizeof(std::size_t) == sizeof(std::uintptr_t)); -static_assert(sizeof(std::size_t) == sizeof(std::ptrdiff_t)); - -struct range final -{ - using U = std::size_t; - using I = std::make_signed_t; - enum type_ : unsigned char { type_none, type_float, type_uint, type_int, }; - union element { - float f; - U u; - I i; - }; - - element min {.i = 0}, max {.i = 0}; - type_ type = type_none; - - template constexpr std::pair convert() const; -}; - -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 { 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 }; - } -} - -struct length final { - std::size_t value = std::numeric_limits::max(); -}; - -struct group final { - StringView group_name; -}; - -} // namespace floormat::entities::erased_constraints - namespace floormat::entities::constraints { template struct range diff --git a/entity/erased-constraints.hpp b/entity/erased-constraints.hpp new file mode 100644 index 00000000..4f1262f1 --- /dev/null +++ b/entity/erased-constraints.hpp @@ -0,0 +1,60 @@ +#pragma once +#include +#include + +namespace floormat::entities::erased_constraints { + +static_assert(sizeof(std::size_t) == sizeof(std::uintptr_t)); +static_assert(sizeof(std::size_t) == sizeof(std::ptrdiff_t)); + +struct range final +{ + using U = std::size_t; + using I = std::make_signed_t; + enum type_ : unsigned char { type_none, type_float, type_uint, type_int, }; + union element { + float f; + U u; + I i; + }; + + element min {.i = 0}, max {.i = 0}; + type_ type = type_none; + + template constexpr std::pair convert() const; +}; + +template constexpr std::pair range::convert() const +{ + if constexpr (!std::is_floating_point_v && !std::is_integral_v) + return {{}, {}}; + + using std::size_t; + static_assert(sizeof(T) <= sizeof(size_t) || !std::is_integral_v); + + constexpr auto min_ = [](V a, V b) { return a < b ? a : b; }; + constexpr auto max_ = [](V a, V 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 { T(min.f), T(max.f) }; + 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 }; + } +} + +struct length final { + std::size_t value = std::numeric_limits::max(); +}; + +struct group final { + StringView group_name; +}; + +} // namespace floormat::entities::erased_constraints -- cgit v1.2.3