1#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ATOMPARSING_H
5#include "simdjson/generic/base.h"
6#include "simdjson/generic/jsoncharutils.h"
12namespace SIMDJSON_IMPLEMENTATION {
15namespace atomparsing {
23simdjson_inline uint32_t string_to_uint32(
const char* str) { uint32_t val; std::memcpy(&val, str,
sizeof(uint32_t));
return val; }
26simdjson_inline uint64_t string_to_uint64(
const char* str) { uint64_t val; std::memcpy(&val, str,
sizeof(uint64_t));
return val; }
32simdjson_inline uint32_t str4ncmp(
const uint8_t *src,
const char* atom) {
34 static_assert(
sizeof(uint32_t) <=
SIMDJSON_PADDING,
"SIMDJSON_PADDING must be larger than 4 bytes");
35 std::memcpy(&srcval, src,
sizeof(uint32_t));
36 return srcval ^ string_to_uint32(atom);
43simdjson_inline uint64_t str8ncmp_case_insensitive(
const uint8_t *src,
const char* atom) {
45 static_assert(
sizeof(uint64_t) <=
SIMDJSON_PADDING,
"SIMDJSON_PADDING must be larger than 8 bytes");
46 std::memcpy(&srcval, src,
sizeof(uint64_t));
48 return (srcval | 0x2020202020202020ull) ^ string_to_uint64(atom);
55simdjson_inline uint32_t str3ncmp_case_insensitive(
const uint8_t *src,
const char* atom) {
56 return ((src[0] | 0x20) ^ atom[0])
57 | ((src[1] | 0x20) ^ atom[1])
58 | ((src[2] | 0x20) ^ atom[2]);
62simdjson_inline
bool is_valid_true_atom(
const uint8_t *src) {
63 return (str4ncmp(src,
"true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
67simdjson_inline
bool is_valid_true_atom(
const uint8_t *src,
size_t len) {
68 if (len > 4) {
return is_valid_true_atom(src); }
69 else if (len == 4) {
return !str4ncmp(src,
"true"); }
70 else {
return false; }
74simdjson_inline
bool is_valid_false_atom(
const uint8_t *src) {
75 return (str4ncmp(src+1,
"alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
79simdjson_inline
bool is_valid_false_atom(
const uint8_t *src,
size_t len) {
80 if (len > 5) {
return is_valid_false_atom(src); }
81 else if (len == 5) {
return !str4ncmp(src+1,
"alse"); }
82 else {
return false; }
86simdjson_inline
bool is_valid_null_atom(
const uint8_t *src) {
87 return (str4ncmp(src,
"null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
91simdjson_inline
bool is_valid_null_atom(
const uint8_t *src,
size_t len) {
92 if (len > 4) {
return is_valid_null_atom(src); }
93 else if (len == 4) {
return !str4ncmp(src,
"null"); }
94 else {
return false; }
97#if SIMDJSON_ENABLE_NAN_INF
101simdjson_inline
bool is_valid_nan_atom(
const uint8_t *src) {
102 return (str3ncmp_case_insensitive(src,
"nan")
103 | jsoncharutils::is_not_structural_or_whitespace(src[3])) == 0;
109simdjson_inline
bool is_valid_nan_in_string(
const uint8_t *src) {
110 return (str3ncmp_case_insensitive(src,
"nan") | (src[3] ^
'"')) == 0;
114simdjson_inline
bool is_valid_nan_atom(
const uint8_t *src,
size_t len) {
115 if (len > 3) {
return is_valid_nan_atom(src); }
116 if (len == 3) {
return str3ncmp_case_insensitive(src,
"nan") == 0; }
125simdjson_inline
bool is_valid_inf_atom(
const uint8_t *src) {
126 bool is_short_inf = (str3ncmp_case_insensitive(src,
"inf")
127 | jsoncharutils::is_not_structural_or_whitespace(src[3])) == 0;
128 if(is_short_inf)
return true;
131 return (str8ncmp_case_insensitive(src,
"infinity") | jsoncharutils::is_not_structural_or_whitespace(src[8])) == 0;
135simdjson_inline
bool is_valid_inf_in_string(
const uint8_t *src) {
136 bool is_short_inf = (str3ncmp_case_insensitive(src,
"inf") | (src[3] ^
'"')) == 0;
137 if(is_short_inf)
return true;
139 return (str8ncmp_case_insensitive(src,
"infinity") | (src[8] ^
'"')) == 0;
148simdjson_inline
bool is_valid_inf_atom(
const uint8_t *src,
size_t len) {
149 if (len > 8) {
return is_valid_inf_atom(src); }
150 if (len == 8 && str8ncmp_case_insensitive(src,
"infinity") == 0) {
154 return (str3ncmp_case_insensitive(src,
"inf")
155 | jsoncharutils::is_not_structural_or_whitespace(src[3])) == 0;
157 if (len == 3) {
return str3ncmp_case_insensitive(src,
"inf") == 0; }
The top level simdjson namespace, containing everything the library provides.
constexpr size_t SIMDJSON_PADDING
The amount of padding needed in a buffer to parse JSON.