feat: might_store_converted_common_value added to detect conversions overflowing rep

Resolves #670, resolves #671, resolves #658, resolves #303
This commit is contained in:
Mateusz Pusz
2025-02-06 15:28:55 +01:00
parent e5d2b95a1b
commit 5d4e1aa740
5 changed files with 74 additions and 7 deletions

View File

@ -278,4 +278,9 @@ static_assert(compare(kind_of<isq::time>(inverse<s>(1. * kHz)), 0.001 * s));
// check if constraints work properly for a derived unit of a narrowed kind
static_assert(compare(kind_of<isq::frequency>(inverse<Hz>(1 * s)), 1 * Hz));
// overflow in conversion
template<auto Q>
concept overflowing_inverse = requires { requires !requires { inverse<si::hertz>(Q); }; };
static_assert(overflowing_inverse<10'000'000 * si::femto<si::second>>);
} // namespace

View File

@ -1364,4 +1364,20 @@ static_assert(!QuantityOf<decltype(10 * isq::width[m]), isq::height>);
static_assert(QuantityOf<decltype(10 * isq::speed[m / s]), isq::speed>);
static_assert(QuantityOf<decltype(20 * isq::length[m] / (2 * isq::time[s])), isq::speed>); // derived unnamed quantity
// overflowing unit conversions
template<auto Q>
concept overflowing_unit_conversion = requires {
requires !requires { quantity<si::metre, std::int8_t>(Q); };
requires !requires { quantity<si::milli<si::metre>, std::int16_t>(Q); };
requires !requires { Q.in(si::metre); };
requires !requires { Q.force_in(si::metre); };
requires !requires { Q + std::int8_t(1) * nm; }; // promotion to int
requires !requires { Q - std::int8_t(1) * nm; }; // promotion to int
requires !requires { Q % std::int8_t(1) * m; };
requires !requires { Q == std::int8_t(1) * m; };
requires !requires { Q < std::int8_t(1) * m; };
requires !requires { typename std::common_type_t<decltype(Q), quantity<si::metre, std::int8_t>>; };
};
static_assert(overflowing_unit_conversion<std::int8_t(1) * km>);
} // namespace