mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-06-15 08:26:08 +08:00
adressing comments by @jwakely
This commit is contained in:
parent
b72e07132c
commit
520fded4a3
@ -203,15 +203,27 @@ using parse_options = parse_options_t<char>;
|
|||||||
// the hot frame and hurt ILP on some targets). Used at the call site as
|
// the hot frame and hurt ILP on some targets). Used at the call site as
|
||||||
// if fastfloat_unlikely(cond) { ... }
|
// if fastfloat_unlikely(cond) { ... }
|
||||||
// (the macro supplies the parentheses). It expands to the standard [[unlikely]]
|
// (the macro supplies the parentheses). It expands to the standard [[unlikely]]
|
||||||
// attribute in C++20 or newer, otherwise to __builtin_expect on GCC/Clang, or
|
// attribute when supported, otherwise to __builtin_expect on GCC/Clang, or
|
||||||
// to a no-op elsewhere (e.g. pre-C++20 MSVC, which has no equivalent hint).
|
// to a no-op elsewhere (e.g. pre-C++20 MSVC, which has no equivalent hint).
|
||||||
// The [[unlikely]] branch is gated on the language version, not just on
|
#ifdef __has_cpp_attribute
|
||||||
// __has_cpp_attribute: GCC and Clang report the attribute as available even
|
#if __has_cpp_attribute(unlikely) >= 201803L
|
||||||
// under -std=c++17, where using it would trip -Wc++20-extensions/-Werror.
|
#define FASTFLOAT_USE_UNLIKELY_ATTR 1
|
||||||
#if (__cplusplus >= 202002L || \
|
#endif
|
||||||
(defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)) && \
|
#endif
|
||||||
defined(__has_cpp_attribute) && __has_cpp_attribute(unlikely) >= 201803L
|
|
||||||
|
#ifdef FASTFLOAT_USE_UNLIKELY_ATTR
|
||||||
|
// We have to disable -Wc++20-extensions for the [[unlikely]] attribute
|
||||||
|
// See comment for @jwakely at
|
||||||
|
// https://github.com/fastfloat/fast_float/pull/387#discussion_r3366943539
|
||||||
|
// This is unfortunate.
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wc++20-extensions"
|
||||||
|
#endif
|
||||||
#define fastfloat_unlikely(x) (x) [[unlikely]]
|
#define fastfloat_unlikely(x) (x) [[unlikely]]
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
#elif defined(__GNUC__) || defined(__clang__)
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
#define fastfloat_unlikely(x) (__builtin_expect(!!(x), 0))
|
#define fastfloat_unlikely(x) (__builtin_expect(!!(x), 0))
|
||||||
#else
|
#else
|
||||||
|
|||||||
@ -351,6 +351,10 @@ from_chars_float_advanced(UC const *first, UC const *last, T &value,
|
|||||||
// Slow path A (rare): > 19 significant digits. The no-span parse left the
|
// Slow path A (rare): > 19 significant digits. The no-span parse left the
|
||||||
// mantissa un-truncated and skipped the span-based recompute; the cold helper
|
// mantissa un-truncated and skipped the span-based recompute; the cold helper
|
||||||
// re-parses with spans and runs the full algorithm.
|
// re-parses with spans and runs the full algorithm.
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wc++20-extensions"
|
||||||
|
#endif
|
||||||
if fastfloat_unlikely (pns.too_many_digits) {
|
if fastfloat_unlikely (pns.too_many_digits) {
|
||||||
return parse_number_slow_path<T, UC>(first, last, value, options, bjf);
|
return parse_number_slow_path<T, UC>(first, last, value, options, bjf);
|
||||||
}
|
}
|
||||||
@ -371,6 +375,9 @@ from_chars_float_advanced(UC const *first, UC const *last, T &value,
|
|||||||
if fastfloat_unlikely (am.power2 < 0) {
|
if fastfloat_unlikely (am.power2 < 0) {
|
||||||
return parse_number_slow_path<T, UC>(first, last, value, options, bjf);
|
return parse_number_slow_path<T, UC>(first, last, value, options, bjf);
|
||||||
}
|
}
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
to_float(pns.negative, am, value);
|
to_float(pns.negative, am, value);
|
||||||
// Test for over/underflow.
|
// Test for over/underflow.
|
||||||
if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) ||
|
if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) ||
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user