in cpp/src/arrow/util/trie_benchmark.cc [89:189]
static inline bool InlinedNullLookup(std::string_view s) {
// An inlined version of trie lookup for a specific set of strings
// (see AllNulls())
auto size = s.length();
auto data = s.data();
if (size == 0) {
return false;
}
if (size == 1) {
return false;
}
auto chars = reinterpret_cast<const char*>(data);
auto first = chars[0];
auto second = chars[1];
switch (first) {
case 'N': {
// "NA", "N/A", "NaN", "NULL"
if (size == 2) {
return second == 'A';
}
auto third = chars[2];
if (size == 3) {
return (second == '/' && third == 'A') || (second == 'a' && third == 'N');
}
if (size == 4) {
return (second == 'U' && third == 'L' && chars[3] == 'L');
}
return false;
}
case 'n': {
// "n/a", "nan", "null"
if (size == 2) {
return false;
}
auto third = chars[2];
if (size == 3) {
return (second == '/' && third == 'a') || (second == 'a' && third == 'n');
}
if (size == 4) {
return (second == 'u' && third == 'l' && chars[3] == 'l');
}
return false;
}
case '1': {
// '1.#IND', '1.#QNAN'
if (size == 6) {
// '#' is the most unlikely char here, check it first
return (chars[2] == '#' && chars[1] == '.' && chars[3] == 'I' &&
chars[4] == 'N' && chars[5] == 'D');
}
if (size == 7) {
return (chars[2] == '#' && chars[1] == '.' && chars[3] == 'Q' &&
chars[4] == 'N' && chars[5] == 'A' && chars[6] == 'N');
}
return false;
}
case '-': {
switch (second) {
case 'N':
// "-NaN"
return (size == 4 && chars[2] == 'a' && chars[3] == 'N');
case 'n':
// "-nan"
return (size == 4 && chars[2] == 'a' && chars[3] == 'n');
case '1':
// "-1.#IND", "-1.#QNAN"
if (size == 7) {
return (chars[3] == '#' && chars[2] == '.' && chars[4] == 'I' &&
chars[5] == 'N' && chars[6] == 'D');
}
if (size == 8) {
return (chars[3] == '#' && chars[2] == '.' && chars[4] == 'Q' &&
chars[5] == 'N' && chars[6] == 'A' && chars[7] == 'N');
}
return false;
default:
return false;
}
}
case '#': {
// "#N/A", "#N/A N/A", "#NA"
if (size < 3 || chars[1] != 'N') {
return false;
}
auto third = chars[2];
if (size == 3) {
return third == 'A';
}
if (size == 4) {
return third == '/' && chars[3] == 'A';
}
if (size == 8) {
return std::memcmp(data + 2, "/A N/A", 5) == 0;
}
return false;
}
default:
return false;
}
}