mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-02-06 09:49:52 +08:00
optimization for the report_parse_error.
This commit is contained in:
parent
054004f779
commit
ebc2ee8ceb
@ -277,8 +277,8 @@ using parsed_number_string = parsed_number_string_t<char>;
|
|||||||
|
|
||||||
template <typename UC>
|
template <typename UC>
|
||||||
fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t<UC>
|
fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t<UC>
|
||||||
report_parse_error(UC const *p, parse_error error) noexcept {
|
report_parse_error(parsed_number_string_t<UC> &answer, UC const *p,
|
||||||
parsed_number_string_t<UC> answer;
|
parse_error error) noexcept {
|
||||||
answer.invalid = true;
|
answer.invalid = true;
|
||||||
answer.lastmatch = p;
|
answer.lastmatch = p;
|
||||||
answer.error = error;
|
answer.error = error;
|
||||||
@ -303,12 +303,12 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
++p;
|
++p;
|
||||||
if (p == pend) {
|
if (p == pend) {
|
||||||
return report_parse_error<UC>(
|
return report_parse_error<UC>(
|
||||||
p, parse_error::missing_integer_or_dot_after_sign);
|
answer, p, parse_error::missing_integer_or_dot_after_sign);
|
||||||
}
|
}
|
||||||
FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) {
|
FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) {
|
||||||
// a sign must be followed by an integer
|
// a sign must be followed by an integer
|
||||||
if (!is_integer(*p)) {
|
if (!is_integer(*p)) {
|
||||||
return report_parse_error<UC>(p,
|
return report_parse_error<UC>(answer, p,
|
||||||
parse_error::missing_integer_after_sign);
|
parse_error::missing_integer_after_sign);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -316,7 +316,7 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
// a sign must be followed by an integer or the dot
|
// a sign must be followed by an integer or the dot
|
||||||
if (!is_integer(*p) && (*p != options.decimal_point)) {
|
if (!is_integer(*p) && (*p != options.decimal_point)) {
|
||||||
return report_parse_error<UC>(
|
return report_parse_error<UC>(
|
||||||
p, parse_error::missing_integer_or_dot_after_sign);
|
answer, p, parse_error::missing_integer_or_dot_after_sign);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,10 +343,11 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) {
|
FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) {
|
||||||
// at least 1 digit in integer part, without leading zeros
|
// at least 1 digit in integer part, without leading zeros
|
||||||
if (digit_count == 0) {
|
if (digit_count == 0) {
|
||||||
return report_parse_error<UC>(p, parse_error::no_digits_in_integer_part);
|
return report_parse_error<UC>(answer, p,
|
||||||
|
parse_error::no_digits_in_integer_part);
|
||||||
}
|
}
|
||||||
if ((start_digits[0] == UC('0') && digit_count > 1)) {
|
if ((start_digits[0] == UC('0') && digit_count > 1)) {
|
||||||
return report_parse_error<UC>(start_digits,
|
return report_parse_error<UC>(answer, start_digits,
|
||||||
parse_error::leading_zeros_in_integer_part);
|
parse_error::leading_zeros_in_integer_part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -376,13 +377,14 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
// at least 1 digit in fractional part
|
// at least 1 digit in fractional part
|
||||||
if (answer.exponent == 0) {
|
if (answer.exponent == 0) {
|
||||||
return report_parse_error<UC>(
|
return report_parse_error<UC>(
|
||||||
p, parse_error::no_digits_in_fractional_part);
|
answer, p, parse_error::no_digits_in_fractional_part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (digit_count == 0) {
|
} else if (digit_count == 0) {
|
||||||
// We must have encountered at least one integer!
|
// We must have encountered at least one integer!
|
||||||
return report_parse_error<UC>(p, parse_error::no_digits_in_mantissa);
|
return report_parse_error<UC>(answer, p,
|
||||||
|
parse_error::no_digits_in_mantissa);
|
||||||
}
|
}
|
||||||
// We have now parsed the integer and the fraction part of the mantissa.
|
// We have now parsed the integer and the fraction part of the mantissa.
|
||||||
|
|
||||||
@ -425,7 +427,8 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
// The exponential part is invalid for scientific notation, so it
|
// The exponential part is invalid for scientific notation, so it
|
||||||
// must be a trailing token for fixed notation. However, fixed
|
// must be a trailing token for fixed notation. However, fixed
|
||||||
// notation is disabled, so report a scientific notation error.
|
// notation is disabled, so report a scientific notation error.
|
||||||
return report_parse_error<UC>(p, parse_error::missing_exponential_part);
|
return report_parse_error<UC>(answer, p,
|
||||||
|
parse_error::missing_exponential_part);
|
||||||
}
|
}
|
||||||
// Otherwise, we will be ignoring the 'e'.
|
// Otherwise, we will be ignoring the 'e'.
|
||||||
p = location_of_e;
|
p = location_of_e;
|
||||||
@ -448,7 +451,8 @@ parse_number_string(UC const *p, UC const *pend,
|
|||||||
// If it scientific and not fixed, we have to bail out.
|
// If it scientific and not fixed, we have to bail out.
|
||||||
if ((chars_format_t(options.format & chars_format::scientific)) &&
|
if ((chars_format_t(options.format & chars_format::scientific)) &&
|
||||||
!(chars_format_t(options.format & chars_format::fixed))) {
|
!(chars_format_t(options.format & chars_format::fixed))) {
|
||||||
return report_parse_error<UC>(p, parse_error::missing_exponential_part);
|
return report_parse_error<UC>(answer, p,
|
||||||
|
parse_error::missing_exponential_part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user