Compare commits

...

2 Commits

Author SHA1 Message Date
Daniel Lemire 235dbc5369 4.2.1 2025-11-03 11:04:23 -05:00
Daniel Lemire 2b9c8977af using _json for compile-time JSON strings. (#2536) 2025-11-03 11:03:21 -05:00
17 changed files with 216 additions and 59 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.14)
project( project(
simdjson simdjson
# The version number is modified by tools/release.py # The version number is modified by tools/release.py
VERSION 4.2.0 VERSION 4.2.1
DESCRIPTION "Parsing gigabytes of JSON per second" DESCRIPTION "Parsing gigabytes of JSON per second"
HOMEPAGE_URL "https://simdjson.org/" HOMEPAGE_URL "https://simdjson.org/"
LANGUAGES CXX C LANGUAGES CXX C
+1 -1
View File
@@ -38,7 +38,7 @@ PROJECT_NAME = simdjson
# could be handy for archiving the generated documentation or if some version # could be handy for archiving the generated documentation or if some version
# control system is used. # control system is used.
PROJECT_NUMBER = "4.2.0" PROJECT_NUMBER = "4.2.1"
# Using the PROJECT_BRIEF tag one can provide an optional one line description # Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a # for a project that appears at the top of each page and should give viewer a
+3 -2
View File
@@ -1,6 +1,7 @@
The Basics The Basics
========== ==========
An overview of what you need to know to use simdjson to parse JSON documents, with examples. An overview of what you need to know to use simdjson to parse JSON documents, with examples.
[Our documentation regarding the generation (serialization) of JSON documents is in a [Our documentation regarding the generation (serialization) of JSON documents is in a
separate document](https://github.com/simdjson/simdjson/blob/master/doc/builder.md). separate document](https://github.com/simdjson/simdjson/blob/master/doc/builder.md).
@@ -477,7 +478,7 @@ support for users who avoid exceptions. See [the simdjson error handling documen
> unlike `key()`, it has to determine the location of the final quote character. > unlike `key()`, it has to determine the location of the final quote character.
> >
> ```cpp > ```cpp
> auto json = R"({"k\u0065y": 1})"_padded; > auto json = R"({"k\u0065y": 1})"_padded; // R"( ... )" is a C++ raw string literal.
> ondemand::parser parser; > ondemand::parser parser;
> auto doc = parser.iterate(json); > auto doc = parser.iterate(json);
> ondemand::object object = doc.get_object(); > ondemand::object object = doc.get_object();
@@ -502,7 +503,7 @@ support for users who avoid exceptions. See [the simdjson error handling documen
> >
> ```cpp > ```cpp
> ondemand::parser parser; > ondemand::parser parser;
> auto json = R"( { "x": 1, "y": 2 } )"_padded; > auto json = R"( { "x": 1, "y": 2 } )"_padded; // R"( ... )" is a C++ raw string literal.
> auto doc = parser.iterate(json); > auto doc = parser.iterate(json);
> double y = doc.find_field("y"); // The cursor is now after the 2 (at }) > double y = doc.find_field("y"); // The cursor is now after the 2 (at })
> double x = doc.find_field("x"); // This fails, because there are no more fields after "y" > double x = doc.find_field("x"); // This fails, because there are no more fields after "y"
+20 -5
View File
@@ -53,15 +53,22 @@ Suppose you want to parse the following JSON document:
} }
``` ```
**Reminder**: In C++, `R"( )"` allows us to write multi-line strings with unescaped quotes.
You can do so, at compile-time, as follows: You can do so, at compile-time, as follows:
```cpp ```cpp
constexpr auto cfg = simdjson::compile_time::parse_json<R"({ constexpr auto cfg = R"(
{
"port": 8080, "port": 8080,
"host": "localhost", "host": "localhost",
"debug": true "debug": true
})">(); }
)"_json;
// cfg.port == 8080 // cfg.port == 8080
// std::string_view(cfg.host) == "localhost" // std::string_view(cfg.host) == "localhost"
@@ -71,12 +78,16 @@ constexpr auto cfg = simdjson::compile_time::parse_json<R"({
You can nest objects and arrays: You can nest objects and arrays:
```cpp ```cpp
constexpr auto data = simdjson::compile_time::parse_json<R"({ constexpr auto data = R"(
{
"servers": [ "servers": [
{"host": "s1", "port": 3000}, {"host": "s1", "port": 3000},
{"host": "s2", "port": 3001} {"host": "s2", "port": 3001}
] ]
})">(); }
)"_json;
// data.servers.size() == 2 // data.servers.size() == 2
@@ -86,7 +97,11 @@ constexpr auto data = simdjson::compile_time::parse_json<R"({
Top-level arrays are allowed: Top-level arrays are allowed:
```cpp ```cpp
constexpr auto arr = simdjson::compile_time::parse_json<R"([1, 2, 3])">(); constexpr auto arr = R"(
[1, 2, 3]
)"_json;
static_assert(arr.size() == 3); static_assert(arr.size() == 3);
static_assert(arr[1] == 2); static_assert(arr[1] == 2);
``` ```
+1
View File
@@ -40,6 +40,7 @@ struct User {
std::vector<std::string> emails; std::vector<std::string> emails;
}; };
// R"( ... )" is a C++ raw string literal.
const padded_string json = R"({ const padded_string json = R"({
"name": "Alice", "name": "Alice",
"age": 30, "age": 30,
+2
View File
@@ -119,6 +119,7 @@ Once you have an element, you can navigate it with idiomatic C++ iterators, oper
`dom::object` and `dom::array`) and pass it by reference to `get()` which gives you back an error code: e.g., `dom::object` and `dom::array`) and pass it by reference to `get()` which gives you back an error code: e.g.,
```cpp ```cpp
simdjson::error_code error; simdjson::error_code error;
// _padded returns an simdjson::padded_string instance
simdjson::padded_string numberstring = "1.2"_padded; // our JSON input ("1.2") simdjson::padded_string numberstring = "1.2"_padded; // our JSON input ("1.2")
simdjson::dom::parser parser; simdjson::dom::parser parser;
double value; // variable where we store the value to be parsed double value; // variable where we store the value to be parsed
@@ -153,6 +154,7 @@ Once you have an element, you can navigate it with idiomatic C++ iterators, oper
The following code illustrates all of the above: The following code illustrates all of the above:
```cpp ```cpp
// R"( ... )" is a C++ raw string literal.
auto cars_json = R"( [ auto cars_json = R"( [
{ "make": "Toyota", "model": "Camry", "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] }, { "make": "Toyota", "model": "Camry", "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
{ "make": "Kia", "model": "Soul", "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] }, { "make": "Kia", "model": "Soul", "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
+2
View File
@@ -141,7 +141,9 @@ API
Example: Example:
```cpp ```cpp
// R"( ... )" is a C++ raw string literal.
auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded; auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
// _padded returns an simdjson::padded_string instance
ondemand::parser parser; ondemand::parser parser;
ondemand::document_stream docs = parser.iterate_many(json); ondemand::document_stream docs = parser.iterate_many(json);
for (auto doc : docs) { for (auto doc : docs) {
+2
View File
@@ -672,7 +672,9 @@ in production systems:
```cpp ```cpp
ondemand::parser parser; ondemand::parser parser;
// R"( ... )" is a C++ raw string literal.
const padded_string json = R"({ "parent": {"child1": {"name": "John"} , "child2": {"name": "Daniel"}} })"_padded; const padded_string json = R"({ "parent": {"child1": {"name": "John"} , "child2": {"name": "Daniel"}} })"_padded;
// _padded returns an simdjson padded_string instance
auto doc = parser.iterate(json); auto doc = parser.iterate(json);
ondemand::object parent = doc["parent"]; ondemand::object parent = doc["parent"];
// parent owns the focus // parent owns the focus
+6
View File
@@ -65,5 +65,11 @@ template <constevalutil::fixed_string json_str> consteval auto parse_json();
} // namespace compile_time } // namespace compile_time
} // namespace simdjson } // namespace simdjson
template <simdjson::constevalutil::fixed_string str>
consteval auto operator ""_json() {
return simdjson::compile_time::parse_json<str>();
}
#endif // SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_STATIC_REFLECTION
#endif // SIMDJSON_GENERIC_COMPILE_TIME_JSON_H #endif // SIMDJSON_GENERIC_COMPILE_TIME_JSON_H
+2 -2
View File
@@ -167,7 +167,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -205,7 +205,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -53,7 +53,7 @@ extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[];
// The mantissa is truncated to 128 bits, and // The mantissa is truncated to 128 bits, and
// never rounded up. Uses about 10KB. // never rounded up. Uses about 10KB.
// We use the template trick to allow inclusion in multiple translation units. // We use the template trick to allow inclusion in multiple translation units.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
template <typename unused = void> struct powers_template { template <typename unused = void> struct powers_template {
constexpr static uint64_t power_of_five_128[651*2]= { constexpr static uint64_t power_of_five_128[651*2]= {
0xeef453d6923bd65a,0x113faa2906a13b3f, 0xeef453d6923bd65a,0x113faa2906a13b3f,
@@ -708,7 +708,7 @@ constexpr static uint64_t power_of_five_128[651*2]= {
0xe3d8f9e563a198e5,0x58180fddd97723a6, 0xe3d8f9e563a198e5,0x58180fddd97723a6,
0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,}; 0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,};
}; };
#endif // SIMDJSON_CPLUSPLUS26 #endif // SIMDJSON_STATIC_REFLECTION
extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2]; extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2];
} // namespace internal } // namespace internal
+1 -1
View File
@@ -192,7 +192,7 @@ inline simdjson::padded_string operator ""_padded(const char *str, size_t len) {
} }
#ifdef __cpp_char8_t #ifdef __cpp_char8_t
inline simdjson::padded_string operator ""_padded(const char8_t *str, size_t len) { inline simdjson::padded_string operator ""_padded(const char8_t *str, size_t len) {
return simdjson::padded_string(reinterpret_cast<const char8_t *>(str), len); return simdjson::padded_string(reinterpret_cast<const char *>(str), len);
} }
#endif #endif
#endif // SIMDJSON_PADDED_STRING_INL_H #endif // SIMDJSON_PADDED_STRING_INL_H
+2 -2
View File
@@ -4,7 +4,7 @@
#define SIMDJSON_SIMDJSON_VERSION_H #define SIMDJSON_SIMDJSON_VERSION_H
/** The version of simdjson being used (major.minor.revision) */ /** The version of simdjson being used (major.minor.revision) */
#define SIMDJSON_VERSION "4.2.0" #define SIMDJSON_VERSION "4.2.1"
namespace simdjson { namespace simdjson {
enum { enum {
@@ -19,7 +19,7 @@ enum {
/** /**
* The revision (major.minor.REVISION) of simdjson being used. * The revision (major.minor.REVISION) of simdjson being used.
*/ */
SIMDJSON_VERSION_REVISION = 0 SIMDJSON_VERSION_REVISION = 1
}; };
} // namespace simdjson } // namespace simdjson
+19 -19
View File
@@ -1,4 +1,4 @@
/* auto-generated on 2025-11-02 11:53:56 -0500. version 4.2.0 Do not edit! */ /* auto-generated on 2025-11-03 11:03:21 -0500. version 4.2.1 Do not edit! */
/* including simdjson.cpp: */ /* including simdjson.cpp: */
/* begin file simdjson.cpp */ /* begin file simdjson.cpp */
#define SIMDJSON_SRC_SIMDJSON_CPP #define SIMDJSON_SRC_SIMDJSON_CPP
@@ -5357,7 +5357,7 @@ extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[];
// The mantissa is truncated to 128 bits, and // The mantissa is truncated to 128 bits, and
// never rounded up. Uses about 10KB. // never rounded up. Uses about 10KB.
// We use the template trick to allow inclusion in multiple translation units. // We use the template trick to allow inclusion in multiple translation units.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
template <typename unused = void> struct powers_template { template <typename unused = void> struct powers_template {
constexpr static uint64_t power_of_five_128[651*2]= { constexpr static uint64_t power_of_five_128[651*2]= {
0xeef453d6923bd65a,0x113faa2906a13b3f, 0xeef453d6923bd65a,0x113faa2906a13b3f,
@@ -6012,7 +6012,7 @@ constexpr static uint64_t power_of_five_128[651*2]= {
0xe3d8f9e563a198e5,0x58180fddd97723a6, 0xe3d8f9e563a198e5,0x58180fddd97723a6,
0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,}; 0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,};
}; };
#endif // SIMDJSON_CPLUSPLUS26 #endif // SIMDJSON_STATIC_REFLECTION
extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2]; extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2];
} // namespace internal } // namespace internal
@@ -10287,7 +10287,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -10325,7 +10325,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -16782,7 +16782,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -16820,7 +16820,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -23132,7 +23132,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -23170,7 +23170,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -29639,7 +29639,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -29677,7 +29677,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -36505,7 +36505,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -36543,7 +36543,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -43193,7 +43193,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -43231,7 +43231,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -49327,7 +49327,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -49365,7 +49365,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -55053,7 +55053,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -55091,7 +55091,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
+28 -22
View File
@@ -1,4 +1,4 @@
/* auto-generated on 2025-11-02 11:53:56 -0500. version 4.2.0 Do not edit! */ /* auto-generated on 2025-11-03 11:03:21 -0500. version 4.2.1 Do not edit! */
/* including simdjson.h: */ /* including simdjson.h: */
/* begin file simdjson.h */ /* begin file simdjson.h */
#ifndef SIMDJSON_H #ifndef SIMDJSON_H
@@ -2513,7 +2513,7 @@ namespace std {
#define SIMDJSON_SIMDJSON_VERSION_H #define SIMDJSON_SIMDJSON_VERSION_H
/** The version of simdjson being used (major.minor.revision) */ /** The version of simdjson being used (major.minor.revision) */
#define SIMDJSON_VERSION "4.2.0" #define SIMDJSON_VERSION "4.2.1"
namespace simdjson { namespace simdjson {
enum { enum {
@@ -2528,7 +2528,7 @@ enum {
/** /**
* The revision (major.minor.REVISION) of simdjson being used. * The revision (major.minor.REVISION) of simdjson being used.
*/ */
SIMDJSON_VERSION_REVISION = 0 SIMDJSON_VERSION_REVISION = 1
}; };
} // namespace simdjson } // namespace simdjson
@@ -4660,7 +4660,7 @@ inline simdjson::padded_string operator ""_padded(const char *str, size_t len) {
} }
#ifdef __cpp_char8_t #ifdef __cpp_char8_t
inline simdjson::padded_string operator ""_padded(const char8_t *str, size_t len) { inline simdjson::padded_string operator ""_padded(const char8_t *str, size_t len) {
return simdjson::padded_string(reinterpret_cast<const char8_t *>(str), len); return simdjson::padded_string(reinterpret_cast<const char *>(str), len);
} }
#endif #endif
#endif // SIMDJSON_PADDED_STRING_INL_H #endif // SIMDJSON_PADDED_STRING_INL_H
@@ -10615,7 +10615,7 @@ extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[];
// The mantissa is truncated to 128 bits, and // The mantissa is truncated to 128 bits, and
// never rounded up. Uses about 10KB. // never rounded up. Uses about 10KB.
// We use the template trick to allow inclusion in multiple translation units. // We use the template trick to allow inclusion in multiple translation units.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
template <typename unused = void> struct powers_template { template <typename unused = void> struct powers_template {
constexpr static uint64_t power_of_five_128[651*2]= { constexpr static uint64_t power_of_five_128[651*2]= {
0xeef453d6923bd65a,0x113faa2906a13b3f, 0xeef453d6923bd65a,0x113faa2906a13b3f,
@@ -11270,7 +11270,7 @@ constexpr static uint64_t power_of_five_128[651*2]= {
0xe3d8f9e563a198e5,0x58180fddd97723a6, 0xe3d8f9e563a198e5,0x58180fddd97723a6,
0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,}; 0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,};
}; };
#endif // SIMDJSON_CPLUSPLUS26 #endif // SIMDJSON_STATIC_REFLECTION
extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2]; extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[651*2];
} // namespace internal } // namespace internal
@@ -13178,7 +13178,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -13216,7 +13216,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -15373,7 +15373,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -15411,7 +15411,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -18067,7 +18067,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -18105,7 +18105,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -20761,7 +20761,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -20799,7 +20799,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -23570,7 +23570,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -23608,7 +23608,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -26695,7 +26695,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -26733,7 +26733,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -29297,7 +29297,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -29335,7 +29335,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -31912,7 +31912,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index]);
#else #else
simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]); simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
@@ -31950,7 +31950,7 @@ simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative,
// with a returned value of type value128 with a "low component" corresponding to the // with a returned value of type value128 with a "low component" corresponding to the
// 64-bit least significant bits of the product and with a "high component" corresponding // 64-bit least significant bits of the product and with a "high component" corresponding
// to the 64-bit most significant bits of the product. // to the 64-bit most significant bits of the product.
#if SIMDJSON_CPLUSPLUS26 #if SIMDJSON_STATIC_REFLECTION
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::powers_template<>::power_of_five_128[index + 1]);
#else #else
simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]); simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
@@ -153374,6 +153374,12 @@ template <constevalutil::fixed_string json_str> consteval auto parse_json();
} // namespace compile_time } // namespace compile_time
} // namespace simdjson } // namespace simdjson
template <simdjson::constevalutil::fixed_string str>
consteval auto operator ""_json() {
return simdjson::compile_time::parse_json<str>();
}
#endif // SIMDJSON_STATIC_REFLECTION #endif // SIMDJSON_STATIC_REFLECTION
#endif // SIMDJSON_GENERIC_COMPILE_TIME_JSON_H #endif // SIMDJSON_GENERIC_COMPILE_TIME_JSON_H
/* end file simdjson/compile_time_json.h */ /* end file simdjson/compile_time_json.h */
Binary file not shown.
+124 -2
View File
@@ -8,8 +8,8 @@
#include <print> #include <print>
using namespace simdjson;
using namespace std::string_view_literals; using namespace std::string_view_literals;
using namespace simdjson;
namespace compile_time_json_tests { namespace compile_time_json_tests {
/** /**
@@ -479,6 +479,124 @@ bool array_of_objects() {
TEST_SUCCEED(); TEST_SUCCEED();
} }
bool test_complex_mixed_str() {
TEST_START();
auto f= "fds"_padded;
constexpr auto config = R"(
{
"app": "myapp",
"version": 1.0,
"config": {
"ports": [8080, 8081, 8082],
"enabled": true
},
"servers": [
{"host": "server1", "port": 3000},
{"host": "server2", "port": 3001}
]
}
)"_json;
static_assert(std::string_view(config.app) == "myapp");
static_assert(config.version == 1.0);
static_assert(config.config.ports[0] == 8080);
static_assert(config.config.enabled == true);
static_assert(std::string_view(config.servers[0].host) == "server1");
static_assert(config.servers[1].port == 3001);
ASSERT_EQUAL(std::string_view(config.app), "myapp"sv);
ASSERT_EQUAL(config.config.ports[0], 8080);
ASSERT_EQUAL(std::string_view(config.servers[0].host), "server1"sv);
ASSERT_EQUAL(config.servers[1].port, 3001);
TEST_SUCCEED();
}
/**
* Test: User config example - basic object with primitives
*/
bool test_user_config_example() {
TEST_START();
constexpr auto cfg = R"(
{
"port": 8080,
"host": "localhost",
"debug": true
}
)"_json;
static_assert(cfg.port == 8080);
static_assert(std::string_view(cfg.host) == "localhost");
static_assert(cfg.debug == true);
ASSERT_EQUAL(cfg.port, 8080);
ASSERT_EQUAL(std::string_view(cfg.host), "localhost"sv);
ASSERT_TRUE(cfg.debug);
TEST_SUCCEED();
}
/**
* Test: Nested objects and arrays example
*/
bool test_nested_servers_example() {
TEST_START();
constexpr auto data = R"(
{
"servers": [
{"host": "s1", "port": 3000},
{"host": "s2", "port": 3001}
]
}
)"_json;
static_assert(data.servers.size() == 2);
static_assert(std::string_view(data.servers[0].host) == "s1");
static_assert(data.servers[0].port == 3000);
static_assert(std::string_view(data.servers[1].host) == "s2");
static_assert(data.servers[1].port == 3001);
ASSERT_EQUAL(data.servers.size(), 2);
ASSERT_EQUAL(std::string_view(data.servers[0].host), "s1"sv);
ASSERT_EQUAL(data.servers[0].port, 3000);
ASSERT_EQUAL(std::string_view(data.servers[1].host), "s2"sv);
ASSERT_EQUAL(data.servers[1].port, 3001);
TEST_SUCCEED();
}
/**
* Test: Top-level array example
*/
bool test_top_level_array_example() {
TEST_START();
constexpr auto arr = R"(
[1, 2, 3]
)"_json;
static_assert(arr.size() == 3);
static_assert(arr[0] == 1);
static_assert(arr[1] == 2);
static_assert(arr[2] == 3);
ASSERT_EQUAL(arr.size(), 3);
ASSERT_EQUAL(arr[0], 1);
ASSERT_EQUAL(arr[1], 2);
ASSERT_EQUAL(arr[2], 3);
TEST_SUCCEED();
}
bool run() { bool run() {
return test_basic_object() && return test_basic_object() &&
test_nested_objects() && test_nested_objects() &&
@@ -498,7 +616,11 @@ bool run() {
test_simple_object_str_with_obj() && test_simple_object_str_with_obj() &&
test_empty_arrays() && test_empty_arrays() &&
simple_array() && simple_array() &&
array_of_objects(); test_complex_mixed_str() &&
array_of_objects() &&
test_user_config_example() &&
test_nested_servers_example() &&
test_top_level_array_example();
} }
} // namespace compile_time_json_tests } // namespace compile_time_json_tests