Skip to content

Commit 265cb84

Browse files
committed
optimise fastfloat_strncasecmp
1 parent 11ce67e commit 265cb84

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

include/fast_float/float_common.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define FASTFLOAT_FLOAT_COMMON_H
33

44
#include <cfloat>
5+
#include <cstddef>
56
#include <cstdint>
67
#include <cassert>
78
#include <cstring>
@@ -272,9 +273,27 @@ template <typename UC>
272273
inline FASTFLOAT_CONSTEXPR14 bool
273274
fastfloat_strncasecmp(UC const *actual_mixedcase, UC const *expected_lowercase,
274275
size_t length) {
275-
for (size_t i = 0; i < length; ++i) {
276-
UC const actual = actual_mixedcase[i];
277-
if ((actual < 256 ? actual | 32 : actual) != expected_lowercase[i]) {
276+
uint64_t mask{0};
277+
FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 1) { mask = 0x2020202020202020; }
278+
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 2) {
279+
mask = 0x0020002000200020;
280+
}
281+
else FASTFLOAT_IF_CONSTEXPR17(sizeof(UC) == 4) {
282+
mask = 0x0000002000000020;
283+
}
284+
else {
285+
return false;
286+
}
287+
uint64_t val1{0}, val2{0};
288+
size_t sz{8 / (sizeof(UC))};
289+
for (size_t i = 0; i < length; i += sz) {
290+
val1 = val2 = 0;
291+
sz = std::min(sz, length - i);
292+
::memcpy(&val1, actual_mixedcase + i, sz * sizeof(UC));
293+
::memcpy(&val2, expected_lowercase + i, sz * sizeof(UC));
294+
val1 |= mask;
295+
val2 |= mask;
296+
if (val1 != val2) {
278297
return false;
279298
}
280299
}

0 commit comments

Comments
 (0)