mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-02-07 18:26:45 +08:00
- Add SIMD acceleration to fast_int
- fix MSVC warning
This commit is contained in:
parent
26a5b2eb16
commit
bdee16bcad
@ -7,7 +7,6 @@
|
|||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <charconv>
|
|
||||||
|
|
||||||
#include "float_common.h"
|
#include "float_common.h"
|
||||||
|
|
||||||
@ -472,6 +471,9 @@ from_chars_result_t<UC> parse_int_string(UC const* p, UC const* pend, T& value,
|
|||||||
UC const* const start_digits = p;
|
UC const* const start_digits = p;
|
||||||
|
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
|
if (base == 10) {
|
||||||
|
loop_parse_if_eight_digits(p, pend, i); // use SIMD if possible
|
||||||
|
}
|
||||||
while (p != pend) {
|
while (p != pend) {
|
||||||
uint8_t digit = ch_to_digit(*p);
|
uint8_t digit = ch_to_digit(*p);
|
||||||
if (digit >= base) {
|
if (digit >= base) {
|
||||||
@ -519,11 +521,18 @@ from_chars_result_t<UC> parse_int_string(UC const* p, UC const* pend, T& value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (negative) {
|
if (negative) {
|
||||||
|
#ifdef FASTFLOAT_VISUAL_STUDIO
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable: 4146)
|
||||||
|
#endif
|
||||||
// this weird workaround is required because:
|
// this weird workaround is required because:
|
||||||
// - converting unsigned to signed when its value is greater than signed max is UB pre-C++23.
|
// - converting unsigned to signed when its value is greater than signed max is UB pre-C++23.
|
||||||
// - reinterpret_casting (~i + 1) would work, but it is not constexpr
|
// - reinterpret_casting (~i + 1) would work, but it is not constexpr
|
||||||
// this is always optimized into a neg instruction.
|
// this is always optimized into a neg instruction.
|
||||||
value = T(-std::numeric_limits<T>::max() - T(i - std::numeric_limits<T>::max()));
|
value = T(-std::numeric_limits<T>::max() - T(i - std::numeric_limits<T>::max()));
|
||||||
|
#ifdef FASTFLOAT_VISUAL_STUDIO
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else value = T(i);
|
else value = T(i);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user