32 static_assert(std::is_integral_v<From>);
33 static_assert(std::is_integral_v<To>);
34 using FromLimits = std::numeric_limits<From>;
35 using ToLimits = std::numeric_limits<To>;
37 std::string_view overflow_type{};
39 if constexpr (ToLimits::digits < FromLimits::digits) {
40 if (input >
static_cast<From>(ToLimits::max())) {
41 overflow_type =
"positive";
47 if constexpr (FromLimits::is_signed && (!ToLimits::is_signed || ToLimits::digits < FromLimits::digits)) {
48 if (input <
static_cast<From>(ToLimits::lowest())) {
49 overflow_type =
"negative";
53 if (!overflow_type.empty()) {
54 throw std::runtime_error(fmt::format(
55 "Failed to convert {} {} into {} due to {} integer overflow",
57 static_cast<impl::PrintableValue<From>>(input),
63 return static_cast<To>(input);