File tree Expand file tree Collapse file tree 1 file changed +22
-3
lines changed
Expand file tree Collapse file tree 1 file changed +22
-3
lines changed Original file line number Diff line number Diff line change 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>
272273inline FASTFLOAT_CONSTEXPR14 bool
273274fastfloat_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 }
You can’t perform that action at this time.
0 commit comments