#pragma once #include "erased-constraints.hpp" #include #include #include #include namespace floormat::entities::constraints { template struct range { using limits = std::numeric_limits; T min = limits::min(), max = limits::max(); constexpr operator erased_constraints::range() const noexcept; constexpr operator std::pair() const noexcept; constexpr bool operator==(const range&) const noexcept = default; }; template range(T min, T max) -> range; template constexpr erased_constraints::range erased_range_from_range(T, T) { return { {}, {}, erased_constraints::range::type_none }; } template requires (std::is_floating_point_v && !std::is_integral_v) constexpr erased_constraints::range erased_range_from_range(T min, T max) { return { { .f = min }, { .f = max }, erased_constraints::range::type_::type_float }; } template requires (std::is_integral_v && std::is_unsigned_v && !std::is_floating_point_v) constexpr erased_constraints::range erased_range_from_range(T min, T max) { return { { .u = min }, { .u = max }, erased_constraints::range::type_::type_uint }; } template requires (std::is_integral_v && std::is_signed_v && !std::is_floating_point_v) constexpr erased_constraints::range erased_range_from_range(T min, T max) { return { { .i = min }, { .i = max }, erased_constraints::range::type_::type_int }; } template constexpr range::operator erased_constraints::range() const noexcept { return erased_range_from_range(min, max); } template constexpr range::operator std::pair() const noexcept { return { min, max }; } template<> struct range { constexpr operator erased_constraints::range() const noexcept { return {}; } }; using max_length = erased_constraints::max_length; } // namespace floormat::entities::constraints