diff --git a/include/fast_float/digit_comparison.h b/include/fast_float/digit_comparison.h index 3b76a62..456d9ea 100644 --- a/include/fast_float/digit_comparison.h +++ b/include/fast_float/digit_comparison.h @@ -62,7 +62,7 @@ scientific_exponent(parsed_number_string_t &num) noexcept { template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa to_extended(T value) noexcept { - using equiv_uint = typename binary_format::equiv_uint; + using equiv_uint = equiv_uint_t; constexpr equiv_uint exponent_mask = binary_format::exponent_mask(); constexpr equiv_uint mantissa_mask = binary_format::mantissa_mask(); constexpr equiv_uint hidden_bit_mask = binary_format::hidden_bit_mask(); diff --git a/include/fast_float/float_common.h b/include/fast_float/float_common.h index ebe7cfd..5e044b6 100644 --- a/include/fast_float/float_common.h +++ b/include/fast_float/float_common.h @@ -230,6 +230,14 @@ struct is_supported_float_type > { }; +template +using equiv_uint_t = typename std::conditional< + sizeof(T) == 1, uint8_t, + typename std::conditional< + sizeof(T) == 2, uint16_t, + typename std::conditional::type>::type>::type; + template struct is_supported_integer_type : std::is_integral {}; template @@ -413,8 +421,7 @@ constexpr uint64_t constant_55555 = 5 * 5 * 5 * 5 * 5; template struct binary_format_lookup_tables; template struct binary_format : binary_format_lookup_tables { - using equiv_uint = - typename std::conditional::type; + using equiv_uint = equiv_uint_t; static inline constexpr int mantissa_explicit_bits(); static inline constexpr int minimum_exponent(); @@ -694,11 +701,10 @@ binary_format::hidden_bit_mask() { template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void to_float(bool negative, adjusted_mantissa am, T &value) { - using fastfloat_uint = typename binary_format::equiv_uint; - fastfloat_uint word = (fastfloat_uint)am.mantissa; - word |= fastfloat_uint(am.power2) - << binary_format::mantissa_explicit_bits(); - word |= fastfloat_uint(negative) << binary_format::sign_index(); + using equiv_uint = equiv_uint_t; + equiv_uint word = equiv_uint(am.mantissa); + word |= equiv_uint(am.power2) << binary_format::mantissa_explicit_bits(); + word |= equiv_uint(negative) << binary_format::sign_index(); #if FASTFLOAT_HAS_BIT_CAST value = std::bit_cast(word); #else @@ -841,6 +847,21 @@ fastfloat_really_inline constexpr uint64_t min_safe_u64(int base) { return int_luts<>::min_safe_u64[base - 2]; } +static_assert(std::is_same, uint64_t>::value, + "equiv_uint should be uint64_t for double"); +static_assert(std::is_same, uint32_t>::value, + "equiv_uint should be uint32_t for float"); + +#ifdef __STDCPP_FLOAT64_T__ +static_assert(std::is_same, uint64_t>::value, + "equiv_uint should be uint64_t for std::float64_t"); +#endif + +#ifdef __STDCPP_FLOAT32_T__ +static_assert(std::is_same, uint32_t>::value, + "equiv_uint should be uint32_t for std::float32_t"); +#endif + constexpr chars_format operator~(chars_format rhs) noexcept { using int_type = std::underlying_type::type; return static_cast(~static_cast(rhs)); diff --git a/tests/basictest.cpp b/tests/basictest.cpp index 672a8d1..0b0950c 100644 --- a/tests/basictest.cpp +++ b/tests/basictest.cpp @@ -729,8 +729,7 @@ constexpr void check_basic_test_result(stringtype str, result_type result, auto copysign = [](double x, double y) -> double { #if FASTFLOAT_HAS_BIT_CAST if (fast_float::cpp20_and_in_constexpr()) { - using equiv_int = std::make_signed_t< - typename fast_float::binary_format::equiv_uint>; + using equiv_int = std::make_signed_t>; auto const i = std::bit_cast(y); if (i < 0) { return -x;