mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-02-09 11:16:45 +08:00
review of the fastfloat_strncasecmp3 fastfloat_strncasecmp5 fastfloat_strncasecmp and parse_infnan
This commit is contained in:
parent
3b7dc1e0d7
commit
f9e222083a
@ -334,7 +334,7 @@ fastfloat_strncasecmp3(UC const *actual_mixedcase,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint64_t val1, val2;
|
uint64_t val1{0}, val2{0};
|
||||||
uint64_t mask;
|
uint64_t mask;
|
||||||
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) { mask = 0x2020202020202020; }
|
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) { mask = 0x2020202020202020; }
|
||||||
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 2) {
|
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 2) {
|
||||||
@ -344,15 +344,15 @@ fastfloat_strncasecmp3(UC const *actual_mixedcase,
|
|||||||
mask = 0x0000002000000020;
|
mask = 0x0000002000000020;
|
||||||
}
|
}
|
||||||
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1 || sizeof(UC) == 2) {
|
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1 || sizeof(UC) == 2) {
|
||||||
std::memcpy(&val1, actual_mixedcase, 3 * sizeof(UC));
|
::memcpy(&val1, actual_mixedcase, 3 * sizeof(UC));
|
||||||
std::memcpy(&val2, expected_lowercase, 3 * sizeof(UC));
|
::memcpy(&val2, expected_lowercase, 3 * sizeof(UC));
|
||||||
val1 |= mask;
|
val1 |= mask;
|
||||||
val2 |= mask;
|
val2 |= mask;
|
||||||
return val1 == val2;
|
return val1 == val2;
|
||||||
}
|
}
|
||||||
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 4) {
|
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 4) {
|
||||||
std::memcpy(&val1, actual_mixedcase, 2 * sizeof(UC));
|
::memcpy(&val1, actual_mixedcase, 2 * sizeof(UC));
|
||||||
std::memcpy(&val2, expected_lowercase, 2 * sizeof(UC));
|
::memcpy(&val2, expected_lowercase, 2 * sizeof(UC));
|
||||||
val1 |= mask;
|
val1 |= mask;
|
||||||
if (val1 != val2) {
|
if (val1 != val2) {
|
||||||
return false;
|
return false;
|
||||||
@ -378,7 +378,7 @@ fastfloat_strncasecmp5(UC const *actual_mixedcase,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint64_t val1, val2;
|
uint64_t val1{0}, val2{0};
|
||||||
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) {
|
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) {
|
||||||
constexpr uint64_t mask = 0x2020202020202020;
|
constexpr uint64_t mask = 0x2020202020202020;
|
||||||
std::memcpy(&val1, actual_mixedcase, 5 * sizeof(UC));
|
std::memcpy(&val1, actual_mixedcase, 5 * sizeof(UC));
|
||||||
@ -413,9 +413,6 @@ fastfloat_strncasecmp5(UC const *actual_mixedcase,
|
|||||||
}
|
}
|
||||||
return (actual_mixedcase[4] | 32) == (expected_lowercase[4]);
|
return (actual_mixedcase[4] | 32) == (expected_lowercase[4]);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -433,6 +430,7 @@ fastfloat_strncasecmp(UC const *actual_mixedcase, UC const *expected_lowercase,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
uint64_t val1{0}, val2{0};
|
||||||
uint64_t mask;
|
uint64_t mask;
|
||||||
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) { mask = 0x2020202020202020; }
|
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) { mask = 0x2020202020202020; }
|
||||||
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 2) {
|
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 2) {
|
||||||
@ -441,16 +439,12 @@ fastfloat_strncasecmp(UC const *actual_mixedcase, UC const *expected_lowercase,
|
|||||||
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 4) {
|
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 4) {
|
||||||
mask = 0x0000002000000020;
|
mask = 0x0000002000000020;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
constexpr uint_fast8_t sz{8 / (sizeof(UC))};
|
constexpr uint_fast8_t sz{8 / (sizeof(UC))};
|
||||||
for (uint_fast8_t i = 0; i != length; i += sz) {
|
for (uint_fast8_t i = 0; i < length; i += sz) {
|
||||||
uint64_t val1{0};
|
val1 = val2 = 0;
|
||||||
uint64_t val2{0};
|
|
||||||
sz = std::min(sz, length - i);
|
sz = std::min(sz, length - i);
|
||||||
::memcpy(&val1, actual_mixedcase + i, sz * sizeof(UC));
|
std::memcpy(&val1, actual_mixedcase + i, sz * sizeof(UC));
|
||||||
::memcpy(&val2, expected_lowercase + i, sz * sizeof(UC));
|
std::memcpy(&val2, expected_lowercase + i, sz * sizeof(UC));
|
||||||
val1 |= mask;
|
val1 |= mask;
|
||||||
val2 |= mask;
|
val2 |= mask;
|
||||||
if (val1 != val2) {
|
if (val1 != val2) {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ namespace fast_float {
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
#ifndef FASTFLOAT_ONLY_POSITIVE_C_NUMBER_WO_INF_NAN
|
#ifndef FASTFLOAT_ONLY_POSITIVE_C_NUMBER_WO_INF_NAN
|
||||||
/**
|
/**
|
||||||
* Special case +inf, -inf, nan, infinity, -infinity.
|
* Special case inf, +inf, -inf, nan, infinity, -infinity.
|
||||||
* The case comparisons could be made much faster given that we know that the
|
* The case comparisons could be made much faster given that we know that the
|
||||||
* strings a null-free and fixed.
|
* strings a null-free and fixed.
|
||||||
**/
|
**/
|
||||||
@ -46,7 +46,7 @@ from_chars_result_t<UC>
|
|||||||
// Check for possible nan(n-char-seq-opt), C++17 20.19.3.7,
|
// Check for possible nan(n-char-seq-opt), C++17 20.19.3.7,
|
||||||
// C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan).
|
// C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan).
|
||||||
if (first != last && *first == UC('(')) {
|
if (first != last && *first == UC('(')) {
|
||||||
for (UC const *ptr = first + 1; ptr != last; ++ptr) {
|
for (auto const *ptr = first + 1; ptr != last; ++ptr) {
|
||||||
if (*ptr == UC(')')) {
|
if (*ptr == UC(')')) {
|
||||||
answer.ptr = ptr + 1; // valid nan(n-char-seq-opt)
|
answer.ptr = ptr + 1; // valid nan(n-char-seq-opt)
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user