mirror of
https://github.com/fastfloat/fast_float.git
synced 2025-12-06 16:56:57 +08:00
Adding fix for is_integer overflow.
This should avoid using unnecessarily sized unsigned types, while also avoiding overflow.
This commit is contained in:
parent
ee79fe6c7e
commit
d88299dd4c
@ -28,11 +28,20 @@ template <typename UC> fastfloat_really_inline constexpr bool has_simd_opt() {
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename value_type> struct get_equal_sized_uint {
|
||||
using type = std::conditional_t<
|
||||
sizeof(value_type) == 4, uint32_t,
|
||||
std::conditional_t<sizeof(value_type) == 2, uint16_t, uint8_t>>;
|
||||
};
|
||||
|
||||
template <typename value_type>
|
||||
using get_equal_sized_uint_t = typename get_equal_sized_uint<value_type>::type;
|
||||
|
||||
// Next function can be micro-optimized, but compilers are entirely
|
||||
// able to optimize it well.
|
||||
template <typename UC>
|
||||
fastfloat_really_inline constexpr bool is_integer(UC c) noexcept {
|
||||
return static_cast<uint8_t>(c - UC('0')) < 10;
|
||||
return static_cast<get_equal_sized_uint_t<UC>>(c - UC('0')) < 10;
|
||||
}
|
||||
|
||||
fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user