mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 241ce7304c | |||
| 5dbe96da96 | |||
| 40b397a3d4 | |||
| 5510089d45 | |||
| 62a57907a7 | |||
| becbe99e81 | |||
| bd3d67e889 | |||
| a89d57d0d4 | |||
| e04d400c64 | |||
| 1075e8609c | |||
| 3fde8a4eac | |||
| 62bdb9a2f7 |
+3
-3
@@ -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 2.1.0
|
VERSION 2.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
|
||||||
@@ -20,8 +20,8 @@ string(
|
|||||||
# ---- Options, variables ----
|
# ---- Options, variables ----
|
||||||
|
|
||||||
# These version numbers are modified by tools/release.py
|
# These version numbers are modified by tools/release.py
|
||||||
set(SIMDJSON_LIB_VERSION "12.0.0" CACHE STRING "simdjson library version")
|
set(SIMDJSON_LIB_VERSION "13.0.0" CACHE STRING "simdjson library version")
|
||||||
set(SIMDJSON_LIB_SOVERSION "12" CACHE STRING "simdjson library soversion")
|
set(SIMDJSON_LIB_SOVERSION "13" CACHE STRING "simdjson library soversion")
|
||||||
|
|
||||||
option(SIMDJSON_ENABLE_THREADS "Link with thread support" ON)
|
option(SIMDJSON_ENABLE_THREADS "Link with thread support" ON)
|
||||||
|
|
||||||
|
|||||||
@@ -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 = "2.1.0"
|
PROJECT_NUMBER = "2.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
|
||||||
|
|||||||
@@ -111,10 +111,12 @@ For NDJSON files, we can exceed 3 GB/s with [our multithreaded parsing function
|
|||||||
Real-world usage
|
Real-world usage
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
- [Microsoft FishStore](https://github.com/microsoft/FishStore)
|
- [ClickHouse](https://github.com/ClickHouse/ClickHouse)
|
||||||
- [Yandex ClickHouse](https://github.com/yandex/ClickHouse)
|
|
||||||
- [Clang Build Analyzer](https://github.com/aras-p/ClangBuildAnalyzer)
|
- [Clang Build Analyzer](https://github.com/aras-p/ClangBuildAnalyzer)
|
||||||
- [Shopify HeapProfiler](https://github.com/Shopify/heap-profiler)
|
- [Shopify HeapProfiler](https://github.com/Shopify/heap-profiler)
|
||||||
|
- [StarRocks](https://github.com/StarRocks/starrocks)
|
||||||
|
- [Microsoft FishStore](https://github.com/microsoft/FishStore)
|
||||||
|
|
||||||
|
|
||||||
If you are planning to use simdjson in a product, please work from one of our releases.
|
If you are planning to use simdjson in a product, please work from one of our releases.
|
||||||
|
|
||||||
@@ -139,7 +141,7 @@ We distinguish between "bindings" (which just wrap the C++ code) and a port to a
|
|||||||
- [simdjson_erlang](https://github.com/ChomperT/simdjson_erlang): erlang bindings.
|
- [simdjson_erlang](https://github.com/ChomperT/simdjson_erlang): erlang bindings.
|
||||||
- [lua-simdjson](https://github.com/FourierTransformer/lua-simdjson): lua bindings.
|
- [lua-simdjson](https://github.com/FourierTransformer/lua-simdjson): lua bindings.
|
||||||
- [hermes-json](https://hackage.haskell.org/package/hermes-json): haskell bindings.
|
- [hermes-json](https://hackage.haskell.org/package/hermes-json): haskell bindings.
|
||||||
|
- [simdjzon](https://github.com/travisstaloch/simdjzon): zig port.
|
||||||
|
|
||||||
About simdjson
|
About simdjson
|
||||||
--------------
|
--------------
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ using namespace json_benchmark;
|
|||||||
struct brand {
|
struct brand {
|
||||||
double cumulative_rating;
|
double cumulative_rating;
|
||||||
uint64_t reviews_count;
|
uint64_t reviews_count;
|
||||||
simdjson_really_inline bool operator==(const brand &other) const {
|
simdjson_inline bool operator==(const brand &other) const {
|
||||||
return cumulative_rating == other.cumulative_rating &&
|
return cumulative_rating == other.cumulative_rating &&
|
||||||
reviews_count == other.reviews_count;
|
reviews_count == other.reviews_count;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool operator!=(const brand &other) const { return !(*this == other); }
|
simdjson_inline bool operator!=(const brand &other) const { return !(*this == other); }
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_unused static std::ostream &operator<<(std::ostream &o, const brand &b) {
|
simdjson_unused static std::ostream &operator<<(std::ostream &o, const brand &b) {
|
||||||
@@ -66,8 +66,8 @@ struct runner : public file_runner<I> {
|
|||||||
template<bool threaded>
|
template<bool threaded>
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void amazon_cellphones(benchmark::State &state) {
|
template<typename I> simdjson_inline static void amazon_cellphones(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom<UNTHREADED>>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom<UNTHREADED>>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace amazon_cellphones
|
} // namespace amazon_cellphones
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
|
|||||||
#include <benchmark/benchmark.h>
|
#include <benchmark/benchmark.h>
|
||||||
|
|
||||||
SIMDJSON_POP_DISABLE_WARNINGS
|
SIMDJSON_POP_DISABLE_WARNINGS
|
||||||
|
#include "json2msgpack/simdjson_dom.h"
|
||||||
#include "json2msgpack/simdjson_ondemand.h"
|
#include "json2msgpack/simdjson_ondemand.h"
|
||||||
#include "json2msgpack/rapidjson.h"
|
#include "json2msgpack/rapidjson.h"
|
||||||
#include "json2msgpack/yyjson.h"
|
#include "json2msgpack/yyjson.h"
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ struct feature_benchmarker {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void run_iterations(size_t iterations, bool stage1_only=false) {
|
simdjson_inline void run_iterations(size_t iterations, bool stage1_only=false) {
|
||||||
struct7.run_iterations(iterations, stage1_only);
|
struct7.run_iterations(iterations, stage1_only);
|
||||||
struct7_miss.run_iterations(iterations, stage1_only);
|
struct7_miss.run_iterations(iterations, stage1_only);
|
||||||
struct7_full.run_iterations(iterations, stage1_only);
|
struct7_full.run_iterations(iterations, stage1_only);
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ struct benchmarker {
|
|||||||
return all_stages_without_allocation.iterations;
|
return all_stages_without_allocation.iterations;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void run_iteration(bool stage1_only, bool hotbuffers=false) {
|
simdjson_inline void run_iteration(bool stage1_only, bool hotbuffers=false) {
|
||||||
// Allocate dom::parser
|
// Allocate dom::parser
|
||||||
collector.start();
|
collector.start();
|
||||||
dom::parser parser;
|
dom::parser parser;
|
||||||
@@ -384,7 +384,7 @@ struct benchmarker {
|
|||||||
loop << all_loop_count;
|
loop << all_loop_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void run_iterations(size_t iterations, bool stage1_only, bool hotbuffers=false) {
|
simdjson_inline void run_iterations(size_t iterations, bool stage1_only, bool hotbuffers=false) {
|
||||||
for (size_t i = 0; i<iterations; i++) {
|
for (size_t i = 0; i<iterations; i++) {
|
||||||
run_iteration(stage1_only, hotbuffers);
|
run_iteration(stage1_only, hotbuffers);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ struct runner : public file_runner<I> {
|
|||||||
|
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void distinct_user_id(benchmark::State &state) {
|
template<typename I> simdjson_inline static void distinct_user_id(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ struct sajson {
|
|||||||
size_t *ast_buffer{nullptr};
|
size_t *ast_buffer{nullptr};
|
||||||
~sajson() { free(ast_buffer); }
|
~sajson() { free(ast_buffer); }
|
||||||
|
|
||||||
simdjson_really_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
||||||
return { val.as_cstring(), val.get_string_length() };
|
return { val.as_cstring(), val.get_string_length() };
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
||||||
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ using stat_t = struct stat_s;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline void simdjson_process_atom(stat_t &s,
|
simdjson_inline void simdjson_process_atom(stat_t &s,
|
||||||
simdjson::dom::element element) {
|
simdjson::dom::element element) {
|
||||||
if (element.is<int64_t>()) {
|
if (element.is<int64_t>()) {
|
||||||
s.integer_count++;
|
s.integer_count++;
|
||||||
|
|||||||
@@ -156,13 +156,13 @@ struct event_collector {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline void start() {
|
simdjson_inline void start() {
|
||||||
#if defined(__linux)
|
#if defined(__linux)
|
||||||
linux_events.start();
|
linux_events.start();
|
||||||
#endif
|
#endif
|
||||||
start_clock = steady_clock::now();
|
start_clock = steady_clock::now();
|
||||||
}
|
}
|
||||||
simdjson_really_inline event_count& end() {
|
simdjson_inline event_count& end() {
|
||||||
time_point<steady_clock> end_clock = steady_clock::now();
|
time_point<steady_clock> end_clock = steady_clock::now();
|
||||||
#if defined(__linux)
|
#if defined(__linux)
|
||||||
linux_events.end(count.event_counts);
|
linux_events.end(count.event_counts);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ struct runner : public file_runner<I> {
|
|||||||
|
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void find_tweet(benchmark::State &state) {
|
template<typename I> simdjson_inline static void find_tweet(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ struct sajson {
|
|||||||
size_t *ast_buffer{nullptr};
|
size_t *ast_buffer{nullptr};
|
||||||
~sajson() { free(ast_buffer); }
|
~sajson() { free(ast_buffer); }
|
||||||
|
|
||||||
simdjson_really_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
||||||
return { val.as_cstring(), val.get_string_length() };
|
return { val.as_cstring(), val.get_string_length() };
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
||||||
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ template <typename I> struct runner : public file_runner<I> {
|
|||||||
struct simdjson_ondemand;
|
struct simdjson_ondemand;
|
||||||
|
|
||||||
template <typename I>
|
template <typename I>
|
||||||
simdjson_really_inline static void json2msgpack(benchmark::State &state) {
|
simdjson_inline static void json2msgpack(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_ondemand>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_ondemand>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace json2msgpack
|
} // namespace json2msgpack
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
#pragma once
|
||||||
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
#include "json2msgpack.h"
|
||||||
|
|
||||||
|
namespace json2msgpack {
|
||||||
|
|
||||||
|
using namespace simdjson;
|
||||||
|
|
||||||
|
struct simdjsondom2msgpack {
|
||||||
|
/**
|
||||||
|
* @brief Converts the provided JSON into msgpack.
|
||||||
|
*
|
||||||
|
* @param json JSON input
|
||||||
|
* @param buf temporary buffer (must be large enough, with simdjson::SIMDJSON_PADDING bytes
|
||||||
|
* of padding)
|
||||||
|
* @return std::string_view msgpack output, writting to the temporary buffer
|
||||||
|
*/
|
||||||
|
inline std::string_view to_msgpack(const simdjson::padded_string &json,
|
||||||
|
uint8_t *buf);
|
||||||
|
|
||||||
|
private:
|
||||||
|
simdjson_really_inline void write_double(const double d) noexcept;
|
||||||
|
simdjson_really_inline void write_string(const std::string_view v) noexcept;
|
||||||
|
simdjson_really_inline void write_byte(const uint8_t b) noexcept;
|
||||||
|
simdjson_really_inline void write_uint32(const uint32_t w) noexcept;
|
||||||
|
simdjson_really_inline uint8_t *skip_uint32() noexcept;
|
||||||
|
simdjson_really_inline void write_uint32_at(const uint32_t w,
|
||||||
|
uint8_t *p) noexcept;
|
||||||
|
|
||||||
|
inline void recursive_processor(simdjson::dom::element element);
|
||||||
|
|
||||||
|
dom::parser parser;
|
||||||
|
uint8_t *buff{};
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string_view
|
||||||
|
simdjsondom2msgpack::to_msgpack(const simdjson::padded_string &json,
|
||||||
|
uint8_t *buf) {
|
||||||
|
buff = buf;
|
||||||
|
|
||||||
|
recursive_processor(parser.parse(json));
|
||||||
|
return std::string_view(reinterpret_cast<char *>(buf), size_t(buff - buf));
|
||||||
|
}
|
||||||
|
void simdjsondom2msgpack::write_string(const std::string_view v) noexcept {
|
||||||
|
write_byte(0xdb);
|
||||||
|
write_uint32(uint32_t(v.size()));
|
||||||
|
::memcpy(buff, v.data(), v.size());
|
||||||
|
buff += v.size();
|
||||||
|
}
|
||||||
|
void simdjsondom2msgpack::write_double(const double d) noexcept {
|
||||||
|
*buff++ = 0xcb;
|
||||||
|
::memcpy(buff, &d, sizeof(d));
|
||||||
|
buff += sizeof(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void simdjsondom2msgpack::write_byte(const uint8_t b) noexcept {
|
||||||
|
*buff = b;
|
||||||
|
buff++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void simdjsondom2msgpack::write_uint32(const uint32_t w) noexcept {
|
||||||
|
::memcpy(buff, &w, sizeof(w));
|
||||||
|
buff += sizeof(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *simdjsondom2msgpack::skip_uint32() noexcept {
|
||||||
|
uint8_t *ret = buff;
|
||||||
|
buff += sizeof(uint32_t);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void simdjsondom2msgpack::write_uint32_at(const uint32_t w, uint8_t *p) noexcept {
|
||||||
|
::memcpy(p, &w, sizeof(w));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void simdjsondom2msgpack::recursive_processor(simdjson::dom::element element) {
|
||||||
|
switch (element.type()) {
|
||||||
|
case dom::element_type::ARRAY: {
|
||||||
|
uint32_t counter = 0;
|
||||||
|
write_byte(0xdd);
|
||||||
|
uint8_t *location = skip_uint32();
|
||||||
|
for (auto child : dom::array(element)) {
|
||||||
|
counter++;
|
||||||
|
recursive_processor(child);
|
||||||
|
}
|
||||||
|
write_uint32_at(counter, location);}
|
||||||
|
break;
|
||||||
|
case dom::element_type::OBJECT:{
|
||||||
|
uint32_t counter = 0;
|
||||||
|
write_byte(0xdf);
|
||||||
|
uint8_t *location = skip_uint32();
|
||||||
|
for (dom::key_value_pair field : dom::object(element)) {
|
||||||
|
counter++;
|
||||||
|
write_string(field.key);
|
||||||
|
recursive_processor(field.value);
|
||||||
|
}
|
||||||
|
write_uint32_at(counter, location);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case dom::element_type::INT64:
|
||||||
|
case dom::element_type::UINT64:
|
||||||
|
case dom::element_type::DOUBLE:
|
||||||
|
write_double( double(element));
|
||||||
|
break;
|
||||||
|
case dom::element_type::STRING:
|
||||||
|
write_string(std::string_view(element));
|
||||||
|
break;
|
||||||
|
case dom::element_type::BOOL:
|
||||||
|
write_byte(0xc2 + bool(element));
|
||||||
|
break;
|
||||||
|
case dom::element_type::NULL_VALUE:
|
||||||
|
write_byte(0xc0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct simdjson_dom {
|
||||||
|
using StringType = std::string_view;
|
||||||
|
|
||||||
|
simdjsondom2msgpack parser{};
|
||||||
|
|
||||||
|
bool run(simdjson::padded_string &json, char *buffer,
|
||||||
|
std::string_view &result) {
|
||||||
|
result = parser.to_msgpack(json, reinterpret_cast<uint8_t *>(buffer));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE(json2msgpack, simdjson_dom)->UseManualTime();
|
||||||
|
|
||||||
|
} // namespace json2msgpack
|
||||||
|
|
||||||
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
@@ -34,26 +34,25 @@ struct simdjson2msgpack {
|
|||||||
* @brief Converts the provided JSON into msgpack.
|
* @brief Converts the provided JSON into msgpack.
|
||||||
*
|
*
|
||||||
* @param json JSON input
|
* @param json JSON input
|
||||||
* @param buf temporary buffer (must be large enough, with 32 bytes of
|
* @param buf temporary buffer (must be large enough, with simdjson::SIMDJSON_PADDING bytes
|
||||||
* padding)
|
* of padding)
|
||||||
* @return std::string_view msgpack output, writting to the temporary buffer
|
* @return std::string_view msgpack output, writting to the temporary buffer
|
||||||
*/
|
*/
|
||||||
inline std::string_view to_msgpack(const simdjson::padded_string &json,
|
inline std::string_view to_msgpack(const simdjson::padded_string &json,
|
||||||
uint8_t *buf);
|
uint8_t *buf);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline void write_double(const double d) noexcept;
|
simdjson_inline void write_double(const double d) noexcept;
|
||||||
simdjson_really_inline void write_byte(const uint8_t b) noexcept;
|
simdjson_inline void write_byte(const uint8_t b) noexcept;
|
||||||
simdjson_really_inline void write_uint32(const uint32_t w) noexcept;
|
simdjson_inline void write_uint32(const uint32_t w) noexcept;
|
||||||
simdjson_really_inline uint8_t *skip_uint32() noexcept;
|
simdjson_inline uint8_t *skip_uint32() noexcept;
|
||||||
simdjson_really_inline void write_uint32_at(const uint32_t w,
|
simdjson_inline void write_uint32_at(const uint32_t w,
|
||||||
uint8_t *p) noexcept;
|
uint8_t *p) noexcept;
|
||||||
simdjson_really_inline void
|
simdjson_inline void
|
||||||
write_raw_string(simdjson::ondemand::raw_json_string rjs);
|
write_raw_string(simdjson::ondemand::raw_json_string rjs);
|
||||||
inline void recursive_processor(simdjson::ondemand::value element);
|
inline void recursive_processor(simdjson::ondemand::value element);
|
||||||
|
|
||||||
simdjson::ondemand::parser parser;
|
simdjson::ondemand::parser parser;
|
||||||
simdjson::ondemand::document doc;
|
|
||||||
uint8_t *buff{};
|
uint8_t *buff{};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -180,4 +179,4 @@ BENCHMARK_TEMPLATE(json2msgpack, simdjson_ondemand)->UseManualTime();
|
|||||||
|
|
||||||
} // namespace json2msgpack
|
} // namespace json2msgpack
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ static const simdjson::padded_string &get_built_json_array() {
|
|||||||
|
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void kostya(benchmark::State &state) {
|
template<typename I> simdjson_inline static void kostya(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct rapidjson_base {
|
|||||||
|
|
||||||
Document doc;
|
Document doc;
|
||||||
|
|
||||||
simdjson_really_inline double get_double(Value &object, std::string_view key) {
|
simdjson_inline double get_double(Value &object, std::string_view key) {
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing double field"; }
|
if (field == object.MemberEnd()) { throw "Missing double field"; }
|
||||||
if (!field->value.IsNumber()) { throw "Field is not double"; }
|
if (!field->value.IsNumber()) { throw "Field is not double"; }
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct sajson {
|
|||||||
size_t *ast_buffer{nullptr};
|
size_t *ast_buffer{nullptr};
|
||||||
~sajson() { free(ast_buffer); }
|
~sajson() { free(ast_buffer); }
|
||||||
|
|
||||||
simdjson_really_inline double get_double(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline double get_double(const ::sajson::value &obj, std::string_view key) {
|
||||||
using namespace sajson;
|
using namespace sajson;
|
||||||
|
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace kostya {
|
|||||||
struct yyjson_base {
|
struct yyjson_base {
|
||||||
static constexpr diff_flags DiffFlags = diff_flags::NONE;
|
static constexpr diff_flags DiffFlags = diff_flags::NONE;
|
||||||
|
|
||||||
simdjson_really_inline double get_double(yyjson_val *obj, std::string_view key) {
|
simdjson_inline double get_double(yyjson_val *obj, std::string_view key) {
|
||||||
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!val) { throw "missing point field!"; }
|
if (!val) { throw "missing point field!"; }
|
||||||
if (yyjson_get_type(val) != YYJSON_TYPE_NUM) { throw "Number is not a type!"; }
|
if (yyjson_get_type(val) != YYJSON_TYPE_NUM) { throw "Number is not a type!"; }
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ using namespace json_benchmark;
|
|||||||
struct brand {
|
struct brand {
|
||||||
double cumulative_rating;
|
double cumulative_rating;
|
||||||
uint64_t reviews_count;
|
uint64_t reviews_count;
|
||||||
simdjson_really_inline bool operator==(const brand &other) const {
|
simdjson_inline bool operator==(const brand &other) const {
|
||||||
return cumulative_rating == other.cumulative_rating &&
|
return cumulative_rating == other.cumulative_rating &&
|
||||||
reviews_count == other.reviews_count;
|
reviews_count == other.reviews_count;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool operator!=(const brand &other) const { return !(*this == other); }
|
simdjson_inline bool operator!=(const brand &other) const { return !(*this == other); }
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_unused static std::ostream &operator<<(std::ostream &o, const brand &b) {
|
simdjson_unused static std::ostream &operator<<(std::ostream &o, const brand &b) {
|
||||||
@@ -87,8 +87,8 @@ static const simdjson::padded_string &get_built_json() {
|
|||||||
template<bool threaded>
|
template<bool threaded>
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void large_amazon_cellphones(benchmark::State &state) {
|
template<typename I> simdjson_inline static void large_amazon_cellphones(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom<UNTHREADED>>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom<UNTHREADED>>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace large_amazon_cellphones
|
} // namespace large_amazon_cellphones
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct rapidjson_base {
|
|||||||
|
|
||||||
Document doc;
|
Document doc;
|
||||||
|
|
||||||
simdjson_really_inline double get_double(Value &object, std::string_view key) {
|
simdjson_inline double get_double(Value &object, std::string_view key) {
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing double field"; }
|
if (field == object.MemberEnd()) { throw "Missing double field"; }
|
||||||
if (!field->value.IsNumber()) { throw "Field is not double"; }
|
if (!field->value.IsNumber()) { throw "Field is not double"; }
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct sajson {
|
|||||||
size_t *ast_buffer{nullptr};
|
size_t *ast_buffer{nullptr};
|
||||||
~sajson() { free(ast_buffer); }
|
~sajson() { free(ast_buffer); }
|
||||||
|
|
||||||
simdjson_really_inline double get_double(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline double get_double(const ::sajson::value &obj, std::string_view key) {
|
||||||
using namespace sajson;
|
using namespace sajson;
|
||||||
|
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace large_random {
|
|||||||
struct yyjson_base {
|
struct yyjson_base {
|
||||||
static constexpr diff_flags DiffFlags = diff_flags::NONE;
|
static constexpr diff_flags DiffFlags = diff_flags::NONE;
|
||||||
|
|
||||||
simdjson_really_inline double get_double(yyjson_val *obj, std::string_view key) {
|
simdjson_inline double get_double(yyjson_val *obj, std::string_view key) {
|
||||||
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!val) { throw "missing point field!"; }
|
if (!val) { throw "missing point field!"; }
|
||||||
if (yyjson_get_type(val) != YYJSON_TYPE_NUM) { throw "Number is not a type!"; }
|
if (yyjson_get_type(val) != YYJSON_TYPE_NUM) { throw "Number is not a type!"; }
|
||||||
|
|||||||
@@ -10,28 +10,28 @@ using namespace simdjson;
|
|||||||
|
|
||||||
class Iter {
|
class Iter {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline bool Run(const padded_string &json);
|
simdjson_inline bool Run(const padded_string &json);
|
||||||
|
|
||||||
simdjson_really_inline const std::vector<my_point> &Result() { return container; }
|
simdjson_inline const std::vector<my_point> &Result() { return container; }
|
||||||
simdjson_really_inline size_t ItemCount() { return container.size(); }
|
simdjson_inline size_t ItemCount() { return container.size(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ondemand::parser parser{};
|
ondemand::parser parser{};
|
||||||
std::vector<my_point> container{};
|
std::vector<my_point> container{};
|
||||||
|
|
||||||
simdjson_really_inline double first_double(ondemand::json_iterator &iter) {
|
simdjson_inline double first_double(ondemand::json_iterator &iter) {
|
||||||
if (iter.start_object().error() || iter.field_key().error() || iter.field_value()) { throw "Invalid field"; }
|
if (iter.start_object().error() || iter.field_key().error() || iter.field_value()) { throw "Invalid field"; }
|
||||||
return iter.consume_double();
|
return iter.consume_double();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline double next_double(ondemand::json_iterator &iter) {
|
simdjson_inline double next_double(ondemand::json_iterator &iter) {
|
||||||
if (!iter.has_next_field() || iter.field_key().error() || iter.field_value()) { throw "Invalid field"; }
|
if (!iter.has_next_field() || iter.field_key().error() || iter.field_value()) { throw "Invalid field"; }
|
||||||
return iter.consume_double();
|
return iter.consume_double();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_really_inline bool Iter::Run(const padded_string &json) {
|
simdjson_inline bool Iter::Run(const padded_string &json) {
|
||||||
container.clear();
|
container.clear();
|
||||||
|
|
||||||
auto iter = parser.iterate_raw(json).value();
|
auto iter = parser.iterate_raw(json).value();
|
||||||
|
|||||||
@@ -10,16 +10,16 @@ using namespace simdjson;
|
|||||||
|
|
||||||
class OnDemand {
|
class OnDemand {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline bool Run(const padded_string &json);
|
simdjson_inline bool Run(const padded_string &json);
|
||||||
simdjson_really_inline const std::vector<my_point> &Result() { return container; }
|
simdjson_inline const std::vector<my_point> &Result() { return container; }
|
||||||
simdjson_really_inline size_t ItemCount() { return container.size(); }
|
simdjson_inline size_t ItemCount() { return container.size(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ondemand::parser parser{};
|
ondemand::parser parser{};
|
||||||
std::vector<my_point> container{};
|
std::vector<my_point> container{};
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_really_inline bool OnDemand::Run(const padded_string &json) {
|
simdjson_inline bool OnDemand::Run(const padded_string &json) {
|
||||||
container.clear();
|
container.clear();
|
||||||
|
|
||||||
auto doc = parser.iterate(json);
|
auto doc = parser.iterate(json);
|
||||||
|
|||||||
+16
-16
@@ -11,13 +11,13 @@ using namespace simdjson::builtin::stage2;
|
|||||||
|
|
||||||
class Sax {
|
class Sax {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline bool Run(const padded_string &json) noexcept;
|
simdjson_inline bool Run(const padded_string &json) noexcept;
|
||||||
|
|
||||||
simdjson_really_inline const std::vector<my_point> &Result() { return container; }
|
simdjson_inline const std::vector<my_point> &Result() { return container; }
|
||||||
simdjson_really_inline size_t ItemCount() { return container.size(); }
|
simdjson_inline size_t ItemCount() { return container.size(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline error_code RunNoExcept(const padded_string &json) noexcept;
|
simdjson_inline error_code RunNoExcept(const padded_string &json) noexcept;
|
||||||
error_code Allocate(size_t new_capacity);
|
error_code Allocate(size_t new_capacity);
|
||||||
std::unique_ptr<uint8_t[]> string_buf{};
|
std::unique_ptr<uint8_t[]> string_buf{};
|
||||||
size_t capacity{};
|
size_t capacity{};
|
||||||
@@ -34,21 +34,21 @@ public:
|
|||||||
|
|
||||||
explicit sax_point_reader_visitor(std::vector<my_point> &_points) : points(_points) {}
|
explicit sax_point_reader_visitor(std::vector<my_point> &_points) : points(_points) {}
|
||||||
|
|
||||||
simdjson_really_inline error_code visit_object_start(json_iterator &) {
|
simdjson_inline error_code visit_object_start(json_iterator &) {
|
||||||
idx = 0;
|
idx = 0;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code visit_primitive(json_iterator &, const uint8_t *value) {
|
simdjson_inline error_code visit_primitive(json_iterator &, const uint8_t *value) {
|
||||||
if(idx == GOT_SOMETHING_ELSE) { return simdjson::SUCCESS; }
|
if(idx == GOT_SOMETHING_ELSE) { return simdjson::SUCCESS; }
|
||||||
return numberparsing::parse_double(value).get(buffer[idx]);
|
return numberparsing::parse_double(value).get(buffer[idx]);
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code visit_object_end(json_iterator &) {
|
simdjson_inline error_code visit_object_end(json_iterator &) {
|
||||||
points.emplace_back(my_point{buffer[0], buffer[1], buffer[2]});
|
points.emplace_back(my_point{buffer[0], buffer[1], buffer[2]});
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline error_code visit_document_start(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_document_start(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_key(json_iterator &, const uint8_t * key) {
|
simdjson_inline error_code visit_key(json_iterator &, const uint8_t * key) {
|
||||||
switch(key[1]) {
|
switch(key[1]) {
|
||||||
// Technically, we should check the other characters
|
// Technically, we should check the other characters
|
||||||
// in the key, but we are cheating to go as fast
|
// in the key, but we are cheating to go as fast
|
||||||
@@ -67,13 +67,13 @@ public:
|
|||||||
}
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code visit_array_start(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_array_start(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_array_end(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_array_end(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_document_end(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_document_end(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_empty_array(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_empty_array(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_empty_object(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code visit_empty_object(json_iterator &) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code visit_root_primitive(json_iterator &, const uint8_t *) { return SUCCESS; }
|
simdjson_inline error_code visit_root_primitive(json_iterator &, const uint8_t *) { return SUCCESS; }
|
||||||
simdjson_really_inline error_code increment_count(json_iterator &) { return SUCCESS; }
|
simdjson_inline error_code increment_count(json_iterator &) { return SUCCESS; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: this assumes the dom_parser is already allocated
|
// NOTE: this assumes the dom_parser is already allocated
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace partial_tweets {
|
|||||||
struct nlohmann_json {
|
struct nlohmann_json {
|
||||||
using StringType=std::string;
|
using StringType=std::string;
|
||||||
|
|
||||||
simdjson_really_inline uint64_t nullable_int(nlohmann::json value) {
|
simdjson_inline uint64_t nullable_int(nlohmann::json value) {
|
||||||
if (value.is_null()) { return 0; }
|
if (value.is_null()) { return 0; }
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -37,4 +37,4 @@ BENCHMARK_TEMPLATE(partial_tweets, nlohmann_json)->UseManualTime();
|
|||||||
|
|
||||||
} // namespace partial_tweets
|
} // namespace partial_tweets
|
||||||
|
|
||||||
#endif // SIMDJSON_COMPETITION_NLOHMANN_JSON
|
#endif // SIMDJSON_COMPETITION_NLOHMANN_JSON
|
||||||
|
|||||||
@@ -17,27 +17,27 @@ public:
|
|||||||
displayed_implementation = true;
|
displayed_implementation = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool Run(const padded_string &json);
|
simdjson_inline bool Run(const padded_string &json);
|
||||||
simdjson_really_inline const std::vector<tweet> &Result() { return tweets; }
|
simdjson_inline const std::vector<tweet> &Result() { return tweets; }
|
||||||
simdjson_really_inline size_t ItemCount() { return tweets.size(); }
|
simdjson_inline size_t ItemCount() { return tweets.size(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ondemand::parser parser{};
|
ondemand::parser parser{};
|
||||||
std::vector<tweet> tweets{};
|
std::vector<tweet> tweets{};
|
||||||
|
|
||||||
simdjson_really_inline uint64_t nullable_int(ondemand::value value) {
|
simdjson_inline uint64_t nullable_int(ondemand::value value) {
|
||||||
if (value.is_null()) { return 0; }
|
if (value.is_null()) { return 0; }
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline twitter_user read_user(ondemand::object user) {
|
simdjson_inline twitter_user read_user(ondemand::object user) {
|
||||||
return { user.find_field("id"), user.find_field("screen_name") };
|
return { user.find_field("id"), user.find_field("screen_name") };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool displayed_implementation = false;
|
static inline bool displayed_implementation = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_really_inline bool OnDemand::Run(const padded_string &json) {
|
simdjson_inline bool OnDemand::Run(const padded_string &json) {
|
||||||
tweets.clear();
|
tweets.clear();
|
||||||
|
|
||||||
// Walk the document, parsing the tweets as we go
|
// Walk the document, parsing the tweets as we go
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ struct runner : public file_runner<I> {
|
|||||||
|
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void partial_tweets(benchmark::State &state) {
|
template<typename I> simdjson_inline static void partial_tweets(benchmark::State &state) {
|
||||||
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,27 +13,27 @@ struct rapidjson_base {
|
|||||||
|
|
||||||
Document doc{};
|
Document doc{};
|
||||||
|
|
||||||
simdjson_really_inline std::string_view get_string_view(Value &object, std::string_view key) {
|
simdjson_inline std::string_view get_string_view(Value &object, std::string_view key) {
|
||||||
// TODO use version that supports passing string length?
|
// TODO use version that supports passing string length?
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing object field"; }
|
if (field == object.MemberEnd()) { throw "Missing object field"; }
|
||||||
if (!field->value.IsString()) { throw "Field is not a string"; }
|
if (!field->value.IsString()) { throw "Field is not a string"; }
|
||||||
return { field->value.GetString(), field->value.GetStringLength() };
|
return { field->value.GetString(), field->value.GetStringLength() };
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_uint64(Value &object, std::string_view key) {
|
simdjson_inline uint64_t get_uint64(Value &object, std::string_view key) {
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing object field"; }
|
if (field == object.MemberEnd()) { throw "Missing object field"; }
|
||||||
if (!field->value.IsUint64()) { throw "Field is not uint64"; }
|
if (!field->value.IsUint64()) { throw "Field is not uint64"; }
|
||||||
return field->value.GetUint64();
|
return field->value.GetUint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_nullable_uint64(Value &object, std::string_view key) {
|
simdjson_inline uint64_t get_nullable_uint64(Value &object, std::string_view key) {
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing nullable uint64 field"; }
|
if (field == object.MemberEnd()) { throw "Missing nullable uint64 field"; }
|
||||||
if (field->value.IsNull()) { return 0; }
|
if (field->value.IsNull()) { return 0; }
|
||||||
if (!field->value.IsUint64()) { throw "Field is not nullable uint64"; }
|
if (!field->value.IsUint64()) { throw "Field is not nullable uint64"; }
|
||||||
return field->value.GetUint64();
|
return field->value.GetUint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline partial_tweets::twitter_user<std::string_view> get_user(Value &object, std::string_view key) {
|
simdjson_inline partial_tweets::twitter_user<std::string_view> get_user(Value &object, std::string_view key) {
|
||||||
auto field = object.FindMember(key.data());
|
auto field = object.FindMember(key.data());
|
||||||
if (field == object.MemberEnd()) { throw "Missing user field"; }
|
if (field == object.MemberEnd()) { throw "Missing user field"; }
|
||||||
if (!field->value.IsObject()) { throw "User field is not an object"; }
|
if (!field->value.IsObject()) { throw "User field is not an object"; }
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ struct sajson {
|
|||||||
size_t *ast_buffer{nullptr};
|
size_t *ast_buffer{nullptr};
|
||||||
~sajson() { free(ast_buffer); }
|
~sajson() { free(ast_buffer); }
|
||||||
|
|
||||||
simdjson_really_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline std::string_view get_string_view(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field is not a string"; }
|
||||||
return { val.as_cstring(), val.get_string_length() };
|
return { val.as_cstring(), val.get_string_length() };
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_uint52(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline uint64_t get_uint52(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
switch (val.get_type()) {
|
switch (val.get_type()) {
|
||||||
case ::sajson::TYPE_INTEGER: {
|
case ::sajson::TYPE_INTEGER: {
|
||||||
@@ -30,7 +30,7 @@ struct sajson {
|
|||||||
throw "field not integer";
|
throw "field not integer";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline uint64_t get_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
||||||
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
// Since sajson only supports 53-bit numbers, and IDs in twitter.json can be > 53 bits, we read the corresponding id_str and parse that.
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
||||||
@@ -40,7 +40,7 @@ struct sajson {
|
|||||||
if (endptr != &str[val.get_string_length()]) { throw "field is a string, but not an integer string"; }
|
if (endptr != &str[val.get_string_length()]) { throw "field is a string, but not an integer string"; }
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_nullable_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline uint64_t get_nullable_str_uint64(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto val = obj.get_value_of_key({key.data(), key.length()});
|
auto val = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (val.get_type() == ::sajson::TYPE_NULL) { return 0; }
|
if (val.get_type() == ::sajson::TYPE_NULL) { return 0; }
|
||||||
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
if (val.get_type() != ::sajson::TYPE_STRING) { throw "field not a string"; }
|
||||||
@@ -50,7 +50,7 @@ struct sajson {
|
|||||||
if (endptr != &str[val.get_string_length()]) { throw "field is a string, but not an integer string"; }
|
if (endptr != &str[val.get_string_length()]) { throw "field is a string, but not an integer string"; }
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
simdjson_really_inline partial_tweets::twitter_user<std::string_view> get_user(const ::sajson::value &obj, std::string_view key) {
|
simdjson_inline partial_tweets::twitter_user<std::string_view> get_user(const ::sajson::value &obj, std::string_view key) {
|
||||||
auto user = obj.get_value_of_key({key.data(), key.length()});
|
auto user = obj.get_value_of_key({key.data(), key.length()});
|
||||||
if (user.get_type() != ::sajson::TYPE_OBJECT) { throw "user is not an object"; }
|
if (user.get_type() != ::sajson::TYPE_OBJECT) { throw "user is not an object"; }
|
||||||
return { get_str_uint64(user, "id_str"), get_string_view(user, "screen_name") };
|
return { get_str_uint64(user, "id_str"), get_string_view(user, "screen_name") };
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct simdjson_dom {
|
|||||||
|
|
||||||
dom::parser parser{};
|
dom::parser parser{};
|
||||||
|
|
||||||
simdjson_really_inline uint64_t nullable_int(dom::element element) {
|
simdjson_inline uint64_t nullable_int(dom::element element) {
|
||||||
if (element.is_null()) { return 0; }
|
if (element.is_null()) { return 0; }
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
@@ -40,4 +40,4 @@ BENCHMARK_TEMPLATE(partial_tweets, simdjson_dom)->UseManualTime();
|
|||||||
|
|
||||||
} // namespace partial_tweets
|
} // namespace partial_tweets
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ struct simdjson_ondemand {
|
|||||||
|
|
||||||
ondemand::parser parser{};
|
ondemand::parser parser{};
|
||||||
|
|
||||||
simdjson_really_inline uint64_t nullable_int(ondemand::value value) {
|
simdjson_inline uint64_t nullable_int(ondemand::value value) {
|
||||||
if (value.is_null()) { return 0; }
|
if (value.is_null()) { return 0; }
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline twitter_user<std::string_view> read_user(ondemand::object user) {
|
simdjson_inline twitter_user<std::string_view> read_user(ondemand::object user) {
|
||||||
return { user.find_field("id"), user.find_field("screen_name") };
|
return { user.find_field("id"), user.find_field("screen_name") };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ struct tweet {
|
|||||||
uint64_t retweet_count{};
|
uint64_t retweet_count{};
|
||||||
uint64_t favorite_count{};
|
uint64_t favorite_count{};
|
||||||
template<typename OtherStringType>
|
template<typename OtherStringType>
|
||||||
simdjson_really_inline bool operator==(const tweet<OtherStringType> &other) const {
|
simdjson_inline bool operator==(const tweet<OtherStringType> &other) const {
|
||||||
return created_at == other.created_at &&
|
return created_at == other.created_at &&
|
||||||
id == other.id &&
|
id == other.id &&
|
||||||
result == other.result &&
|
result == other.result &&
|
||||||
@@ -42,7 +42,7 @@ struct tweet {
|
|||||||
favorite_count == other.favorite_count;
|
favorite_count == other.favorite_count;
|
||||||
}
|
}
|
||||||
template<typename OtherStringType>
|
template<typename OtherStringType>
|
||||||
simdjson_really_inline bool operator!=(const tweet<OtherStringType> &other) const { return !(*this == other); }
|
simdjson_inline bool operator!=(const tweet<OtherStringType> &other) const { return !(*this == other); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename StringType>
|
template<typename StringType>
|
||||||
|
|||||||
@@ -9,24 +9,24 @@ namespace partial_tweets {
|
|||||||
struct yyjson_base {
|
struct yyjson_base {
|
||||||
using StringType=std::string_view;
|
using StringType=std::string_view;
|
||||||
|
|
||||||
simdjson_really_inline std::string_view get_string_view(yyjson_val *obj, std::string_view key) {
|
simdjson_inline std::string_view get_string_view(yyjson_val *obj, std::string_view key) {
|
||||||
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!yyjson_is_str(val)) { throw "field is not uint64 or null!"; }
|
if (!yyjson_is_str(val)) { throw "field is not uint64 or null!"; }
|
||||||
return { yyjson_get_str(val), yyjson_get_len(val) };
|
return { yyjson_get_str(val), yyjson_get_len(val) };
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_uint64(yyjson_val *obj, std::string_view key) {
|
simdjson_inline uint64_t get_uint64(yyjson_val *obj, std::string_view key) {
|
||||||
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!yyjson_is_uint(val)) { throw "field is not uint64 or null!"; }
|
if (!yyjson_is_uint(val)) { throw "field is not uint64 or null!"; }
|
||||||
return yyjson_get_uint(val);
|
return yyjson_get_uint(val);
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint64_t get_nullable_uint64(yyjson_val *obj, std::string_view key) {
|
simdjson_inline uint64_t get_nullable_uint64(yyjson_val *obj, std::string_view key) {
|
||||||
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
auto val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!yyjson_is_uint(val)) { }
|
if (!yyjson_is_uint(val)) { }
|
||||||
auto type = yyjson_get_type(val);
|
auto type = yyjson_get_type(val);
|
||||||
if (type != YYJSON_TYPE_NUM && type != YYJSON_TYPE_NULL ) { throw "field is not uint64 or null!"; }
|
if (type != YYJSON_TYPE_NUM && type != YYJSON_TYPE_NULL ) { throw "field is not uint64 or null!"; }
|
||||||
return yyjson_get_uint(val);
|
return yyjson_get_uint(val);
|
||||||
}
|
}
|
||||||
simdjson_really_inline partial_tweets::twitter_user<std::string_view> get_user(yyjson_val *obj, std::string_view key) {
|
simdjson_inline partial_tweets::twitter_user<std::string_view> get_user(yyjson_val *obj, std::string_view key) {
|
||||||
auto user = yyjson_obj_getn(obj, key.data(), key.length());
|
auto user = yyjson_obj_getn(obj, key.data(), key.length());
|
||||||
if (!yyjson_is_obj(user)) { throw "missing twitter user field!"; }
|
if (!yyjson_is_obj(user)) { throw "missing twitter user field!"; }
|
||||||
return { get_uint64(user, "id"), get_string_view(user, "screen_name") };
|
return { get_uint64(user, "id"), get_string_view(user, "screen_name") };
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ struct top_tweet_result {
|
|||||||
StringType screen_name{};
|
StringType screen_name{};
|
||||||
StringType text{};
|
StringType text{};
|
||||||
template<typename OtherStringType>
|
template<typename OtherStringType>
|
||||||
simdjson_really_inline bool operator==(const top_tweet_result<OtherStringType> &other) const {
|
simdjson_inline bool operator==(const top_tweet_result<OtherStringType> &other) const {
|
||||||
return retweet_count == other.retweet_count &&
|
return retweet_count == other.retweet_count &&
|
||||||
screen_name == other.screen_name &&
|
screen_name == other.screen_name &&
|
||||||
text == other.text;
|
text == other.text;
|
||||||
}
|
}
|
||||||
template<typename OtherStringType>
|
template<typename OtherStringType>
|
||||||
simdjson_really_inline bool operator!=(const top_tweet_result<OtherStringType> &other) const { return !(*this == other); }
|
simdjson_inline bool operator!=(const top_tweet_result<OtherStringType> &other) const { return !(*this == other); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename StringType>
|
template<typename StringType>
|
||||||
@@ -60,7 +60,7 @@ struct runner : public file_runner<I> {
|
|||||||
|
|
||||||
struct simdjson_dom;
|
struct simdjson_dom;
|
||||||
|
|
||||||
template<typename I> simdjson_really_inline static void top_tweet(benchmark::State &state) {
|
template<typename I> simdjson_inline static void top_tweet(benchmark::State &state) {
|
||||||
json_benchmark::run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
json_benchmark::run_json_benchmark<runner<I>, runner<simdjson_dom>>(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
-2
@@ -70,11 +70,11 @@ int main() {}
|
|||||||
target_include_directories(jsmn SYSTEM PUBLIC "${jsmn_SOURCE_DIR}")
|
target_include_directories(jsmn SYSTEM PUBLIC "${jsmn_SOURCE_DIR}")
|
||||||
target_compile_definitions(jsmn INTERFACE SIMDJSON_COMPETITION_JSMN)
|
target_compile_definitions(jsmn INTERFACE SIMDJSON_COMPETITION_JSMN)
|
||||||
|
|
||||||
message(STATUS "Importing json (nlohmann/json@v3.9.1)")
|
message(STATUS "Importing json (nlohmann/json@v3.10.5)")
|
||||||
set(nlohmann_json_SOURCE_DIR "${dep_root}/json")
|
set(nlohmann_json_SOURCE_DIR "${dep_root}/json")
|
||||||
if(NOT EXISTS "${nlohmann_json_SOURCE_DIR}")
|
if(NOT EXISTS "${nlohmann_json_SOURCE_DIR}")
|
||||||
file(DOWNLOAD
|
file(DOWNLOAD
|
||||||
"https://github.com/nlohmann/json/releases/download/v3.9.1/json.hpp"
|
"https://github.com/nlohmann/json/releases/download/v3.10.5/json.hpp"
|
||||||
"${nlohmann_json_SOURCE_DIR}/nlohmann/json.hpp")
|
"${nlohmann_json_SOURCE_DIR}/nlohmann/json.hpp")
|
||||||
endif()
|
endif()
|
||||||
add_library(nlohmann_json INTERFACE)
|
add_library(nlohmann_json INTERFACE)
|
||||||
|
|||||||
+192
-90
@@ -79,6 +79,150 @@ license you like.
|
|||||||
/// to prevent private header inclusion.
|
/// to prevent private header inclusion.
|
||||||
#define JSON_IS_AMALGAMATION
|
#define JSON_IS_AMALGAMATION
|
||||||
|
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
// Beginning of content of file: include/json/version.h
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef JSON_VERSION_H_INCLUDED
|
||||||
|
#define JSON_VERSION_H_INCLUDED
|
||||||
|
|
||||||
|
// Note: version must be updated in three places when doing a release. This
|
||||||
|
// annoying process ensures that amalgamate, CMake, and meson all report the
|
||||||
|
// correct version.
|
||||||
|
// 1. /meson.build
|
||||||
|
// 2. /include/json/version.h
|
||||||
|
// 3. /CMakeLists.txt
|
||||||
|
// IMPORTANT: also update the SOVERSION!!
|
||||||
|
|
||||||
|
#define JSONCPP_VERSION_STRING "1.9.5"
|
||||||
|
#define JSONCPP_VERSION_MAJOR 1
|
||||||
|
#define JSONCPP_VERSION_MINOR 9
|
||||||
|
#define JSONCPP_VERSION_PATCH 5
|
||||||
|
#define JSONCPP_VERSION_QUALIFIER
|
||||||
|
#define JSONCPP_VERSION_HEXA \
|
||||||
|
((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \
|
||||||
|
(JSONCPP_VERSION_PATCH << 8))
|
||||||
|
|
||||||
|
#ifdef JSONCPP_USING_SECURE_MEMORY
|
||||||
|
#undef JSONCPP_USING_SECURE_MEMORY
|
||||||
|
#endif
|
||||||
|
#define JSONCPP_USING_SECURE_MEMORY 0
|
||||||
|
// If non-zero, the library zeroes any memory that it has allocated before
|
||||||
|
// it frees its memory.
|
||||||
|
|
||||||
|
#endif // JSON_VERSION_H_INCLUDED
|
||||||
|
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
// End of content of file: include/json/version.h
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
// Beginning of content of file: include/json/allocator.h
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
|
// Distributed under MIT license, or public domain if desired and
|
||||||
|
// recognized in your jurisdiction.
|
||||||
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
#ifndef JSON_ALLOCATOR_H_INCLUDED
|
||||||
|
#define JSON_ALLOCATOR_H_INCLUDED
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
|
namespace Json {
|
||||||
|
template <typename T> class SecureAllocator {
|
||||||
|
public:
|
||||||
|
// Type definitions
|
||||||
|
using value_type = T;
|
||||||
|
using pointer = T*;
|
||||||
|
using const_pointer = const T*;
|
||||||
|
using reference = T&;
|
||||||
|
using const_reference = const T&;
|
||||||
|
using size_type = std::size_t;
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate memory for N items using the standard allocator.
|
||||||
|
*/
|
||||||
|
pointer allocate(size_type n) {
|
||||||
|
// allocate using "global operator new"
|
||||||
|
return static_cast<pointer>(::operator new(n * sizeof(T)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release memory which was allocated for N items at pointer P.
|
||||||
|
*
|
||||||
|
* The memory block is filled with zeroes before being released.
|
||||||
|
*/
|
||||||
|
void deallocate(pointer p, size_type n) {
|
||||||
|
// memset_s is used because memset may be optimized away by the compiler
|
||||||
|
memset_s(p, n * sizeof(T), 0, n * sizeof(T));
|
||||||
|
// free using "global operator delete"
|
||||||
|
::operator delete(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct an item in-place at pointer P.
|
||||||
|
*/
|
||||||
|
template <typename... Args> void construct(pointer p, Args&&... args) {
|
||||||
|
// construct using "placement new" and "perfect forwarding"
|
||||||
|
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_type max_size() const { return size_t(-1) / sizeof(T); }
|
||||||
|
|
||||||
|
pointer address(reference x) const { return std::addressof(x); }
|
||||||
|
|
||||||
|
const_pointer address(const_reference x) const { return std::addressof(x); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy an item in-place at pointer P.
|
||||||
|
*/
|
||||||
|
void destroy(pointer p) {
|
||||||
|
// destroy using "explicit destructor"
|
||||||
|
p->~T();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Boilerplate
|
||||||
|
SecureAllocator() {}
|
||||||
|
template <typename U> SecureAllocator(const SecureAllocator<U>&) {}
|
||||||
|
template <typename U> struct rebind { using other = SecureAllocator<U>; };
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#endif // JSON_ALLOCATOR_H_INCLUDED
|
||||||
|
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
// End of content of file: include/json/allocator.h
|
||||||
|
// //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// //////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////
|
||||||
// Beginning of content of file: include/json/config.h
|
// Beginning of content of file: include/json/config.h
|
||||||
// //////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////
|
||||||
@@ -99,47 +243,38 @@ license you like.
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
/// If defined, indicates that json library is embedded in CppTL library.
|
|
||||||
//# define JSON_IN_CPPTL 1
|
|
||||||
|
|
||||||
/// If defined, indicates that json may leverage CppTL library
|
|
||||||
//# define JSON_USE_CPPTL 1
|
|
||||||
/// If defined, indicates that cpptl vector based map should be used instead of
|
|
||||||
/// std::map
|
|
||||||
/// as Value container.
|
|
||||||
//# define JSON_USE_CPPTL_SMALLMAP 1
|
|
||||||
|
|
||||||
// If non-zero, the library uses exceptions to report bad input instead of C
|
// If non-zero, the library uses exceptions to report bad input instead of C
|
||||||
// assertion macros. The default is to use exceptions.
|
// assertion macros. The default is to use exceptions.
|
||||||
#ifndef JSON_USE_EXCEPTION
|
#ifndef JSON_USE_EXCEPTION
|
||||||
#define JSON_USE_EXCEPTION 1
|
#define JSON_USE_EXCEPTION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Temporary, tracked for removal with issue #982.
|
||||||
|
#ifndef JSON_USE_NULLREF
|
||||||
|
#define JSON_USE_NULLREF 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/// If defined, indicates that the source file is amalgamated
|
/// If defined, indicates that the source file is amalgamated
|
||||||
/// to prevent private header inclusion.
|
/// to prevent private header inclusion.
|
||||||
/// Remarks: it is automatically defined in the generated amalgamated header.
|
/// Remarks: it is automatically defined in the generated amalgamated header.
|
||||||
// #define JSON_IS_AMALGAMATION
|
// #define JSON_IS_AMALGAMATION
|
||||||
|
|
||||||
#ifdef JSON_IN_CPPTL
|
// Export macros for DLL visibility
|
||||||
#include <cpptl/config.h>
|
#if defined(JSON_DLL_BUILD)
|
||||||
#ifndef JSON_USE_CPPTL
|
|
||||||
#define JSON_USE_CPPTL 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JSON_IN_CPPTL
|
|
||||||
#define JSON_API CPPTL_API
|
|
||||||
#elif defined(JSON_DLL_BUILD)
|
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
#define JSON_API __declspec(dllexport)
|
#define JSON_API __declspec(dllexport)
|
||||||
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
||||||
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define JSON_API __attribute__((visibility("default")))
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
|
|
||||||
#elif defined(JSON_DLL)
|
#elif defined(JSON_DLL)
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
#define JSON_API __declspec(dllimport)
|
#define JSON_API __declspec(dllimport)
|
||||||
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
#endif // ifdef JSON_IN_CPPTL
|
#endif // ifdef JSON_DLL_BUILD
|
||||||
|
|
||||||
#if !defined(JSON_API)
|
#if !defined(JSON_API)
|
||||||
#define JSON_API
|
#define JSON_API
|
||||||
#endif
|
#endif
|
||||||
@@ -152,8 +287,8 @@ license you like.
|
|||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
// As recommended at
|
// As recommended at
|
||||||
// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
|
// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
|
||||||
extern JSON_API int
|
extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size,
|
||||||
msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
|
const char* format, ...);
|
||||||
#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
|
#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
|
||||||
#else
|
#else
|
||||||
#define jsoncpp_snprintf std::snprintf
|
#define jsoncpp_snprintf std::snprintf
|
||||||
@@ -164,69 +299,30 @@ msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
|
|||||||
// Storages, and 64 bits integer support is disabled.
|
// Storages, and 64 bits integer support is disabled.
|
||||||
// #define JSON_NO_INT64 1
|
// #define JSON_NO_INT64 1
|
||||||
|
|
||||||
#if defined(_MSC_VER) // MSVC
|
|
||||||
#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
|
||||||
#endif // defined(_MSC_VER)
|
|
||||||
|
|
||||||
// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
|
// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
|
||||||
// C++11 should be used directly in JSONCPP.
|
// C++11 should be used directly in JSONCPP.
|
||||||
#define JSONCPP_OVERRIDE override
|
#define JSONCPP_OVERRIDE override
|
||||||
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
#define JSONCPP_NOEXCEPT noexcept
|
|
||||||
#define JSONCPP_OP_EXPLICIT explicit
|
|
||||||
#elif defined(_MSC_VER) && _MSC_VER < 1900
|
|
||||||
#define JSONCPP_NOEXCEPT throw()
|
|
||||||
#define JSONCPP_OP_EXPLICIT explicit
|
|
||||||
#elif defined(_MSC_VER) && _MSC_VER >= 1900
|
|
||||||
#define JSONCPP_NOEXCEPT noexcept
|
|
||||||
#define JSONCPP_OP_EXPLICIT explicit
|
|
||||||
#else
|
|
||||||
#define JSONCPP_NOEXCEPT throw()
|
|
||||||
#define JSONCPP_OP_EXPLICIT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef JSON_HAS_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // MSVC >= 2013
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
#if __has_feature(cxx_rvalue_references)
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // has_feature
|
|
||||||
|
|
||||||
#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
|
||||||
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // GXX_EXPERIMENTAL
|
|
||||||
|
|
||||||
#endif // __clang__ || __GNUC__
|
|
||||||
|
|
||||||
#endif // not defined JSON_HAS_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
#ifndef JSON_HAS_RVALUE_REFERENCES
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
#if __has_extension(attribute_deprecated_with_message)
|
#if __has_extension(attribute_deprecated_with_message)
|
||||||
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
#endif
|
#endif
|
||||||
#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc)
|
||||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
|
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
|
||||||
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
||||||
#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
|
#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
|
||||||
#endif // GNUC version
|
#endif // GNUC version
|
||||||
#endif // __clang__ || __GNUC__
|
#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates
|
||||||
|
// MSVC)
|
||||||
|
#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
||||||
|
#endif // __clang__ || __GNUC__ || _MSC_VER
|
||||||
|
|
||||||
#if !defined(JSONCPP_DEPRECATED)
|
#if !defined(JSONCPP_DEPRECATED)
|
||||||
#define JSONCPP_DEPRECATED(message)
|
#define JSONCPP_DEPRECATED(message)
|
||||||
#endif // if !defined(JSONCPP_DEPRECATED)
|
#endif // if !defined(JSONCPP_DEPRECATED)
|
||||||
|
|
||||||
#if __GNUC__ >= 6
|
#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6))
|
||||||
#define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
#define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -238,37 +334,37 @@ msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
|
|||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
typedef int Int;
|
using Int = int;
|
||||||
typedef unsigned int UInt;
|
using UInt = unsigned int;
|
||||||
#if defined(JSON_NO_INT64)
|
#if defined(JSON_NO_INT64)
|
||||||
typedef int LargestInt;
|
using LargestInt = int;
|
||||||
typedef unsigned int LargestUInt;
|
using LargestUInt = unsigned int;
|
||||||
#undef JSON_HAS_INT64
|
#undef JSON_HAS_INT64
|
||||||
#else // if defined(JSON_NO_INT64)
|
#else // if defined(JSON_NO_INT64)
|
||||||
// For Microsoft Visual use specific types as long long is not supported
|
// For Microsoft Visual use specific types as long long is not supported
|
||||||
#if defined(_MSC_VER) // Microsoft Visual Studio
|
#if defined(_MSC_VER) // Microsoft Visual Studio
|
||||||
typedef __int64 Int64;
|
using Int64 = __int64;
|
||||||
typedef unsigned __int64 UInt64;
|
using UInt64 = unsigned __int64;
|
||||||
#else // if defined(_MSC_VER) // Other platforms, use long long
|
#else // if defined(_MSC_VER) // Other platforms, use long long
|
||||||
typedef int64_t Int64;
|
using Int64 = int64_t;
|
||||||
typedef uint64_t UInt64;
|
using UInt64 = uint64_t;
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
typedef Int64 LargestInt;
|
using LargestInt = Int64;
|
||||||
typedef UInt64 LargestUInt;
|
using LargestUInt = UInt64;
|
||||||
#define JSON_HAS_INT64
|
#define JSON_HAS_INT64
|
||||||
#endif // if defined(JSON_NO_INT64)
|
#endif // if defined(JSON_NO_INT64)
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using Allocator = typename std::conditional<JSONCPP_USING_SECURE_MEMORY,
|
using Allocator =
|
||||||
SecureAllocator<T>,
|
typename std::conditional<JSONCPP_USING_SECURE_MEMORY, SecureAllocator<T>,
|
||||||
std::allocator<T>>::type;
|
std::allocator<T>>::type;
|
||||||
using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
|
using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
|
||||||
using IStringStream = std::basic_istringstream<String::value_type,
|
using IStringStream =
|
||||||
String::traits_type,
|
std::basic_istringstream<String::value_type, String::traits_type,
|
||||||
String::allocator_type>;
|
String::allocator_type>;
|
||||||
using OStringStream = std::basic_ostringstream<String::value_type,
|
using OStringStream =
|
||||||
String::traits_type,
|
std::basic_ostringstream<String::value_type, String::traits_type,
|
||||||
String::allocator_type>;
|
String::allocator_type>;
|
||||||
using IStream = std::istream;
|
using IStream = std::istream;
|
||||||
using OStream = std::ostream;
|
using OStream = std::ostream;
|
||||||
} // namespace Json
|
} // namespace Json
|
||||||
@@ -310,17 +406,23 @@ using JSONCPP_OSTREAM = Json::OStream;
|
|||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
// writer.h
|
// writer.h
|
||||||
|
class StreamWriter;
|
||||||
|
class StreamWriterBuilder;
|
||||||
|
class Writer;
|
||||||
class FastWriter;
|
class FastWriter;
|
||||||
class StyledWriter;
|
class StyledWriter;
|
||||||
|
class StyledStreamWriter;
|
||||||
|
|
||||||
// reader.h
|
// reader.h
|
||||||
class Reader;
|
class Reader;
|
||||||
|
class CharReader;
|
||||||
|
class CharReaderBuilder;
|
||||||
|
|
||||||
// features.h
|
// json_features.h
|
||||||
class Features;
|
class Features;
|
||||||
|
|
||||||
// value.h
|
// value.h
|
||||||
typedef unsigned int ArrayIndex;
|
using ArrayIndex = unsigned int;
|
||||||
class StaticString;
|
class StaticString;
|
||||||
class Path;
|
class Path;
|
||||||
class PathArgument;
|
class PathArgument;
|
||||||
|
|||||||
Vendored
+541
-561
File diff suppressed because it is too large
Load Diff
Vendored
+508
-604
File diff suppressed because it is too large
Load Diff
+25
-16
@@ -245,27 +245,34 @@ transcode the UTF-8 strings produced by the simdjson library to other formats. S
|
|||||||
Using the Parsed JSON
|
Using the Parsed JSON
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
We recommend that you first compile and run your code in Debug mode: under Visual Studio,
|
||||||
|
it means having the `_DEBUG` macro defined, and, for other compilers, it means leaving
|
||||||
We recommend that you first compile and run your code in Debug mode (with `NDEBUG`
|
the `__OPTIMIZE__` macro undefined. The simdjson code will set `SIMDJSON_DEVELOPMENT_CHECKS=1`.
|
||||||
undefined). When you do so, the simdjson library runs additional sanity tests on
|
Alternatively, you can set the macro `SIMDJSON_DEVELOPMENT_CHECKS` to 1 prior to including
|
||||||
your code to help ensure that you are using the library in a safe manner. Once
|
the `simdjson.h` header to enable these additional checks: just make sure you remove the
|
||||||
your code has been tested, you can then run it in Release mode (with `NDEBUG`
|
definition once your code has been tested. When `SIMDJSON_DEVELOPMENT_CHECKS` is set to 1, the
|
||||||
defined) for best performance. Alternatively, you can set the macro
|
simdjson library runs additional (expensive) tests on your code to help ensure that you are
|
||||||
`SIMDJSON_DEVELOPMENT_CHECKS` to 1 prior to including the `simdjson.h` header
|
using the library in a safe manner. Once your code has been tested, you can then run it in
|
||||||
to enable these additional checks: just make sure you remove the definition once your
|
Release mode: under Visual Studio, it means having the `_DEBUG` macro undefined, and, for other
|
||||||
code has been tested.
|
compilers, it means setting `__OPTIMIZE__` to a positive integer. You can also forcefully
|
||||||
|
disable these checks by setting `SIMDJSON_DEVELOPMENT_CHECKS` to 0. Once your code is tested, we
|
||||||
|
further encourage you to define `NDEBUG` in your Release builds to disable additional runtime
|
||||||
|
testing and get the best performance.
|
||||||
|
|
||||||
Once you have a document (`simdjson::ondemand::document`), you can navigate it with
|
Once you have a document (`simdjson::ondemand::document`), you can navigate it with
|
||||||
idiomatic C++ iterators, operators and casts. Besides the document instances and
|
idiomatic C++ iterators, operators and casts. Besides the document instances and
|
||||||
native types (`double`, `uint64_t`, `int64_t`, `bool`), we also access
|
native types (`double`, `uint64_t`, `int64_t`, `bool`), we also access
|
||||||
Unicode (UTF-8) strings (`std::string_view`), objects (`simdjson::ondemand::object`)
|
Unicode (UTF-8) strings (`std::string_view`), objects (`simdjson::ondemand::object`)
|
||||||
and arrays (`simdjson::ondemand::array`).
|
and arrays (`simdjson::ondemand::array`).
|
||||||
We also have a generic type (`simdjson::ondemand::value`) which represents a potential
|
We also have a generic ephemeral type (`simdjson::ondemand::value`) which represents a potential
|
||||||
array or object, or scalar type (`double`, `uint64_t`, `int64_t`, `bool`, `null`, string) inside
|
array or object, or scalar type (`double`, `uint64_t`, `int64_t`, `bool`, `null`, string) inside
|
||||||
an array or an object. Both generic types (`simdjson::ondemand::document` and
|
an array or an object. Both generic types (`simdjson::ondemand::document` and
|
||||||
`simdjson::ondemand::value`) have a `type()` method returning a `json_type` value describing the
|
`simdjson::ondemand::value`) have a `type()` method returning a `json_type` value describing the
|
||||||
value (`json_type::array`, `json_type::object`, `json_type::number`, `json_type::string`, `json_type::boolean`, `json_type::null`).
|
value (`json_type::array`, `json_type::object`, `json_type::number`, `json_type::string`,
|
||||||
|
`json_type::boolean`, `json_type::null`). A generic value (`simdjson::ondemand::value`)
|
||||||
|
is only valid temporarily, as soon as you access other values, other keys in objects, etc.
|
||||||
|
it becomes invalid: you should therefore consume the value immediately by converting it to a
|
||||||
|
scalar type, an array or an object.
|
||||||
|
|
||||||
Advanced users who need to determine the number types (integer or float) dynamically,
|
Advanced users who need to determine the number types (integer or float) dynamically,
|
||||||
should review our section [dynamic number types](#dynamic-number-types). Indeed,
|
should review our section [dynamic number types](#dynamic-number-types). Indeed,
|
||||||
@@ -300,10 +307,12 @@ support for users who avoid exceptions. See [the simdjson error handling documen
|
|||||||
comparison. For efficiency reason, you should avoid looking up the same field repeatedly: e.g., do
|
comparison. For efficiency reason, you should avoid looking up the same field repeatedly: e.g., do
|
||||||
not do `object["foo"]` followed by `object["foo"]` with the same `object` instance. If you consume an
|
not do `object["foo"]` followed by `object["foo"]` with the same `object` instance. If you consume an
|
||||||
object twice: `std::string_view(object["foo"]` followed by `std::string_view(object["foo"]`, your code
|
object twice: `std::string_view(object["foo"]` followed by `std::string_view(object["foo"]`, your code
|
||||||
is in error. Furthermore, you can only consume one field at a time, on the same object. Thus
|
is in error. Furthermore, you can only consume one field at a time, on the same object. The
|
||||||
if you have retrieved `content["bids"].get_array()` and you later call `content["asks"].get_array()`, then the
|
value instance you get from `content["bids"]` becomes invalid when you call `content["asks"]`.
|
||||||
first array should no longer be accessed: it would be unsafe to do so. You can detect such mistakes by first
|
If you have retrieved `content["bids"].get_array()` and you later call
|
||||||
compiling and running the code in Debug mode: an OUT_OF_ORDER_ITERATION error is generated.
|
`content["asks"].get_array()`, then the first array should no longer be accessed: it would be
|
||||||
|
unsafe to do so. You can detect such mistakes by first compiling and running the code in
|
||||||
|
Debug mode: an OUT_OF_ORDER_ITERATION error is generated.
|
||||||
|
|
||||||
> NOTE: JSON allows you to escape characters in keys. E.g., the key `"date"` may be written as
|
> NOTE: JSON allows you to escape characters in keys. E.g., the key `"date"` may be written as
|
||||||
> `"\u0064\u0061\u0074\u0065"`. By default, simdjson does *not* unescape keys when matching by default.
|
> `"\u0064\u0061\u0074\u0065"`. By default, simdjson does *not* unescape keys when matching by default.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace {
|
|||||||
// but the algorithms do not end up using the returned value.
|
// but the algorithms do not end up using the returned value.
|
||||||
// Sadly, sanitizers are not smart enough to figure it out.
|
// Sadly, sanitizers are not smart enough to figure it out.
|
||||||
SIMDJSON_NO_SANITIZE_UNDEFINED
|
SIMDJSON_NO_SANITIZE_UNDEFINED
|
||||||
simdjson_really_inline int trailing_zeroes(uint64_t input_num) {
|
simdjson_inline int trailing_zeroes(uint64_t input_num) {
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
// Search the mask data from least significant bit (LSB)
|
// Search the mask data from least significant bit (LSB)
|
||||||
@@ -22,12 +22,12 @@ simdjson_really_inline int trailing_zeroes(uint64_t input_num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* result might be undefined when input_num is zero */
|
/* result might be undefined when input_num is zero */
|
||||||
simdjson_really_inline uint64_t clear_lowest_bit(uint64_t input_num) {
|
simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
|
||||||
return input_num & (input_num-1);
|
return input_num & (input_num-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* result might be undefined when input_num is zero */
|
/* result might be undefined when input_num is zero */
|
||||||
simdjson_really_inline int leading_zeroes(uint64_t input_num) {
|
simdjson_inline int leading_zeroes(uint64_t input_num) {
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
unsigned long leading_zero = 0;
|
unsigned long leading_zero = 0;
|
||||||
// Search the mask data from most significant bit (MSB)
|
// Search the mask data from most significant bit (MSB)
|
||||||
@@ -42,7 +42,7 @@ simdjson_really_inline int leading_zeroes(uint64_t input_num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* result might be undefined when input_num is zero */
|
/* result might be undefined when input_num is zero */
|
||||||
simdjson_really_inline int count_ones(uint64_t input_num) {
|
simdjson_inline int count_ones(uint64_t input_num) {
|
||||||
return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
|
return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ simdjson_really_inline int count_ones(uint64_t input_num) {
|
|||||||
#define SIMDJSON_PREFER_REVERSE_BITS 1
|
#define SIMDJSON_PREFER_REVERSE_BITS 1
|
||||||
|
|
||||||
/* reverse the bits */
|
/* reverse the bits */
|
||||||
simdjson_really_inline uint64_t reverse_bits(uint64_t input_num) {
|
simdjson_inline uint64_t reverse_bits(uint64_t input_num) {
|
||||||
uint64_t rev_bits;
|
uint64_t rev_bits;
|
||||||
__asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
|
__asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
|
||||||
return rev_bits;
|
return rev_bits;
|
||||||
@@ -74,13 +74,13 @@ simdjson_really_inline uint64_t reverse_bits(uint64_t input_num) {
|
|||||||
* of such undefined behavior is never used.
|
* of such undefined behavior is never used.
|
||||||
**/
|
**/
|
||||||
SIMDJSON_NO_SANITIZE_UNDEFINED
|
SIMDJSON_NO_SANITIZE_UNDEFINED
|
||||||
simdjson_really_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
|
simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
|
||||||
return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
|
return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
|
simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
*result = value1 + value2;
|
*result = value1 + value2;
|
||||||
return *result < value1;
|
return *result < value1;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace {
|
|||||||
//
|
//
|
||||||
// For example, prefix_xor(00100100) == 00011100
|
// For example, prefix_xor(00100100) == 00011100
|
||||||
//
|
//
|
||||||
simdjson_really_inline uint64_t prefix_xor(uint64_t bitmask) {
|
simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
|
||||||
/////////////
|
/////////////
|
||||||
// We could do this with PMULL, but it is apparently slow.
|
// We could do this with PMULL, but it is apparently slow.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using namespace simdjson::dom;
|
|||||||
|
|
||||||
class implementation final : public simdjson::implementation {
|
class implementation final : public simdjson::implementation {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline implementation() : simdjson::implementation("arm64", "ARM NEON", internal::instruction_set::NEON) {}
|
simdjson_inline implementation() : simdjson::implementation("arm64", "ARM NEON", internal::instruction_set::NEON) {}
|
||||||
simdjson_warn_unused error_code create_dom_parser_implementation(
|
simdjson_warn_unused error_code create_dom_parser_implementation(
|
||||||
size_t capacity,
|
size_t capacity,
|
||||||
size_t max_length,
|
size_t max_length,
|
||||||
|
|||||||
@@ -5,4 +5,6 @@
|
|||||||
// you use visual studio or other compilers.
|
// you use visual studio or other compilers.
|
||||||
#include <arm_neon.h>
|
#include <arm_neon.h>
|
||||||
|
|
||||||
|
static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64");
|
||||||
|
|
||||||
#endif // SIMDJSON_ARM64_INTRINSICS_H
|
#endif // SIMDJSON_ARM64_INTRINSICS_H
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace {
|
|||||||
|
|
||||||
// we don't have SSE, so let us use a scalar function
|
// we don't have SSE, so let us use a scalar function
|
||||||
// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
|
// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
|
||||||
static simdjson_really_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
|
static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
std::memcpy(&val, chars, sizeof(uint64_t));
|
std::memcpy(&val, chars, sizeof(uint64_t));
|
||||||
val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
|
val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace {
|
|||||||
* You should not use this function except for compile-time constants:
|
* You should not use this function except for compile-time constants:
|
||||||
* it is not efficient.
|
* it is not efficient.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint8x16_t make_uint8x16_t(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4,
|
simdjson_inline uint8x16_t make_uint8x16_t(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4,
|
||||||
uint8_t x5, uint8_t x6, uint8_t x7, uint8_t x8,
|
uint8_t x5, uint8_t x6, uint8_t x7, uint8_t x8,
|
||||||
uint8_t x9, uint8_t x10, uint8_t x11, uint8_t x12,
|
uint8_t x9, uint8_t x10, uint8_t x11, uint8_t x12,
|
||||||
uint8_t x13, uint8_t x14, uint8_t x15, uint8_t x16) {
|
uint8_t x13, uint8_t x14, uint8_t x15, uint8_t x16) {
|
||||||
@@ -57,7 +57,7 @@ simdjson_really_inline uint8x16_t make_uint8x16_t(uint8_t x1, uint8_t x2, uint
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint8x8_t make_uint8x8_t(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4,
|
simdjson_inline uint8x8_t make_uint8x8_t(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4,
|
||||||
uint8_t x5, uint8_t x6, uint8_t x7, uint8_t x8) {
|
uint8_t x5, uint8_t x6, uint8_t x7, uint8_t x8) {
|
||||||
uint8x8_t x{};
|
uint8x8_t x{};
|
||||||
x = vset_lane_u8(x1, x, 0);
|
x = vset_lane_u8(x1, x, 0);
|
||||||
@@ -72,7 +72,7 @@ simdjson_really_inline uint8x8_t make_uint8x8_t(uint8_t x1, uint8_t x2, uint8_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We have to do the same work for make_int8x16_t
|
// We have to do the same work for make_int8x16_t
|
||||||
simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x3, int8_t x4,
|
simdjson_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x3, int8_t x4,
|
||||||
int8_t x5, int8_t x6, int8_t x7, int8_t x8,
|
int8_t x5, int8_t x6, int8_t x7, int8_t x8,
|
||||||
int8_t x9, int8_t x10, int8_t x11, int8_t x12,
|
int8_t x9, int8_t x10, int8_t x11, int8_t x12,
|
||||||
int8_t x13, int8_t x14, int8_t x15, int8_t x16) {
|
int8_t x13, int8_t x14, int8_t x15, int8_t x16) {
|
||||||
@@ -118,24 +118,24 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
static const int SIZE = sizeof(value);
|
static const int SIZE = sizeof(value);
|
||||||
|
|
||||||
// Conversion from/to SIMD register
|
// Conversion from/to SIMD register
|
||||||
simdjson_really_inline base_u8(const uint8x16_t _value) : value(_value) {}
|
simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {}
|
||||||
simdjson_really_inline operator const uint8x16_t&() const { return this->value; }
|
simdjson_inline operator const uint8x16_t&() const { return this->value; }
|
||||||
simdjson_really_inline operator uint8x16_t&() { return this->value; }
|
simdjson_inline operator uint8x16_t&() { return this->value; }
|
||||||
|
|
||||||
// Bit operations
|
// Bit operations
|
||||||
simdjson_really_inline simd8<T> operator|(const simd8<T> other) const { return vorrq_u8(*this, other); }
|
simdjson_inline simd8<T> operator|(const simd8<T> other) const { return vorrq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<T> operator&(const simd8<T> other) const { return vandq_u8(*this, other); }
|
simdjson_inline simd8<T> operator&(const simd8<T> other) const { return vandq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<T> operator^(const simd8<T> other) const { return veorq_u8(*this, other); }
|
simdjson_inline simd8<T> operator^(const simd8<T> other) const { return veorq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<T> bit_andnot(const simd8<T> other) const { return vbicq_u8(*this, other); }
|
simdjson_inline simd8<T> bit_andnot(const simd8<T> other) const { return vbicq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<T> operator~() const { return *this ^ 0xFFu; }
|
simdjson_inline simd8<T> operator~() const { return *this ^ 0xFFu; }
|
||||||
simdjson_really_inline simd8<T>& operator|=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast | other; return *this_cast; }
|
simdjson_inline simd8<T>& operator|=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast | other; return *this_cast; }
|
||||||
simdjson_really_inline simd8<T>& operator&=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast & other; return *this_cast; }
|
simdjson_inline simd8<T>& operator&=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast & other; return *this_cast; }
|
||||||
simdjson_really_inline simd8<T>& operator^=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
|
simdjson_inline simd8<T>& operator^=(const simd8<T> other) { auto this_cast = static_cast<simd8<T>*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
|
||||||
|
|
||||||
friend simdjson_really_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return vceqq_u8(lhs, rhs); }
|
friend simdjson_inline Mask operator==(const simd8<T> lhs, const simd8<T> rhs) { return vceqq_u8(lhs, rhs); }
|
||||||
|
|
||||||
template<int N=1>
|
template<int N=1>
|
||||||
simdjson_really_inline simd8<T> prev(const simd8<T> prev_chunk) const {
|
simdjson_inline simd8<T> prev(const simd8<T> prev_chunk) const {
|
||||||
return vextq_u8(prev_chunk, *this, 16 - N);
|
return vextq_u8(prev_chunk, *this, 16 - N);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -146,17 +146,17 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
typedef uint16_t bitmask_t;
|
typedef uint16_t bitmask_t;
|
||||||
typedef uint32_t bitmask2_t;
|
typedef uint32_t bitmask2_t;
|
||||||
|
|
||||||
static simdjson_really_inline simd8<bool> splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
|
static simdjson_inline simd8<bool> splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
|
||||||
|
|
||||||
simdjson_really_inline simd8(const uint8x16_t _value) : base_u8<bool>(_value) {}
|
simdjson_inline simd8(const uint8x16_t _value) : base_u8<bool>(_value) {}
|
||||||
// False constructor
|
// False constructor
|
||||||
simdjson_really_inline simd8() : simd8(vdupq_n_u8(0)) {}
|
simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {}
|
||||||
// Splat constructor
|
// Splat constructor
|
||||||
simdjson_really_inline simd8(bool _value) : simd8(splat(_value)) {}
|
simdjson_inline simd8(bool _value) : simd8(splat(_value)) {}
|
||||||
|
|
||||||
// We return uint32_t instead of uint16_t because that seems to be more efficient for most
|
// We return uint32_t instead of uint16_t because that seems to be more efficient for most
|
||||||
// purposes (cutting it down to uint16_t costs performance in some compilers).
|
// purposes (cutting it down to uint16_t costs performance in some compilers).
|
||||||
simdjson_really_inline uint32_t to_bitmask() const {
|
simdjson_inline uint32_t to_bitmask() const {
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
const uint8x16_t bit_mask = make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
const uint8x16_t bit_mask = make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
||||||
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
|
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
|
||||||
@@ -170,26 +170,26 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
tmp = vpaddq_u8(tmp, tmp);
|
tmp = vpaddq_u8(tmp, tmp);
|
||||||
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
|
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool any() const { return vmaxvq_u8(*this) != 0; }
|
simdjson_inline bool any() const { return vmaxvq_u8(*this) != 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Unsigned bytes
|
// Unsigned bytes
|
||||||
template<>
|
template<>
|
||||||
struct simd8<uint8_t>: base_u8<uint8_t> {
|
struct simd8<uint8_t>: base_u8<uint8_t> {
|
||||||
static simdjson_really_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
|
static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
|
||||||
static simdjson_really_inline uint8x16_t zero() { return vdupq_n_u8(0); }
|
static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); }
|
||||||
static simdjson_really_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
|
static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
|
||||||
|
|
||||||
simdjson_really_inline simd8(const uint8x16_t _value) : base_u8<uint8_t>(_value) {}
|
simdjson_inline simd8(const uint8x16_t _value) : base_u8<uint8_t>(_value) {}
|
||||||
// Zero constructor
|
// Zero constructor
|
||||||
simdjson_really_inline simd8() : simd8(zero()) {}
|
simdjson_inline simd8() : simd8(zero()) {}
|
||||||
// Array constructor
|
// Array constructor
|
||||||
simdjson_really_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
|
simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
|
||||||
// Splat constructor
|
// Splat constructor
|
||||||
simdjson_really_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
|
simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
|
||||||
// Member-by-member initialization
|
// Member-by-member initialization
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
simdjson_really_inline simd8(
|
simdjson_inline simd8(
|
||||||
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
||||||
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
||||||
) : simd8(make_uint8x16_t(
|
) : simd8(make_uint8x16_t(
|
||||||
@@ -197,7 +197,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
v8, v9, v10,v11,v12,v13,v14,v15
|
v8, v9, v10,v11,v12,v13,v14,v15
|
||||||
)) {}
|
)) {}
|
||||||
#else
|
#else
|
||||||
simdjson_really_inline simd8(
|
simdjson_inline simd8(
|
||||||
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
||||||
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
||||||
) : simd8(uint8x16_t{
|
) : simd8(uint8x16_t{
|
||||||
@@ -207,7 +207,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Repeat 16 values as many times as necessary (usually for lookup tables)
|
// Repeat 16 values as many times as necessary (usually for lookup tables)
|
||||||
simdjson_really_inline static simd8<uint8_t> repeat_16(
|
simdjson_inline static simd8<uint8_t> repeat_16(
|
||||||
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, uint8_t v6, uint8_t v7,
|
||||||
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
uint8_t v8, uint8_t v9, uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
|
||||||
) {
|
) {
|
||||||
@@ -218,44 +218,44 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store to array
|
// Store to array
|
||||||
simdjson_really_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
|
simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
|
||||||
|
|
||||||
// Saturated math
|
// Saturated math
|
||||||
simdjson_really_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return vqaddq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> saturating_add(const simd8<uint8_t> other) const { return vqaddq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return vqsubq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> saturating_sub(const simd8<uint8_t> other) const { return vqsubq_u8(*this, other); }
|
||||||
|
|
||||||
// Addition/subtraction are the same for signed and unsigned
|
// Addition/subtraction are the same for signed and unsigned
|
||||||
simdjson_really_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return vaddq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> operator+(const simd8<uint8_t> other) const { return vaddq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return vsubq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> operator-(const simd8<uint8_t> other) const { return vsubq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { *this = *this + other; return *this; }
|
simdjson_inline simd8<uint8_t>& operator+=(const simd8<uint8_t> other) { *this = *this + other; return *this; }
|
||||||
simdjson_really_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { *this = *this - other; return *this; }
|
simdjson_inline simd8<uint8_t>& operator-=(const simd8<uint8_t> other) { *this = *this - other; return *this; }
|
||||||
|
|
||||||
// Order-specific operations
|
// Order-specific operations
|
||||||
simdjson_really_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
|
simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
|
||||||
simdjson_really_inline uint8_t min_val() const { return vminvq_u8(*this); }
|
simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); }
|
||||||
simdjson_really_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return vmaxq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> max_val(const simd8<uint8_t> other) const { return vmaxq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return vminq_u8(*this, other); }
|
simdjson_inline simd8<uint8_t> min_val(const simd8<uint8_t> other) const { return vminq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return vcleq_u8(*this, other); }
|
simdjson_inline simd8<bool> operator<=(const simd8<uint8_t> other) const { return vcleq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return vcgeq_u8(*this, other); }
|
simdjson_inline simd8<bool> operator>=(const simd8<uint8_t> other) const { return vcgeq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return vcltq_u8(*this, other); }
|
simdjson_inline simd8<bool> operator<(const simd8<uint8_t> other) const { return vcltq_u8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return vcgtq_u8(*this, other); }
|
simdjson_inline simd8<bool> operator>(const simd8<uint8_t> other) const { return vcgtq_u8(*this, other); }
|
||||||
// Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
|
// Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
|
||||||
simdjson_really_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); }
|
simdjson_inline simd8<uint8_t> gt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this > other); }
|
||||||
// Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
|
// Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
|
||||||
simdjson_really_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); }
|
simdjson_inline simd8<uint8_t> lt_bits(const simd8<uint8_t> other) const { return simd8<uint8_t>(*this < other); }
|
||||||
|
|
||||||
// Bit-specific operations
|
// Bit-specific operations
|
||||||
simdjson_really_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return vtstq_u8(*this, bits); }
|
simdjson_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const { return vtstq_u8(*this, bits); }
|
||||||
simdjson_really_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
|
simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
|
||||||
simdjson_really_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); }
|
simdjson_inline bool any_bits_set_anywhere(simd8<uint8_t> bits) const { return (*this & bits).any_bits_set_anywhere(); }
|
||||||
template<int N>
|
template<int N>
|
||||||
simdjson_really_inline simd8<uint8_t> shr() const { return vshrq_n_u8(*this, N); }
|
simdjson_inline simd8<uint8_t> shr() const { return vshrq_n_u8(*this, N); }
|
||||||
template<int N>
|
template<int N>
|
||||||
simdjson_really_inline simd8<uint8_t> shl() const { return vshlq_n_u8(*this, N); }
|
simdjson_inline simd8<uint8_t> shl() const { return vshlq_n_u8(*this, N); }
|
||||||
|
|
||||||
// Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
|
// Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline simd8<L> lookup_16(simd8<L> lookup_table) const {
|
simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const {
|
||||||
return lookup_table.apply_lookup_16_to(*this);
|
return lookup_table.apply_lookup_16_to(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
// signature simd8<L> compress(uint16_t mask) would be
|
// signature simd8<L> compress(uint16_t mask) would be
|
||||||
// sensible, but the AVX ISA makes this kind of approach difficult.
|
// sensible, but the AVX ISA makes this kind of approach difficult.
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline void compress(uint16_t mask, L * output) const {
|
simdjson_inline void compress(uint16_t mask, L * output) const {
|
||||||
using internal::thintable_epi8;
|
using internal::thintable_epi8;
|
||||||
using internal::BitsSetTable256mul2;
|
using internal::BitsSetTable256mul2;
|
||||||
using internal::pshufb_combine_table;
|
using internal::pshufb_combine_table;
|
||||||
@@ -305,7 +305,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
// Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
|
// Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
|
||||||
// bitset) to output1, then those corresponding to a 0 in the high half to output2.
|
// bitset) to output1, then those corresponding to a 0 in the high half to output2.
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
|
simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
|
||||||
using internal::thintable_epi8;
|
using internal::thintable_epi8;
|
||||||
uint8_t mask1 = uint8_t(mask); // least significant 8 bits
|
uint8_t mask1 = uint8_t(mask); // least significant 8 bits
|
||||||
uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
|
uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
|
||||||
@@ -324,7 +324,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline simd8<L> lookup_16(
|
simdjson_inline simd8<L> lookup_16(
|
||||||
L replace0, L replace1, L replace2, L replace3,
|
L replace0, L replace1, L replace2, L replace3,
|
||||||
L replace4, L replace5, L replace6, L replace7,
|
L replace4, L replace5, L replace6, L replace7,
|
||||||
L replace8, L replace9, L replace10, L replace11,
|
L replace8, L replace9, L replace10, L replace11,
|
||||||
@@ -338,7 +338,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simd8<uint8_t> apply_lookup_16_to(const simd8<T> original) {
|
simdjson_inline simd8<uint8_t> apply_lookup_16_to(const simd8<T> original) {
|
||||||
return vqtbl1q_u8(*this, simd8<uint8_t>(original));
|
return vqtbl1q_u8(*this, simd8<uint8_t>(original));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -348,24 +348,24 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
struct simd8<int8_t> {
|
struct simd8<int8_t> {
|
||||||
int8x16_t value;
|
int8x16_t value;
|
||||||
|
|
||||||
static simdjson_really_inline simd8<int8_t> splat(int8_t _value) { return vmovq_n_s8(_value); }
|
static simdjson_inline simd8<int8_t> splat(int8_t _value) { return vmovq_n_s8(_value); }
|
||||||
static simdjson_really_inline simd8<int8_t> zero() { return vdupq_n_s8(0); }
|
static simdjson_inline simd8<int8_t> zero() { return vdupq_n_s8(0); }
|
||||||
static simdjson_really_inline simd8<int8_t> load(const int8_t values[16]) { return vld1q_s8(values); }
|
static simdjson_inline simd8<int8_t> load(const int8_t values[16]) { return vld1q_s8(values); }
|
||||||
|
|
||||||
// Conversion from/to SIMD register
|
// Conversion from/to SIMD register
|
||||||
simdjson_really_inline simd8(const int8x16_t _value) : value{_value} {}
|
simdjson_inline simd8(const int8x16_t _value) : value{_value} {}
|
||||||
simdjson_really_inline operator const int8x16_t&() const { return this->value; }
|
simdjson_inline operator const int8x16_t&() const { return this->value; }
|
||||||
simdjson_really_inline operator int8x16_t&() { return this->value; }
|
simdjson_inline operator int8x16_t&() { return this->value; }
|
||||||
|
|
||||||
// Zero constructor
|
// Zero constructor
|
||||||
simdjson_really_inline simd8() : simd8(zero()) {}
|
simdjson_inline simd8() : simd8(zero()) {}
|
||||||
// Splat constructor
|
// Splat constructor
|
||||||
simdjson_really_inline simd8(int8_t _value) : simd8(splat(_value)) {}
|
simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
|
||||||
// Array constructor
|
// Array constructor
|
||||||
simdjson_really_inline simd8(const int8_t* values) : simd8(load(values)) {}
|
simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
|
||||||
// Member-by-member initialization
|
// Member-by-member initialization
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
simdjson_really_inline simd8(
|
simdjson_inline simd8(
|
||||||
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
||||||
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
||||||
) : simd8(make_int8x16_t(
|
) : simd8(make_int8x16_t(
|
||||||
@@ -373,7 +373,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
v8, v9, v10,v11,v12,v13,v14,v15
|
v8, v9, v10,v11,v12,v13,v14,v15
|
||||||
)) {}
|
)) {}
|
||||||
#else
|
#else
|
||||||
simdjson_really_inline simd8(
|
simdjson_inline simd8(
|
||||||
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
||||||
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
||||||
) : simd8(int8x16_t{
|
) : simd8(int8x16_t{
|
||||||
@@ -382,7 +382,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}) {}
|
}) {}
|
||||||
#endif
|
#endif
|
||||||
// Repeat 16 values as many times as necessary (usually for lookup tables)
|
// Repeat 16 values as many times as necessary (usually for lookup tables)
|
||||||
simdjson_really_inline static simd8<int8_t> repeat_16(
|
simdjson_inline static simd8<int8_t> repeat_16(
|
||||||
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, int8_t v6, int8_t v7,
|
||||||
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
int8_t v8, int8_t v9, int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
|
||||||
) {
|
) {
|
||||||
@@ -393,7 +393,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store to array
|
// Store to array
|
||||||
simdjson_really_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
|
simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
|
||||||
|
|
||||||
// Explicit conversion to/from unsigned
|
// Explicit conversion to/from unsigned
|
||||||
//
|
//
|
||||||
@@ -401,35 +401,35 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
// In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
|
// In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
|
||||||
// and relatively ugly and hard to read.
|
// and relatively ugly and hard to read.
|
||||||
#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
simdjson_really_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
|
simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline explicit operator simd8<uint8_t>() const { return vreinterpretq_u8_s8(this->value); }
|
simdjson_inline explicit operator simd8<uint8_t>() const { return vreinterpretq_u8_s8(this->value); }
|
||||||
|
|
||||||
// Math
|
// Math
|
||||||
simdjson_really_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return vaddq_s8(*this, other); }
|
simdjson_inline simd8<int8_t> operator+(const simd8<int8_t> other) const { return vaddq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return vsubq_s8(*this, other); }
|
simdjson_inline simd8<int8_t> operator-(const simd8<int8_t> other) const { return vsubq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { *this = *this + other; return *this; }
|
simdjson_inline simd8<int8_t>& operator+=(const simd8<int8_t> other) { *this = *this + other; return *this; }
|
||||||
simdjson_really_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { *this = *this - other; return *this; }
|
simdjson_inline simd8<int8_t>& operator-=(const simd8<int8_t> other) { *this = *this - other; return *this; }
|
||||||
|
|
||||||
// Order-sensitive comparisons
|
// Order-sensitive comparisons
|
||||||
simdjson_really_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return vmaxq_s8(*this, other); }
|
simdjson_inline simd8<int8_t> max_val(const simd8<int8_t> other) const { return vmaxq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return vminq_s8(*this, other); }
|
simdjson_inline simd8<int8_t> min_val(const simd8<int8_t> other) const { return vminq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator>(const simd8<int8_t> other) const { return vcgtq_s8(*this, other); }
|
simdjson_inline simd8<bool> operator>(const simd8<int8_t> other) const { return vcgtq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator<(const simd8<int8_t> other) const { return vcltq_s8(*this, other); }
|
simdjson_inline simd8<bool> operator<(const simd8<int8_t> other) const { return vcltq_s8(*this, other); }
|
||||||
simdjson_really_inline simd8<bool> operator==(const simd8<int8_t> other) const { return vceqq_s8(*this, other); }
|
simdjson_inline simd8<bool> operator==(const simd8<int8_t> other) const { return vceqq_s8(*this, other); }
|
||||||
|
|
||||||
template<int N=1>
|
template<int N=1>
|
||||||
simdjson_really_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const {
|
simdjson_inline simd8<int8_t> prev(const simd8<int8_t> prev_chunk) const {
|
||||||
return vextq_s8(prev_chunk, *this, 16 - N);
|
return vextq_s8(prev_chunk, *this, 16 - N);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform a lookup assuming no value is larger than 16
|
// Perform a lookup assuming no value is larger than 16
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline simd8<L> lookup_16(simd8<L> lookup_table) const {
|
simdjson_inline simd8<L> lookup_16(simd8<L> lookup_table) const {
|
||||||
return lookup_table.apply_lookup_16_to(*this);
|
return lookup_table.apply_lookup_16_to(*this);
|
||||||
}
|
}
|
||||||
template<typename L>
|
template<typename L>
|
||||||
simdjson_really_inline simd8<L> lookup_16(
|
simdjson_inline simd8<L> lookup_16(
|
||||||
L replace0, L replace1, L replace2, L replace3,
|
L replace0, L replace1, L replace2, L replace3,
|
||||||
L replace4, L replace5, L replace6, L replace7,
|
L replace4, L replace5, L replace6, L replace7,
|
||||||
L replace8, L replace9, L replace10, L replace11,
|
L replace8, L replace9, L replace10, L replace11,
|
||||||
@@ -443,7 +443,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simd8<int8_t> apply_lookup_16_to(const simd8<T> original) {
|
simdjson_inline simd8<int8_t> apply_lookup_16_to(const simd8<T> original) {
|
||||||
return vqtbl1q_s8(*this, simd8<uint8_t>(original));
|
return vqtbl1q_s8(*this, simd8<uint8_t>(original));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -458,22 +458,22 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed
|
simd8x64<T>& operator=(const simd8<T>& other) = delete; // no assignment allowed
|
||||||
simd8x64() = delete; // no default constructor allowed
|
simd8x64() = delete; // no default constructor allowed
|
||||||
|
|
||||||
simdjson_really_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
|
simdjson_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1, const simd8<T> chunk2, const simd8<T> chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
|
||||||
simdjson_really_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {}
|
simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8<T>::load(ptr), simd8<T>::load(ptr+16), simd8<T>::load(ptr+32), simd8<T>::load(ptr+48)} {}
|
||||||
|
|
||||||
simdjson_really_inline void store(T ptr[64]) const {
|
simdjson_inline void store(T ptr[64]) const {
|
||||||
this->chunks[0].store(ptr+sizeof(simd8<T>)*0);
|
this->chunks[0].store(ptr+sizeof(simd8<T>)*0);
|
||||||
this->chunks[1].store(ptr+sizeof(simd8<T>)*1);
|
this->chunks[1].store(ptr+sizeof(simd8<T>)*1);
|
||||||
this->chunks[2].store(ptr+sizeof(simd8<T>)*2);
|
this->chunks[2].store(ptr+sizeof(simd8<T>)*2);
|
||||||
this->chunks[3].store(ptr+sizeof(simd8<T>)*3);
|
this->chunks[3].store(ptr+sizeof(simd8<T>)*3);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simd8<T> reduce_or() const {
|
simdjson_inline simd8<T> reduce_or() const {
|
||||||
return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
|
return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline uint64_t compress(uint64_t mask, T * output) const {
|
simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
|
||||||
uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
|
uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
|
||||||
// compute the prefix sum of the popcounts of each byte
|
// compute the prefix sum of the popcounts of each byte
|
||||||
uint64_t offsets = popcounts * 0x0101010101010101;
|
uint64_t offsets = popcounts * 0x0101010101010101;
|
||||||
@@ -484,7 +484,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
return offsets >> 56;
|
return offsets >> 56;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint64_t to_bitmask() const {
|
simdjson_inline uint64_t to_bitmask() const {
|
||||||
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
|
||||||
const uint8x16_t bit_mask = make_uint8x16_t(
|
const uint8x16_t bit_mask = make_uint8x16_t(
|
||||||
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
||||||
@@ -504,7 +504,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
|
return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint64_t eq(const T m) const {
|
simdjson_inline uint64_t eq(const T m) const {
|
||||||
const simd8<T> mask = simd8<T>::splat(m);
|
const simd8<T> mask = simd8<T>::splat(m);
|
||||||
return simd8x64<bool>(
|
return simd8x64<bool>(
|
||||||
this->chunks[0] == mask,
|
this->chunks[0] == mask,
|
||||||
@@ -514,7 +514,7 @@ simdjson_really_inline int8x16_t make_int8x16_t(int8_t x1, int8_t x2, int8_t x
|
|||||||
).to_bitmask();
|
).to_bitmask();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint64_t lteq(const T m) const {
|
simdjson_inline uint64_t lteq(const T m) const {
|
||||||
const simd8<T> mask = simd8<T>::splat(m);
|
const simd8<T> mask = simd8<T>::splat(m);
|
||||||
return simd8x64<bool>(
|
return simd8x64<bool>(
|
||||||
this->chunks[0] <= mask,
|
this->chunks[0] <= mask,
|
||||||
|
|||||||
@@ -15,18 +15,18 @@ using namespace simd;
|
|||||||
struct backslash_and_quote {
|
struct backslash_and_quote {
|
||||||
public:
|
public:
|
||||||
static constexpr uint32_t BYTES_PROCESSED = 32;
|
static constexpr uint32_t BYTES_PROCESSED = 32;
|
||||||
simdjson_really_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
|
simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
|
||||||
|
|
||||||
simdjson_really_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
|
simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
|
||||||
simdjson_really_inline bool has_backslash() { return bs_bits != 0; }
|
simdjson_inline bool has_backslash() { return bs_bits != 0; }
|
||||||
simdjson_really_inline int quote_index() { return trailing_zeroes(quote_bits); }
|
simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
|
||||||
simdjson_really_inline int backslash_index() { return trailing_zeroes(bs_bits); }
|
simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
|
||||||
|
|
||||||
uint32_t bs_bits;
|
uint32_t bs_bits;
|
||||||
uint32_t quote_bits;
|
uint32_t quote_bits;
|
||||||
}; // struct backslash_and_quote
|
}; // struct backslash_and_quote
|
||||||
|
|
||||||
simdjson_really_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
|
simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
|
||||||
// this can read up to 31 bytes beyond the buffer size, but we require
|
// this can read up to 31 bytes beyond the buffer size, but we require
|
||||||
// SIMDJSON_PADDING of padding
|
// SIMDJSON_PADDING of padding
|
||||||
static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
|
static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
|
||||||
@@ -48,6 +48,4 @@ simdjson_really_inline backslash_and_quote backslash_and_quote::copy_and_find(co
|
|||||||
} // namespace SIMDJSON_IMPLEMENTATION
|
} // namespace SIMDJSON_IMPLEMENTATION
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|
||||||
#include "simdjson/generic/stringparsing.h"
|
|
||||||
|
|
||||||
#endif // SIMDJSON_ARM64_STRINGPARSING_H
|
#endif // SIMDJSON_ARM64_STRINGPARSING_H
|
||||||
|
|||||||
@@ -37,12 +37,12 @@ constexpr size_t SIMDJSON_MAXSIZE_BYTES = 0xFFFFFFFF;
|
|||||||
/**
|
/**
|
||||||
* The amount of padding needed in a buffer to parse JSON.
|
* The amount of padding needed in a buffer to parse JSON.
|
||||||
*
|
*
|
||||||
* the input buf should be readable up to buf + SIMDJSON_PADDING
|
* The input buf should be readable up to buf + SIMDJSON_PADDING
|
||||||
* this is a stopgap; there should be a better description of the
|
* this is a stopgap; there should be a better description of the
|
||||||
* main loop and its behavior that abstracts over this
|
* main loop and its behavior that abstracts over this
|
||||||
* See https://github.com/simdjson/simdjson/issues/174
|
* See https://github.com/simdjson/simdjson/issues/174
|
||||||
*/
|
*/
|
||||||
constexpr size_t SIMDJSON_PADDING = 32;
|
constexpr size_t SIMDJSON_PADDING = 64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* By default, simdjson supports this many nested objects and arrays.
|
* By default, simdjson supports this many nested objects and arrays.
|
||||||
@@ -168,6 +168,18 @@ constexpr size_t DEFAULT_MAX_DEPTH = 1024;
|
|||||||
|
|
||||||
#endif // MSC_VER
|
#endif // MSC_VER
|
||||||
|
|
||||||
|
#if defined(simdjson_inline)
|
||||||
|
// Prefer the user's definition of simdjson_inline; don't define it ourselves.
|
||||||
|
#elif defined(__GNUC__) && !defined(__OPTIMIZE__)
|
||||||
|
// If optimizations are disabled, forcing inlining can lead to significant
|
||||||
|
// code bloat and high compile times. Don't use simdjson_really_inline for
|
||||||
|
// unoptimized builds.
|
||||||
|
#define simdjson_inline inline
|
||||||
|
#else
|
||||||
|
// Force inlining for most simdjson functions.
|
||||||
|
#define simdjson_inline simdjson_really_inline
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(SIMDJSON_VISUAL_STUDIO)
|
#if defined(SIMDJSON_VISUAL_STUDIO)
|
||||||
/**
|
/**
|
||||||
* Windows users need to do some extra work when building
|
* Windows users need to do some extra work when building
|
||||||
@@ -266,11 +278,30 @@ namespace std {
|
|||||||
/// If EXPR is an error, returns it.
|
/// If EXPR is an error, returns it.
|
||||||
#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (_err) { return _err; } }
|
#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (_err) { return _err; } }
|
||||||
|
|
||||||
|
// Unless the programmer has already set SIMDJSON_DEVELOPMENT_CHECKS,
|
||||||
|
// we want to set it under debug builds. We detect a debug build
|
||||||
|
// under Visual Studio when the _DEBUG macro is set. Under the other
|
||||||
|
// compilers, we use the fact that they define __OPTIMIZE__ whenever
|
||||||
|
// they allow optimizations.
|
||||||
|
// It is possible that this could miss some cases where SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
|
// is helpful, but the programmer can set the macro SIMDJSON_DEVELOPMENT_CHECKS.
|
||||||
|
// It could also wrongly set SIMDJSON_DEVELOPMENT_CHECKS (e.g., if the programmer
|
||||||
|
// sets _DEBUG in a release build under Visual Studio, or if some compiler fails to
|
||||||
|
// set the __OPTIMIZE__ macro).
|
||||||
#ifndef SIMDJSON_DEVELOPMENT_CHECKS
|
#ifndef SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
#ifndef NDEBUG
|
#ifdef _MSC_VER
|
||||||
#define SIMDJSON_DEVELOPMENT_CHECKS
|
// Visual Studio seems to set _DEBUG for debug builds.
|
||||||
#endif
|
#ifdef _DEBUG
|
||||||
#endif
|
#define SIMDJSON_DEVELOPMENT_CHECKS 1
|
||||||
|
#endif // _DEBUG
|
||||||
|
#else // _MSC_VER
|
||||||
|
// All other compilers appear to set __OPTIMIZE__ to a positive integer
|
||||||
|
// when the compiler is optimizing.
|
||||||
|
#ifndef __OPTIMIZE__
|
||||||
|
#define SIMDJSON_DEVELOPMENT_CHECKS 1
|
||||||
|
#endif // __OPTIMIZE__
|
||||||
|
#endif // _MSC_VER
|
||||||
|
#endif // SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
|
|
||||||
// The SIMDJSON_CHECK_EOF macro is a feature flag for the "don't require padding"
|
// The SIMDJSON_CHECK_EOF macro is a feature flag for the "don't require padding"
|
||||||
// feature.
|
// feature.
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ namespace simdjson {
|
|||||||
//
|
//
|
||||||
// simdjson_result<dom::array> inline implementation
|
// simdjson_result<dom::array> inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline simdjson_result<dom::array>::simdjson_result() noexcept
|
simdjson_inline simdjson_result<dom::array>::simdjson_result() noexcept
|
||||||
: internal::simdjson_result_base<dom::array>() {}
|
: internal::simdjson_result_base<dom::array>() {}
|
||||||
simdjson_really_inline simdjson_result<dom::array>::simdjson_result(dom::array value) noexcept
|
simdjson_inline simdjson_result<dom::array>::simdjson_result(dom::array value) noexcept
|
||||||
: internal::simdjson_result_base<dom::array>(std::forward<dom::array>(value)) {}
|
: internal::simdjson_result_base<dom::array>(std::forward<dom::array>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<dom::array>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<dom::array>::simdjson_result(error_code error) noexcept
|
||||||
: internal::simdjson_result_base<dom::array>(error) {}
|
: internal::simdjson_result_base<dom::array>(error) {}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
@@ -50,8 +50,8 @@ namespace dom {
|
|||||||
//
|
//
|
||||||
// array inline implementation
|
// array inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline array::array() noexcept : tape{} {}
|
simdjson_inline array::array() noexcept : tape{} {}
|
||||||
simdjson_really_inline array::array(const internal::tape_ref &_tape) noexcept : tape{_tape} {}
|
simdjson_inline array::array(const internal::tape_ref &_tape) noexcept : tape{_tape} {}
|
||||||
inline array::iterator array::begin() const noexcept {
|
inline array::iterator array::begin() const noexcept {
|
||||||
return internal::tape_ref(tape.doc, tape.json_index + 1);
|
return internal::tape_ref(tape.doc, tape.json_index + 1);
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ inline simdjson_result<element> array::at(size_t index) const noexcept {
|
|||||||
//
|
//
|
||||||
// array::iterator inline implementation
|
// array::iterator inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline array::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
simdjson_inline array::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
||||||
inline element array::iterator::operator*() const noexcept {
|
inline element array::iterator::operator*() const noexcept {
|
||||||
return element(tape);
|
return element(tape);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class element;
|
|||||||
class array {
|
class array {
|
||||||
public:
|
public:
|
||||||
/** Create a new, invalid array */
|
/** Create a new, invalid array */
|
||||||
simdjson_really_inline array() noexcept;
|
simdjson_inline array() noexcept;
|
||||||
|
|
||||||
class iterator {
|
class iterator {
|
||||||
public:
|
public:
|
||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
iterator(const iterator&) noexcept = default;
|
iterator(const iterator&) noexcept = default;
|
||||||
iterator& operator=(const iterator&) noexcept = default;
|
iterator& operator=(const iterator&) noexcept = default;
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline iterator(const internal::tape_ref &tape) noexcept;
|
simdjson_inline iterator(const internal::tape_ref &tape) noexcept;
|
||||||
internal::tape_ref tape;
|
internal::tape_ref tape;
|
||||||
friend class array;
|
friend class array;
|
||||||
};
|
};
|
||||||
@@ -133,7 +133,7 @@ public:
|
|||||||
inline simdjson_result<element> at(size_t index) const noexcept;
|
inline simdjson_result<element> at(size_t index) const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline array(const internal::tape_ref &tape) noexcept;
|
simdjson_inline array(const internal::tape_ref &tape) noexcept;
|
||||||
internal::tape_ref tape;
|
internal::tape_ref tape;
|
||||||
friend class element;
|
friend class element;
|
||||||
friend struct simdjson_result<element>;
|
friend struct simdjson_result<element>;
|
||||||
@@ -148,9 +148,9 @@ private:
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<dom::array> : public internal::simdjson_result_base<dom::array> {
|
struct simdjson_result<dom::array> : public internal::simdjson_result_base<dom::array> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result() noexcept; ///< @private
|
simdjson_inline simdjson_result() noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(dom::array value) noexcept; ///< @private
|
simdjson_inline simdjson_result(dom::array value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
|
|
||||||
inline simdjson_result<dom::element> at_pointer(std::string_view json_pointer) const noexcept;
|
inline simdjson_result<dom::element> at_pointer(std::string_view json_pointer) const noexcept;
|
||||||
inline simdjson_result<dom::element> at(size_t index) const noexcept;
|
inline simdjson_result<dom::element> at(size_t index) const noexcept;
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ inline void stage1_worker::run(document_stream * ds, dom::parser * stage1, size_
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline document_stream::document_stream(
|
simdjson_inline document_stream::document_stream(
|
||||||
dom::parser &_parser,
|
dom::parser &_parser,
|
||||||
const uint8_t *_buf,
|
const uint8_t *_buf,
|
||||||
size_t _len,
|
size_t _len,
|
||||||
@@ -103,7 +103,7 @@ simdjson_really_inline document_stream::document_stream(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::document_stream() noexcept
|
simdjson_inline document_stream::document_stream() noexcept
|
||||||
: parser{nullptr},
|
: parser{nullptr},
|
||||||
buf{nullptr},
|
buf{nullptr},
|
||||||
len{0},
|
len{0},
|
||||||
@@ -115,31 +115,31 @@ simdjson_really_inline document_stream::document_stream() noexcept
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::~document_stream() noexcept {
|
simdjson_inline document_stream::~document_stream() noexcept {
|
||||||
#ifdef SIMDJSON_THREADS_ENABLED
|
#ifdef SIMDJSON_THREADS_ENABLED
|
||||||
worker.reset();
|
worker.reset();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator::iterator() noexcept
|
simdjson_inline document_stream::iterator::iterator() noexcept
|
||||||
: stream{nullptr}, finished{true} {
|
: stream{nullptr}, finished{true} {
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator document_stream::begin() noexcept {
|
simdjson_inline document_stream::iterator document_stream::begin() noexcept {
|
||||||
start();
|
start();
|
||||||
// If there are no documents, we're finished.
|
// If there are no documents, we're finished.
|
||||||
return iterator(this, error == EMPTY);
|
return iterator(this, error == EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator document_stream::end() noexcept {
|
simdjson_inline document_stream::iterator document_stream::end() noexcept {
|
||||||
return iterator(this, true);
|
return iterator(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
|
simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
|
||||||
: stream{_stream}, finished{is_end} {
|
: stream{_stream}, finished{is_end} {
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator::reference document_stream::iterator::operator*() noexcept {
|
simdjson_inline document_stream::iterator::reference document_stream::iterator::operator*() noexcept {
|
||||||
// Note that in case of error, we do not yet mark
|
// Note that in case of error, we do not yet mark
|
||||||
// the iterator as "finished": this detection is done
|
// the iterator as "finished": this detection is done
|
||||||
// in the operator++ function since it is possible
|
// in the operator++ function since it is possible
|
||||||
@@ -149,7 +149,7 @@ simdjson_really_inline document_stream::iterator::reference document_stream::ite
|
|||||||
return stream->parser->doc.root();
|
return stream->parser->doc.root();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
|
simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
|
||||||
// If there is an error, then we want the iterator
|
// If there is an error, then we want the iterator
|
||||||
// to be finished, no matter what. (E.g., we do not
|
// to be finished, no matter what. (E.g., we do not
|
||||||
// keep generating documents with errors, or go beyond
|
// keep generating documents with errors, or go beyond
|
||||||
@@ -176,7 +176,7 @@ simdjson_really_inline document_stream::iterator& document_stream::iterator::ope
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
|
simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
|
||||||
return finished != other.finished;
|
return finished != other.finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,11 +207,11 @@ inline void document_stream::start() noexcept {
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline size_t document_stream::iterator::current_index() const noexcept {
|
simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
|
||||||
return stream->doc_index;
|
return stream->doc_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline std::string_view document_stream::iterator::source() const noexcept {
|
simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
|
||||||
const char* start = reinterpret_cast<const char*>(stream->buf) + current_index();
|
const char* start = reinterpret_cast<const char*>(stream->buf) + current_index();
|
||||||
bool object_or_array = ((*start == '[') || (*start == '{'));
|
bool object_or_array = ((*start == '[') || (*start == '{'));
|
||||||
if(object_or_array) {
|
if(object_or_array) {
|
||||||
@@ -304,32 +304,32 @@ inline void document_stream::start_stage1_thread() noexcept {
|
|||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::document_stream>::simdjson_result() noexcept
|
simdjson_inline simdjson_result<dom::document_stream>::simdjson_result() noexcept
|
||||||
: simdjson_result_base() {
|
: simdjson_result_base() {
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::document_stream>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<dom::document_stream>::simdjson_result(error_code error) noexcept
|
||||||
: simdjson_result_base(error) {
|
: simdjson_result_base(error) {
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::document_stream>::simdjson_result(dom::document_stream &&value) noexcept
|
simdjson_inline simdjson_result<dom::document_stream>::simdjson_result(dom::document_stream &&value) noexcept
|
||||||
: simdjson_result_base(std::forward<dom::document_stream>(value)) {
|
: simdjson_result_base(std::forward<dom::document_stream>(value)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::begin() noexcept(false) {
|
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::begin() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::end() noexcept(false) {
|
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::end() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first.end();
|
return first.end();
|
||||||
}
|
}
|
||||||
#else // SIMDJSON_EXCEPTIONS
|
#else // SIMDJSON_EXCEPTIONS
|
||||||
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
||||||
simdjson_really_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::begin() noexcept {
|
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::begin() noexcept {
|
||||||
first.error = error();
|
first.error = error();
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::end() noexcept {
|
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::end() noexcept {
|
||||||
first.error = error();
|
first.error = error();
|
||||||
return first.end();
|
return first.end();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,13 +80,13 @@ public:
|
|||||||
* error = parser.parse_many(json).get(docs);
|
* error = parser.parse_many(json).get(docs);
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline document_stream() noexcept;
|
simdjson_inline document_stream() noexcept;
|
||||||
/** Move one document_stream to another. */
|
/** Move one document_stream to another. */
|
||||||
simdjson_really_inline document_stream(document_stream &&other) noexcept = default;
|
simdjson_inline document_stream(document_stream &&other) noexcept = default;
|
||||||
/** Move one document_stream to another. */
|
/** Move one document_stream to another. */
|
||||||
simdjson_really_inline document_stream &operator=(document_stream &&other) noexcept = default;
|
simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline ~document_stream() noexcept;
|
simdjson_inline ~document_stream() noexcept;
|
||||||
/**
|
/**
|
||||||
* Returns the input size in bytes.
|
* Returns the input size in bytes.
|
||||||
*/
|
*/
|
||||||
@@ -125,11 +125,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator() noexcept;
|
simdjson_inline iterator() noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the current document (or error).
|
* Get the current document (or error).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline reference operator*() noexcept;
|
simdjson_inline reference operator*() noexcept;
|
||||||
/**
|
/**
|
||||||
* Advance to the next document (prefix).
|
* Advance to the next document (prefix).
|
||||||
*/
|
*/
|
||||||
@@ -138,7 +138,7 @@ public:
|
|||||||
* Check if we're at the end yet.
|
* Check if we're at the end yet.
|
||||||
* @param other the end iterator to compare to.
|
* @param other the end iterator to compare to.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool operator!=(const iterator &other) const noexcept;
|
simdjson_inline bool operator!=(const iterator &other) const noexcept;
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*
|
*
|
||||||
@@ -154,7 +154,7 @@ public:
|
|||||||
* may change in future versions of simdjson: we find the API somewhat
|
* may change in future versions of simdjson: we find the API somewhat
|
||||||
* awkward and we would like to offer something friendlier.
|
* awkward and we would like to offer something friendlier.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline size_t current_index() const noexcept;
|
simdjson_inline size_t current_index() const noexcept;
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*
|
*
|
||||||
@@ -174,10 +174,10 @@ public:
|
|||||||
* may change in future versions of simdjson: we find the API somewhat
|
* may change in future versions of simdjson: we find the API somewhat
|
||||||
* awkward and we would like to offer something friendlier.
|
* awkward and we would like to offer something friendlier.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline std::string_view source() const noexcept;
|
simdjson_inline std::string_view source() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline iterator(document_stream *s, bool finished) noexcept;
|
simdjson_inline iterator(document_stream *s, bool finished) noexcept;
|
||||||
/** The document_stream we're iterating through. */
|
/** The document_stream we're iterating through. */
|
||||||
document_stream* stream;
|
document_stream* stream;
|
||||||
/** Whether we're finished or not. */
|
/** Whether we're finished or not. */
|
||||||
@@ -188,11 +188,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Start iterating the documents in the stream.
|
* Start iterating the documents in the stream.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator begin() noexcept;
|
simdjson_inline iterator begin() noexcept;
|
||||||
/**
|
/**
|
||||||
* The end of the stream, for iterator comparison purposes.
|
* The end of the stream, for iterator comparison purposes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator end() noexcept;
|
simdjson_inline iterator end() noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -208,7 +208,7 @@ private:
|
|||||||
* @param len is the length of the raw byte buffer in bytes
|
* @param len is the length of the raw byte buffer in bytes
|
||||||
* @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
|
* @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline document_stream(
|
simdjson_inline document_stream(
|
||||||
dom::parser &parser,
|
dom::parser &parser,
|
||||||
const uint8_t *buf,
|
const uint8_t *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
@@ -302,19 +302,19 @@ private:
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<dom::document_stream> : public internal::simdjson_result_base<dom::document_stream> {
|
struct simdjson_result<dom::document_stream> : public internal::simdjson_result_base<dom::document_stream> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result() noexcept; ///< @private
|
simdjson_inline simdjson_result() noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(dom::document_stream &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(dom::document_stream &&value) noexcept; ///< @private
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline dom::document_stream::iterator begin() noexcept(false);
|
simdjson_inline dom::document_stream::iterator begin() noexcept(false);
|
||||||
simdjson_really_inline dom::document_stream::iterator end() noexcept(false);
|
simdjson_inline dom::document_stream::iterator end() noexcept(false);
|
||||||
#else // SIMDJSON_EXCEPTIONS
|
#else // SIMDJSON_EXCEPTIONS
|
||||||
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
||||||
[[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
|
[[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
|
||||||
simdjson_really_inline dom::document_stream::iterator begin() noexcept;
|
simdjson_inline dom::document_stream::iterator begin() noexcept;
|
||||||
[[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
|
[[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
|
||||||
simdjson_really_inline dom::document_stream::iterator end() noexcept;
|
simdjson_inline dom::document_stream::iterator end() noexcept;
|
||||||
#endif // SIMDJSON_DISABLE_DEPRECATED_API
|
#endif // SIMDJSON_DISABLE_DEPRECATED_API
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
}; // struct simdjson_result<dom::document_stream>
|
}; // struct simdjson_result<dom::document_stream>
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ namespace simdjson {
|
|||||||
//
|
//
|
||||||
// simdjson_result<dom::element> inline implementation
|
// simdjson_result<dom::element> inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline simdjson_result<dom::element>::simdjson_result() noexcept
|
simdjson_inline simdjson_result<dom::element>::simdjson_result() noexcept
|
||||||
: internal::simdjson_result_base<dom::element>() {}
|
: internal::simdjson_result_base<dom::element>() {}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::simdjson_result(dom::element &&value) noexcept
|
simdjson_inline simdjson_result<dom::element>::simdjson_result(dom::element &&value) noexcept
|
||||||
: internal::simdjson_result_base<dom::element>(std::forward<dom::element>(value)) {}
|
: internal::simdjson_result_base<dom::element>(std::forward<dom::element>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<dom::element>::simdjson_result(error_code error) noexcept
|
||||||
: internal::simdjson_result_base<dom::element>(error) {}
|
: internal::simdjson_result_base<dom::element>(error) {}
|
||||||
inline simdjson_result<dom::element_type> simdjson_result<dom::element>::type() const noexcept {
|
inline simdjson_result<dom::element_type> simdjson_result<dom::element>::type() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
@@ -24,101 +24,101 @@ inline simdjson_result<dom::element_type> simdjson_result<dom::element>::type()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is() const noexcept {
|
||||||
return !error() && first.is<T>();
|
return !error() && first.is<T>();
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T> simdjson_result<dom::element>::get() const noexcept {
|
simdjson_inline simdjson_result<T> simdjson_result<dom::element>::get() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>();
|
return first.get<T>();
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code simdjson_result<dom::element>::get(T &value) const noexcept {
|
simdjson_warn_unused simdjson_inline error_code simdjson_result<dom::element>::get(T &value) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>(value);
|
return first.get<T>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::array> simdjson_result<dom::element>::get_array() const noexcept {
|
simdjson_inline simdjson_result<dom::array> simdjson_result<dom::element>::get_array() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_array();
|
return first.get_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::object> simdjson_result<dom::element>::get_object() const noexcept {
|
simdjson_inline simdjson_result<dom::object> simdjson_result<dom::element>::get_object() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_object();
|
return first.get_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<const char *> simdjson_result<dom::element>::get_c_str() const noexcept {
|
simdjson_inline simdjson_result<const char *> simdjson_result<dom::element>::get_c_str() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_c_str();
|
return first.get_c_str();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<dom::element>::get_string_length() const noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<dom::element>::get_string_length() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_string_length();
|
return first.get_string_length();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<dom::element>::get_string() const noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<dom::element>::get_string() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_string();
|
return first.get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> simdjson_result<dom::element>::get_int64() const noexcept {
|
simdjson_inline simdjson_result<int64_t> simdjson_result<dom::element>::get_int64() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_int64();
|
return first.get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<dom::element>::get_uint64() const noexcept {
|
simdjson_inline simdjson_result<uint64_t> simdjson_result<dom::element>::get_uint64() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_uint64();
|
return first.get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> simdjson_result<dom::element>::get_double() const noexcept {
|
simdjson_inline simdjson_result<double> simdjson_result<dom::element>::get_double() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_double();
|
return first.get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<dom::element>::get_bool() const noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<dom::element>::get_bool() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_bool();
|
return first.get_bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_array() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_array() const noexcept {
|
||||||
return !error() && first.is_array();
|
return !error() && first.is_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_object() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_object() const noexcept {
|
||||||
return !error() && first.is_object();
|
return !error() && first.is_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_string() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_string() const noexcept {
|
||||||
return !error() && first.is_string();
|
return !error() && first.is_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_int64() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_int64() const noexcept {
|
||||||
return !error() && first.is_int64();
|
return !error() && first.is_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_uint64() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_uint64() const noexcept {
|
||||||
return !error() && first.is_uint64();
|
return !error() && first.is_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_double() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_double() const noexcept {
|
||||||
return !error() && first.is_double();
|
return !error() && first.is_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_number() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_number() const noexcept {
|
||||||
return !error() && first.is_number();
|
return !error() && first.is_number();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_bool() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_bool() const noexcept {
|
||||||
return !error() && first.is_bool();
|
return !error() && first.is_bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool simdjson_result<dom::element>::is_null() const noexcept {
|
simdjson_inline bool simdjson_result<dom::element>::is_null() const noexcept {
|
||||||
return !error() && first.is_null();
|
return !error() && first.is_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](std::string_view key) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](std::string_view key) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](const char *key) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](const char *key) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_pointer(const std::string_view json_pointer) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_pointer(const std::string_view json_pointer) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
|
||||||
[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
|
[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(const std::string_view json_pointer) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(const std::string_view json_pointer) const noexcept {
|
||||||
SIMDJSON_PUSH_DISABLE_WARNINGS
|
SIMDJSON_PUSH_DISABLE_WARNINGS
|
||||||
SIMDJSON_DISABLE_DEPRECATED_WARNING
|
SIMDJSON_DISABLE_DEPRECATED_WARNING
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
@@ -126,51 +126,51 @@ SIMDJSON_DISABLE_DEPRECATED_WARNING
|
|||||||
SIMDJSON_POP_DISABLE_WARNINGS
|
SIMDJSON_POP_DISABLE_WARNINGS
|
||||||
}
|
}
|
||||||
#endif // SIMDJSON_DISABLE_DEPRECATED_API
|
#endif // SIMDJSON_DISABLE_DEPRECATED_API
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(size_t index) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(size_t index) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at(index);
|
return first.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key(std::string_view key) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key(std::string_view key) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_key(key);
|
return first.at_key(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key_case_insensitive(std::string_view key) const noexcept {
|
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key_case_insensitive(std::string_view key) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_key_case_insensitive(key);
|
return first.at_key_case_insensitive(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator bool() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator bool() const noexcept(false) {
|
||||||
return get<bool>();
|
return get<bool>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator const char *() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator const char *() const noexcept(false) {
|
||||||
return get<const char *>();
|
return get<const char *>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator std::string_view() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator std::string_view() const noexcept(false) {
|
||||||
return get<std::string_view>();
|
return get<std::string_view>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator uint64_t() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator uint64_t() const noexcept(false) {
|
||||||
return get<uint64_t>();
|
return get<uint64_t>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator int64_t() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator int64_t() const noexcept(false) {
|
||||||
return get<int64_t>();
|
return get<int64_t>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator double() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator double() const noexcept(false) {
|
||||||
return get<double>();
|
return get<double>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator dom::array() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator dom::array() const noexcept(false) {
|
||||||
return get<dom::array>();
|
return get<dom::array>();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<dom::element>::operator dom::object() const noexcept(false) {
|
simdjson_inline simdjson_result<dom::element>::operator dom::object() const noexcept(false) {
|
||||||
return get<dom::object>();
|
return get<dom::object>();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline dom::array::iterator simdjson_result<dom::element>::begin() const noexcept(false) {
|
simdjson_inline dom::array::iterator simdjson_result<dom::element>::begin() const noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline dom::array::iterator simdjson_result<dom::element>::end() const noexcept(false) {
|
simdjson_inline dom::array::iterator simdjson_result<dom::element>::end() const noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first.end();
|
return first.end();
|
||||||
}
|
}
|
||||||
@@ -182,8 +182,8 @@ namespace dom {
|
|||||||
//
|
//
|
||||||
// element inline implementation
|
// element inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline element::element() noexcept : tape{} {}
|
simdjson_inline element::element() noexcept : tape{} {}
|
||||||
simdjson_really_inline element::element(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
simdjson_inline element::element(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
||||||
|
|
||||||
inline element_type element::type() const noexcept {
|
inline element_type element::type() const noexcept {
|
||||||
auto tape_type = tape.tape_ref_type();
|
auto tape_type = tape.tape_ref_type();
|
||||||
@@ -290,12 +290,12 @@ inline simdjson_result<object> element::get_object() const noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code element::get(T &value) const noexcept {
|
simdjson_warn_unused simdjson_inline error_code element::get(T &value) const noexcept {
|
||||||
return get<T>().get(value);
|
return get<T>().get(value);
|
||||||
}
|
}
|
||||||
// An element-specific version prevents recursion with simdjson_result::get<element>(value)
|
// An element-specific version prevents recursion with simdjson_result::get<element>(value)
|
||||||
template<>
|
template<>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code element::get<element>(element &value) const noexcept {
|
simdjson_warn_unused simdjson_inline error_code element::get<element>(element &value) const noexcept {
|
||||||
value = element(tape);
|
value = element(tape);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -305,7 +305,7 @@ inline void element::tie(T &value, error_code &error) && noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline bool element::is() const noexcept {
|
simdjson_inline bool element::is() const noexcept {
|
||||||
auto result = get<T>();
|
auto result = get<T>();
|
||||||
return !result.error();
|
return !result.error();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ enum class element_type {
|
|||||||
class element {
|
class element {
|
||||||
public:
|
public:
|
||||||
/** Create a new, invalid element. */
|
/** Create a new, invalid element. */
|
||||||
simdjson_really_inline element() noexcept;
|
simdjson_inline element() noexcept;
|
||||||
|
|
||||||
/** The type of this element. */
|
/** The type of this element. */
|
||||||
simdjson_really_inline element_type type() const noexcept;
|
simdjson_inline element_type type() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this element to an array.
|
* Cast this element to an array.
|
||||||
@@ -195,7 +195,7 @@ public:
|
|||||||
* @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
|
* @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline bool is() const noexcept;
|
simdjson_inline bool is() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value as the provided type (T).
|
* Get the value as the provided type (T).
|
||||||
@@ -240,7 +240,7 @@ public:
|
|||||||
* @returns The error that occurred, or SUCCESS if there was no error.
|
* @returns The error that occurred, or SUCCESS if there was no error.
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code get(T &value) const noexcept;
|
simdjson_warn_unused simdjson_inline error_code get(T &value) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value as the provided type (T), setting error if it's not the given type.
|
* Get the value as the provided type (T), setting error if it's not the given type.
|
||||||
@@ -464,7 +464,7 @@ public:
|
|||||||
inline bool dump_raw_tape(std::ostream &out) const noexcept;
|
inline bool dump_raw_tape(std::ostream &out) const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline element(const internal::tape_ref &tape) noexcept;
|
simdjson_inline element(const internal::tape_ref &tape) noexcept;
|
||||||
internal::tape_ref tape;
|
internal::tape_ref tape;
|
||||||
friend class document;
|
friend class document;
|
||||||
friend class object;
|
friend class object;
|
||||||
@@ -481,59 +481,59 @@ private:
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<dom::element> : public internal::simdjson_result_base<dom::element> {
|
struct simdjson_result<dom::element> : public internal::simdjson_result_base<dom::element> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result() noexcept; ///< @private
|
simdjson_inline simdjson_result() noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(dom::element &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(dom::element &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::element_type> type() const noexcept;
|
simdjson_inline simdjson_result<dom::element_type> type() const noexcept;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline bool is() const noexcept;
|
simdjson_inline bool is() const noexcept;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T> get() const noexcept;
|
simdjson_inline simdjson_result<T> get() const noexcept;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code get(T &value) const noexcept;
|
simdjson_warn_unused simdjson_inline error_code get(T &value) const noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::array> get_array() const noexcept;
|
simdjson_inline simdjson_result<dom::array> get_array() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::object> get_object() const noexcept;
|
simdjson_inline simdjson_result<dom::object> get_object() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<const char *> get_c_str() const noexcept;
|
simdjson_inline simdjson_result<const char *> get_c_str() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<size_t> get_string_length() const noexcept;
|
simdjson_inline simdjson_result<size_t> get_string_length() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() const noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() const noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() const noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double() const noexcept;
|
simdjson_inline simdjson_result<double> get_double() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() const noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() const noexcept;
|
||||||
|
|
||||||
simdjson_really_inline bool is_array() const noexcept;
|
simdjson_inline bool is_array() const noexcept;
|
||||||
simdjson_really_inline bool is_object() const noexcept;
|
simdjson_inline bool is_object() const noexcept;
|
||||||
simdjson_really_inline bool is_string() const noexcept;
|
simdjson_inline bool is_string() const noexcept;
|
||||||
simdjson_really_inline bool is_int64() const noexcept;
|
simdjson_inline bool is_int64() const noexcept;
|
||||||
simdjson_really_inline bool is_uint64() const noexcept;
|
simdjson_inline bool is_uint64() const noexcept;
|
||||||
simdjson_really_inline bool is_double() const noexcept;
|
simdjson_inline bool is_double() const noexcept;
|
||||||
simdjson_really_inline bool is_number() const noexcept;
|
simdjson_inline bool is_number() const noexcept;
|
||||||
simdjson_really_inline bool is_bool() const noexcept;
|
simdjson_inline bool is_bool() const noexcept;
|
||||||
simdjson_really_inline bool is_null() const noexcept;
|
simdjson_inline bool is_null() const noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<dom::element> operator[](std::string_view key) const noexcept;
|
simdjson_inline simdjson_result<dom::element> operator[](std::string_view key) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::element> operator[](const char *key) const noexcept;
|
simdjson_inline simdjson_result<dom::element> operator[](const char *key) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::element> at_pointer(const std::string_view json_pointer) const noexcept;
|
simdjson_inline simdjson_result<dom::element> at_pointer(const std::string_view json_pointer) const noexcept;
|
||||||
[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
|
[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
|
||||||
simdjson_really_inline simdjson_result<dom::element> at(const std::string_view json_pointer) const noexcept;
|
simdjson_inline simdjson_result<dom::element> at(const std::string_view json_pointer) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::element> at(size_t index) const noexcept;
|
simdjson_inline simdjson_result<dom::element> at(size_t index) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::element> at_key(std::string_view key) const noexcept;
|
simdjson_inline simdjson_result<dom::element> at_key(std::string_view key) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<dom::element> at_key_case_insensitive(std::string_view key) const noexcept;
|
simdjson_inline simdjson_result<dom::element> at_key_case_insensitive(std::string_view key) const noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline operator bool() const noexcept(false);
|
simdjson_inline operator bool() const noexcept(false);
|
||||||
simdjson_really_inline explicit operator const char*() const noexcept(false);
|
simdjson_inline explicit operator const char*() const noexcept(false);
|
||||||
simdjson_really_inline operator std::string_view() const noexcept(false);
|
simdjson_inline operator std::string_view() const noexcept(false);
|
||||||
simdjson_really_inline operator uint64_t() const noexcept(false);
|
simdjson_inline operator uint64_t() const noexcept(false);
|
||||||
simdjson_really_inline operator int64_t() const noexcept(false);
|
simdjson_inline operator int64_t() const noexcept(false);
|
||||||
simdjson_really_inline operator double() const noexcept(false);
|
simdjson_inline operator double() const noexcept(false);
|
||||||
simdjson_really_inline operator dom::array() const noexcept(false);
|
simdjson_inline operator dom::array() const noexcept(false);
|
||||||
simdjson_really_inline operator dom::object() const noexcept(false);
|
simdjson_inline operator dom::object() const noexcept(false);
|
||||||
|
|
||||||
simdjson_really_inline dom::array::iterator begin() const noexcept(false);
|
simdjson_inline dom::array::iterator begin() const noexcept(false);
|
||||||
simdjson_really_inline dom::array::iterator end() const noexcept(false);
|
simdjson_inline dom::array::iterator end() const noexcept(false);
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ namespace simdjson {
|
|||||||
//
|
//
|
||||||
// simdjson_result<dom::object> inline implementation
|
// simdjson_result<dom::object> inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline simdjson_result<dom::object>::simdjson_result() noexcept
|
simdjson_inline simdjson_result<dom::object>::simdjson_result() noexcept
|
||||||
: internal::simdjson_result_base<dom::object>() {}
|
: internal::simdjson_result_base<dom::object>() {}
|
||||||
simdjson_really_inline simdjson_result<dom::object>::simdjson_result(dom::object value) noexcept
|
simdjson_inline simdjson_result<dom::object>::simdjson_result(dom::object value) noexcept
|
||||||
: internal::simdjson_result_base<dom::object>(std::forward<dom::object>(value)) {}
|
: internal::simdjson_result_base<dom::object>(std::forward<dom::object>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<dom::object>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<dom::object>::simdjson_result(error_code error) noexcept
|
||||||
: internal::simdjson_result_base<dom::object>(error) {}
|
: internal::simdjson_result_base<dom::object>(error) {}
|
||||||
|
|
||||||
inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](std::string_view key) const noexcept {
|
inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](std::string_view key) const noexcept {
|
||||||
@@ -62,8 +62,8 @@ namespace dom {
|
|||||||
//
|
//
|
||||||
// object inline implementation
|
// object inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline object::object() noexcept : tape{} {}
|
simdjson_inline object::object() noexcept : tape{} {}
|
||||||
simdjson_really_inline object::object(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
simdjson_inline object::object(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
||||||
inline object::iterator object::begin() const noexcept {
|
inline object::iterator object::begin() const noexcept {
|
||||||
return internal::tape_ref(tape.doc, tape.json_index + 1);
|
return internal::tape_ref(tape.doc, tape.json_index + 1);
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ inline simdjson_result<element> object::at_key_case_insensitive(std::string_view
|
|||||||
//
|
//
|
||||||
// object::iterator inline implementation
|
// object::iterator inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline object::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
simdjson_inline object::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
|
||||||
inline const key_value_pair object::iterator::operator*() const noexcept {
|
inline const key_value_pair object::iterator::operator*() const noexcept {
|
||||||
return key_value_pair(key(), value());
|
return key_value_pair(key(), value());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class key_value_pair;
|
|||||||
class object {
|
class object {
|
||||||
public:
|
public:
|
||||||
/** Create a new, invalid object */
|
/** Create a new, invalid object */
|
||||||
simdjson_really_inline object() noexcept;
|
simdjson_inline object() noexcept;
|
||||||
|
|
||||||
class iterator {
|
class iterator {
|
||||||
public:
|
public:
|
||||||
@@ -92,7 +92,7 @@ public:
|
|||||||
iterator(const iterator&) noexcept = default;
|
iterator(const iterator&) noexcept = default;
|
||||||
iterator& operator=(const iterator&) noexcept = default;
|
iterator& operator=(const iterator&) noexcept = default;
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline iterator(const internal::tape_ref &tape) noexcept;
|
simdjson_inline iterator(const internal::tape_ref &tape) noexcept;
|
||||||
|
|
||||||
internal::tape_ref tape;
|
internal::tape_ref tape;
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@ public:
|
|||||||
inline simdjson_result<element> at_key_case_insensitive(std::string_view key) const noexcept;
|
inline simdjson_result<element> at_key_case_insensitive(std::string_view key) const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline object(const internal::tape_ref &tape) noexcept;
|
simdjson_inline object(const internal::tape_ref &tape) noexcept;
|
||||||
|
|
||||||
internal::tape_ref tape;
|
internal::tape_ref tape;
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ public:
|
|||||||
element value;
|
element value;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline key_value_pair(std::string_view _key, element _value) noexcept;
|
simdjson_inline key_value_pair(std::string_view _key, element _value) noexcept;
|
||||||
friend class object;
|
friend class object;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -237,9 +237,9 @@ private:
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<dom::object> : public internal::simdjson_result_base<dom::object> {
|
struct simdjson_result<dom::object> : public internal::simdjson_result_base<dom::object> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result() noexcept; ///< @private
|
simdjson_inline simdjson_result() noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(dom::object value) noexcept; ///< @private
|
simdjson_inline simdjson_result(dom::object value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
|
|
||||||
inline simdjson_result<dom::element> operator[](std::string_view key) const noexcept;
|
inline simdjson_result<dom::element> operator[](std::string_view key) const noexcept;
|
||||||
inline simdjson_result<dom::element> operator[](const char *key) const noexcept;
|
inline simdjson_result<dom::element> operator[](const char *key) const noexcept;
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ namespace dom {
|
|||||||
//
|
//
|
||||||
// parser inline implementation
|
// parser inline implementation
|
||||||
//
|
//
|
||||||
simdjson_really_inline parser::parser(size_t max_capacity) noexcept
|
simdjson_inline parser::parser(size_t max_capacity) noexcept
|
||||||
: _max_capacity{max_capacity},
|
: _max_capacity{max_capacity},
|
||||||
loaded_bytes(nullptr) {
|
loaded_bytes(nullptr) {
|
||||||
}
|
}
|
||||||
simdjson_really_inline parser::parser(parser &&other) noexcept = default;
|
simdjson_inline parser::parser(parser &&other) noexcept = default;
|
||||||
simdjson_really_inline parser &parser::operator=(parser &&other) noexcept = default;
|
simdjson_inline parser &parser::operator=(parser &&other) noexcept = default;
|
||||||
|
|
||||||
inline bool parser::is_valid() const noexcept { return valid; }
|
inline bool parser::is_valid() const noexcept { return valid; }
|
||||||
inline int parser::get_error_code() const noexcept { return error; }
|
inline int parser::get_error_code() const noexcept { return error; }
|
||||||
@@ -118,13 +118,13 @@ inline simdjson_result<element> parser::parse_into_document(document& provided_d
|
|||||||
return provided_doc.root();
|
return provided_doc.root();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const char *buf, size_t len, bool realloc_if_needed) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const char *buf, size_t len, bool realloc_if_needed) & noexcept {
|
||||||
return parse_into_document(provided_doc, reinterpret_cast<const uint8_t *>(buf), len, realloc_if_needed);
|
return parse_into_document(provided_doc, reinterpret_cast<const uint8_t *>(buf), len, realloc_if_needed);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const std::string &s) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const std::string &s) & noexcept {
|
||||||
return parse_into_document(provided_doc, s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
|
return parse_into_document(provided_doc, s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const padded_string &s) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse_into_document(document& provided_doc, const padded_string &s) & noexcept {
|
||||||
return parse_into_document(provided_doc, s.data(), s.length(), false);
|
return parse_into_document(provided_doc, s.data(), s.length(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,13 +133,13 @@ inline simdjson_result<element> parser::parse(const uint8_t *buf, size_t len, bo
|
|||||||
return parse_into_document(doc, buf, len, realloc_if_needed);
|
return parse_into_document(doc, buf, len, realloc_if_needed);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse(const char *buf, size_t len, bool realloc_if_needed) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse(const char *buf, size_t len, bool realloc_if_needed) & noexcept {
|
||||||
return parse(reinterpret_cast<const uint8_t *>(buf), len, realloc_if_needed);
|
return parse(reinterpret_cast<const uint8_t *>(buf), len, realloc_if_needed);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse(const std::string &s) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse(const std::string &s) & noexcept {
|
||||||
return parse(s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
|
return parse(s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<element> parser::parse(const padded_string &s) & noexcept {
|
simdjson_inline simdjson_result<element> parser::parse(const padded_string &s) & noexcept {
|
||||||
return parse(s.data(), s.length(), false);
|
return parse(s.data(), s.length(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,13 +157,13 @@ inline simdjson_result<document_stream> parser::parse_many(const padded_string &
|
|||||||
return parse_many(s.data(), s.length(), batch_size);
|
return parse_many(s.data(), s.length(), batch_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline size_t parser::capacity() const noexcept {
|
simdjson_inline size_t parser::capacity() const noexcept {
|
||||||
return implementation ? implementation->capacity() : 0;
|
return implementation ? implementation->capacity() : 0;
|
||||||
}
|
}
|
||||||
simdjson_really_inline size_t parser::max_capacity() const noexcept {
|
simdjson_inline size_t parser::max_capacity() const noexcept {
|
||||||
return _max_capacity;
|
return _max_capacity;
|
||||||
}
|
}
|
||||||
simdjson_really_inline size_t parser::max_depth() const noexcept {
|
simdjson_inline size_t parser::max_depth() const noexcept {
|
||||||
return implementation ? implementation->max_depth() : DEFAULT_MAX_DEPTH;
|
return implementation ? implementation->max_depth() : DEFAULT_MAX_DEPTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ inline error_code parser::ensure_capacity(document& target_document, size_t desi
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
|
simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
|
||||||
if(max_capacity < MINIMAL_DOCUMENT_CAPACITY) {
|
if(max_capacity < MINIMAL_DOCUMENT_CAPACITY) {
|
||||||
_max_capacity = max_capacity;
|
_max_capacity = max_capacity;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -68,20 +68,20 @@ public:
|
|||||||
* to allocate an initial capacity, call allocate() after constructing the parser.
|
* to allocate an initial capacity, call allocate() after constructing the parser.
|
||||||
* Defaults to SIMDJSON_MAXSIZE_BYTES (the largest single document simdjson can process).
|
* Defaults to SIMDJSON_MAXSIZE_BYTES (the largest single document simdjson can process).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
|
simdjson_inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
|
||||||
/**
|
/**
|
||||||
* Take another parser's buffers and state.
|
* Take another parser's buffers and state.
|
||||||
*
|
*
|
||||||
* @param other The parser to take. Its capacity is zeroed.
|
* @param other The parser to take. Its capacity is zeroed.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline parser(parser &&other) noexcept;
|
simdjson_inline parser(parser &&other) noexcept;
|
||||||
parser(const parser &) = delete; ///< @private Disallow copying
|
parser(const parser &) = delete; ///< @private Disallow copying
|
||||||
/**
|
/**
|
||||||
* Take another parser's buffers and state.
|
* Take another parser's buffers and state.
|
||||||
*
|
*
|
||||||
* @param other The parser to take. Its capacity is zeroed.
|
* @param other The parser to take. Its capacity is zeroed.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline parser &operator=(parser &&other) noexcept;
|
simdjson_inline parser &operator=(parser &&other) noexcept;
|
||||||
parser &operator=(const parser &) = delete; ///< @private Disallow copying
|
parser &operator=(const parser &) = delete; ///< @private Disallow copying
|
||||||
|
|
||||||
/** Deallocate the JSON parser. */
|
/** Deallocate the JSON parser. */
|
||||||
@@ -191,17 +191,17 @@ public:
|
|||||||
inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
||||||
inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
||||||
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
simdjson_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
simdjson_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
||||||
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse(const std::string &s) & noexcept;
|
simdjson_inline simdjson_result<element> parse(const std::string &s) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse(const std::string &s) && =delete;
|
simdjson_inline simdjson_result<element> parse(const std::string &s) && =delete;
|
||||||
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse(const padded_string &s) & noexcept;
|
simdjson_inline simdjson_result<element> parse(const padded_string &s) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse(const padded_string &s) && =delete;
|
simdjson_inline simdjson_result<element> parse(const padded_string &s) && =delete;
|
||||||
|
|
||||||
/** @private We do not want to allow implicit conversion from C string to std::string. */
|
/** @private We do not want to allow implicit conversion from C string to std::string. */
|
||||||
simdjson_really_inline simdjson_result<element> parse(const char *buf) noexcept = delete;
|
simdjson_inline simdjson_result<element> parse(const char *buf) noexcept = delete;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a JSON document into a provide document instance and return a temporary reference to it.
|
* Parse a JSON document into a provide document instance and return a temporary reference to it.
|
||||||
@@ -250,17 +250,17 @@ public:
|
|||||||
inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
||||||
inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
||||||
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
|
||||||
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) & noexcept;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) && =delete;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) && =delete;
|
||||||
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
/** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) & noexcept;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) && =delete;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) && =delete;
|
||||||
|
|
||||||
/** @private We do not want to allow implicit conversion from C string to std::string. */
|
/** @private We do not want to allow implicit conversion from C string to std::string. */
|
||||||
simdjson_really_inline simdjson_result<element> parse_into_document(document& doc, const char *buf) noexcept = delete;
|
simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf) noexcept = delete;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a file containing many JSON documents.
|
* Load a file containing many JSON documents.
|
||||||
@@ -472,7 +472,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return Current capacity, in bytes.
|
* @return Current capacity, in bytes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline size_t capacity() const noexcept;
|
simdjson_inline size_t capacity() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The largest document this parser can automatically support.
|
* The largest document this parser can automatically support.
|
||||||
@@ -481,14 +481,14 @@ public:
|
|||||||
*
|
*
|
||||||
* @return Maximum capacity, in bytes.
|
* @return Maximum capacity, in bytes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline size_t max_capacity() const noexcept;
|
simdjson_inline size_t max_capacity() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The maximum level of nested object and arrays supported by this parser.
|
* The maximum level of nested object and arrays supported by this parser.
|
||||||
*
|
*
|
||||||
* @return Maximum depth, in bytes.
|
* @return Maximum depth, in bytes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline size_t max_depth() const noexcept;
|
simdjson_inline size_t max_depth() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set max_capacity. This is the largest document this parser can automatically support.
|
* Set max_capacity. This is the largest document this parser can automatically support.
|
||||||
@@ -504,7 +504,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @param max_capacity The new maximum capacity, in bytes.
|
* @param max_capacity The new maximum capacity, in bytes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void set_max_capacity(size_t max_capacity) noexcept;
|
simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
|
||||||
|
|
||||||
#ifdef SIMDJSON_THREADS_ENABLED
|
#ifdef SIMDJSON_THREADS_ENABLED
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -107,19 +107,19 @@ namespace internal {
|
|||||||
* Minifier/formatter code.
|
* Minifier/formatter code.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
simdjson_really_inline void mini_formatter::number(uint64_t x) {
|
simdjson_inline void mini_formatter::number(uint64_t x) {
|
||||||
char number_buffer[24];
|
char number_buffer[24];
|
||||||
char *newp = fast_itoa(number_buffer, x);
|
char *newp = fast_itoa(number_buffer, x);
|
||||||
buffer.insert(buffer.end(), number_buffer, newp);
|
buffer.insert(buffer.end(), number_buffer, newp);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void mini_formatter::number(int64_t x) {
|
simdjson_inline void mini_formatter::number(int64_t x) {
|
||||||
char number_buffer[24];
|
char number_buffer[24];
|
||||||
char *newp = fast_itoa(number_buffer, x);
|
char *newp = fast_itoa(number_buffer, x);
|
||||||
buffer.insert(buffer.end(), number_buffer, newp);
|
buffer.insert(buffer.end(), number_buffer, newp);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void mini_formatter::number(double x) {
|
simdjson_inline void mini_formatter::number(double x) {
|
||||||
char number_buffer[24];
|
char number_buffer[24];
|
||||||
// Currently, passing the nullptr to the second argument is
|
// Currently, passing the nullptr to the second argument is
|
||||||
// safe because our implementation does not check the second
|
// safe because our implementation does not check the second
|
||||||
@@ -128,31 +128,31 @@ simdjson_really_inline void mini_formatter::number(double x) {
|
|||||||
buffer.insert(buffer.end(), number_buffer, newp);
|
buffer.insert(buffer.end(), number_buffer, newp);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void mini_formatter::start_array() { one_char('['); }
|
simdjson_inline void mini_formatter::start_array() { one_char('['); }
|
||||||
simdjson_really_inline void mini_formatter::end_array() { one_char(']'); }
|
simdjson_inline void mini_formatter::end_array() { one_char(']'); }
|
||||||
simdjson_really_inline void mini_formatter::start_object() { one_char('{'); }
|
simdjson_inline void mini_formatter::start_object() { one_char('{'); }
|
||||||
simdjson_really_inline void mini_formatter::end_object() { one_char('}'); }
|
simdjson_inline void mini_formatter::end_object() { one_char('}'); }
|
||||||
simdjson_really_inline void mini_formatter::comma() { one_char(','); }
|
simdjson_inline void mini_formatter::comma() { one_char(','); }
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline void mini_formatter::true_atom() {
|
simdjson_inline void mini_formatter::true_atom() {
|
||||||
const char * s = "true";
|
const char * s = "true";
|
||||||
buffer.insert(buffer.end(), s, s + 4);
|
buffer.insert(buffer.end(), s, s + 4);
|
||||||
}
|
}
|
||||||
simdjson_really_inline void mini_formatter::false_atom() {
|
simdjson_inline void mini_formatter::false_atom() {
|
||||||
const char * s = "false";
|
const char * s = "false";
|
||||||
buffer.insert(buffer.end(), s, s + 5);
|
buffer.insert(buffer.end(), s, s + 5);
|
||||||
}
|
}
|
||||||
simdjson_really_inline void mini_formatter::null_atom() {
|
simdjson_inline void mini_formatter::null_atom() {
|
||||||
const char * s = "null";
|
const char * s = "null";
|
||||||
buffer.insert(buffer.end(), s, s + 4);
|
buffer.insert(buffer.end(), s, s + 4);
|
||||||
}
|
}
|
||||||
simdjson_really_inline void mini_formatter::one_char(char c) { buffer.push_back(c); }
|
simdjson_inline void mini_formatter::one_char(char c) { buffer.push_back(c); }
|
||||||
simdjson_really_inline void mini_formatter::key(std::string_view unescaped) {
|
simdjson_inline void mini_formatter::key(std::string_view unescaped) {
|
||||||
string(unescaped);
|
string(unescaped);
|
||||||
one_char(':');
|
one_char(':');
|
||||||
}
|
}
|
||||||
simdjson_really_inline void mini_formatter::string(std::string_view unescaped) {
|
simdjson_inline void mini_formatter::string(std::string_view unescaped) {
|
||||||
one_char('\"');
|
one_char('\"');
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
// Fast path for the case where we have no control character, no ", and no backslash.
|
// Fast path for the case where we have no control character, no ", and no backslash.
|
||||||
@@ -235,7 +235,7 @@ inline void mini_formatter::clear() {
|
|||||||
buffer.clear();
|
buffer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline std::string_view mini_formatter::str() const {
|
simdjson_inline std::string_view mini_formatter::str() const {
|
||||||
return std::string_view(buffer.data(), buffer.size());
|
return std::string_view(buffer.data(), buffer.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,18 +406,18 @@ inline void string_builder<serializer>::append(simdjson::dom::array value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class serializer>
|
template <class serializer>
|
||||||
simdjson_really_inline void string_builder<serializer>::append(simdjson::dom::key_value_pair kv) {
|
simdjson_inline void string_builder<serializer>::append(simdjson::dom::key_value_pair kv) {
|
||||||
format.key(kv.key);
|
format.key(kv.key);
|
||||||
append(kv.value);
|
append(kv.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class serializer>
|
template <class serializer>
|
||||||
simdjson_really_inline void string_builder<serializer>::clear() {
|
simdjson_inline void string_builder<serializer>::clear() {
|
||||||
format.clear();
|
format.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class serializer>
|
template <class serializer>
|
||||||
simdjson_really_inline std::string_view string_builder<serializer>::str() const {
|
simdjson_inline std::string_view string_builder<serializer>::str() const {
|
||||||
return format.str();
|
return format.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,4 +425,4 @@ simdjson_really_inline std::string_view string_builder<serializer>::str() const
|
|||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
/** Append an object to the builder (to be printed) **/
|
/** Append an object to the builder (to be printed) **/
|
||||||
inline void append(simdjson::dom::object value);
|
inline void append(simdjson::dom::object value);
|
||||||
/** Reset the builder (so that it would print the empty string) **/
|
/** Reset the builder (so that it would print the empty string) **/
|
||||||
simdjson_really_inline void clear();
|
simdjson_inline void clear();
|
||||||
/**
|
/**
|
||||||
* Get access to the string. The string_view is owned by the builder
|
* Get access to the string. The string_view is owned by the builder
|
||||||
* and it is invalid to use it after the string_builder has been
|
* and it is invalid to use it after the string_builder has been
|
||||||
@@ -48,9 +48,9 @@ public:
|
|||||||
* However you can make a copy of the string_view on memory that you
|
* However you can make a copy of the string_view on memory that you
|
||||||
* own.
|
* own.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline std::string_view str() const;
|
simdjson_inline std::string_view str() const;
|
||||||
/** Append a key_value_pair to the builder (to be printed) **/
|
/** Append a key_value_pair to the builder (to be printed) **/
|
||||||
simdjson_really_inline void append(simdjson::dom::key_value_pair value);
|
simdjson_inline void append(simdjson::dom::key_value_pair value);
|
||||||
private:
|
private:
|
||||||
formatter format{};
|
formatter format{};
|
||||||
};
|
};
|
||||||
@@ -64,43 +64,43 @@ class mini_formatter {
|
|||||||
public:
|
public:
|
||||||
mini_formatter() = default;
|
mini_formatter() = default;
|
||||||
/** Add a comma **/
|
/** Add a comma **/
|
||||||
simdjson_really_inline void comma();
|
simdjson_inline void comma();
|
||||||
/** Start an array, prints [ **/
|
/** Start an array, prints [ **/
|
||||||
simdjson_really_inline void start_array();
|
simdjson_inline void start_array();
|
||||||
/** End an array, prints ] **/
|
/** End an array, prints ] **/
|
||||||
simdjson_really_inline void end_array();
|
simdjson_inline void end_array();
|
||||||
/** Start an array, prints { **/
|
/** Start an array, prints { **/
|
||||||
simdjson_really_inline void start_object();
|
simdjson_inline void start_object();
|
||||||
/** Start an array, prints } **/
|
/** Start an array, prints } **/
|
||||||
simdjson_really_inline void end_object();
|
simdjson_inline void end_object();
|
||||||
/** Prints a true **/
|
/** Prints a true **/
|
||||||
simdjson_really_inline void true_atom();
|
simdjson_inline void true_atom();
|
||||||
/** Prints a false **/
|
/** Prints a false **/
|
||||||
simdjson_really_inline void false_atom();
|
simdjson_inline void false_atom();
|
||||||
/** Prints a null **/
|
/** Prints a null **/
|
||||||
simdjson_really_inline void null_atom();
|
simdjson_inline void null_atom();
|
||||||
/** Prints a number **/
|
/** Prints a number **/
|
||||||
simdjson_really_inline void number(int64_t x);
|
simdjson_inline void number(int64_t x);
|
||||||
/** Prints a number **/
|
/** Prints a number **/
|
||||||
simdjson_really_inline void number(uint64_t x);
|
simdjson_inline void number(uint64_t x);
|
||||||
/** Prints a number **/
|
/** Prints a number **/
|
||||||
simdjson_really_inline void number(double x);
|
simdjson_inline void number(double x);
|
||||||
/** Prints a key (string + colon) **/
|
/** Prints a key (string + colon) **/
|
||||||
simdjson_really_inline void key(std::string_view unescaped);
|
simdjson_inline void key(std::string_view unescaped);
|
||||||
/** Prints a string. The string is escaped as needed. **/
|
/** Prints a string. The string is escaped as needed. **/
|
||||||
simdjson_really_inline void string(std::string_view unescaped);
|
simdjson_inline void string(std::string_view unescaped);
|
||||||
/** Clears out the content. **/
|
/** Clears out the content. **/
|
||||||
simdjson_really_inline void clear();
|
simdjson_inline void clear();
|
||||||
/**
|
/**
|
||||||
* Get access to the buffer, it is owned by the instance, but
|
* Get access to the buffer, it is owned by the instance, but
|
||||||
* the user can make a copy.
|
* the user can make a copy.
|
||||||
**/
|
**/
|
||||||
simdjson_really_inline std::string_view str() const;
|
simdjson_inline std::string_view str() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// implementation details (subject to change)
|
// implementation details (subject to change)
|
||||||
/** Prints one character **/
|
/** Prints one character **/
|
||||||
simdjson_really_inline void one_char(char c);
|
simdjson_inline void one_char(char c);
|
||||||
/** Backing buffer **/
|
/** Backing buffer **/
|
||||||
std::vector<char> buffer{}; // not ideal!
|
std::vector<char> buffer{}; // not ideal!
|
||||||
};
|
};
|
||||||
@@ -216,4 +216,4 @@ std::string minify(simdjson_result<T> x) {
|
|||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace internal {
|
|||||||
//
|
//
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline void simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept {
|
simdjson_inline void simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept {
|
||||||
error = this->second;
|
error = this->second;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
value = std::forward<simdjson_result_base<T>>(*this).first;
|
value = std::forward<simdjson_result_base<T>>(*this).first;
|
||||||
@@ -52,64 +52,64 @@ simdjson_really_inline void simdjson_result_base<T>::tie(T &value, error_code &e
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code simdjson_result_base<T>::get(T &value) && noexcept {
|
simdjson_warn_unused simdjson_inline error_code simdjson_result_base<T>::get(T &value) && noexcept {
|
||||||
error_code error;
|
error_code error;
|
||||||
std::forward<simdjson_result_base<T>>(*this).tie(value, error);
|
std::forward<simdjson_result_base<T>>(*this).tie(value, error);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline error_code simdjson_result_base<T>::error() const noexcept {
|
simdjson_inline error_code simdjson_result_base<T>::error() const noexcept {
|
||||||
return this->second;
|
return this->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T& simdjson_result_base<T>::value() & noexcept(false) {
|
simdjson_inline T& simdjson_result_base<T>::value() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return this->first;
|
return this->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result_base<T>::value() && noexcept(false) {
|
simdjson_inline T&& simdjson_result_base<T>::value() && noexcept(false) {
|
||||||
return std::forward<simdjson_result_base<T>>(*this).take_value();
|
return std::forward<simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result_base<T>::take_value() && noexcept(false) {
|
simdjson_inline T&& simdjson_result_base<T>::take_value() && noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return std::forward<T>(this->first);
|
return std::forward<T>(this->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result_base<T>::operator T&&() && noexcept(false) {
|
simdjson_inline simdjson_result_base<T>::operator T&&() && noexcept(false) {
|
||||||
return std::forward<simdjson_result_base<T>>(*this).take_value();
|
return std::forward<simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline const T& simdjson_result_base<T>::value_unsafe() const& noexcept {
|
simdjson_inline const T& simdjson_result_base<T>::value_unsafe() const& noexcept {
|
||||||
return this->first;
|
return this->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result_base<T>::value_unsafe() && noexcept {
|
simdjson_inline T&& simdjson_result_base<T>::value_unsafe() && noexcept {
|
||||||
return std::forward<T>(this->first);
|
return std::forward<T>(this->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result_base<T>::simdjson_result_base(T &&value, error_code error) noexcept
|
simdjson_inline simdjson_result_base<T>::simdjson_result_base(T &&value, error_code error) noexcept
|
||||||
: std::pair<T, error_code>(std::forward<T>(value), error) {}
|
: std::pair<T, error_code>(std::forward<T>(value), error) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result_base<T>::simdjson_result_base(error_code error) noexcept
|
simdjson_inline simdjson_result_base<T>::simdjson_result_base(error_code error) noexcept
|
||||||
: simdjson_result_base(T{}, error) {}
|
: simdjson_result_base(T{}, error) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result_base<T>::simdjson_result_base(T &&value) noexcept
|
simdjson_inline simdjson_result_base<T>::simdjson_result_base(T &&value) noexcept
|
||||||
: simdjson_result_base(std::forward<T>(value), SUCCESS) {}
|
: simdjson_result_base(std::forward<T>(value), SUCCESS) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result_base<T>::simdjson_result_base() noexcept
|
simdjson_inline simdjson_result_base<T>::simdjson_result_base() noexcept
|
||||||
: simdjson_result_base(T{}, UNINITIALIZED) {}
|
: simdjson_result_base(T{}, UNINITIALIZED) {}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
@@ -119,65 +119,65 @@ simdjson_really_inline simdjson_result_base<T>::simdjson_result_base() noexcept
|
|||||||
///
|
///
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline void simdjson_result<T>::tie(T &value, error_code &error) && noexcept {
|
simdjson_inline void simdjson_result<T>::tie(T &value, error_code &error) && noexcept {
|
||||||
std::forward<internal::simdjson_result_base<T>>(*this).tie(value, error);
|
std::forward<internal::simdjson_result_base<T>>(*this).tie(value, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code simdjson_result<T>::get(T &value) && noexcept {
|
simdjson_warn_unused simdjson_inline error_code simdjson_result<T>::get(T &value) && noexcept {
|
||||||
return std::forward<internal::simdjson_result_base<T>>(*this).get(value);
|
return std::forward<internal::simdjson_result_base<T>>(*this).get(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline error_code simdjson_result<T>::error() const noexcept {
|
simdjson_inline error_code simdjson_result<T>::error() const noexcept {
|
||||||
return internal::simdjson_result_base<T>::error();
|
return internal::simdjson_result_base<T>::error();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T& simdjson_result<T>::value() & noexcept(false) {
|
simdjson_inline T& simdjson_result<T>::value() & noexcept(false) {
|
||||||
return internal::simdjson_result_base<T>::value();
|
return internal::simdjson_result_base<T>::value();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result<T>::value() && noexcept(false) {
|
simdjson_inline T&& simdjson_result<T>::value() && noexcept(false) {
|
||||||
return std::forward<internal::simdjson_result_base<T>>(*this).value();
|
return std::forward<internal::simdjson_result_base<T>>(*this).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result<T>::take_value() && noexcept(false) {
|
simdjson_inline T&& simdjson_result<T>::take_value() && noexcept(false) {
|
||||||
return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
|
return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T>::operator T&&() && noexcept(false) {
|
simdjson_inline simdjson_result<T>::operator T&&() && noexcept(false) {
|
||||||
return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
|
return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline const T& simdjson_result<T>::value_unsafe() const& noexcept {
|
simdjson_inline const T& simdjson_result<T>::value_unsafe() const& noexcept {
|
||||||
return internal::simdjson_result_base<T>::value_unsafe();
|
return internal::simdjson_result_base<T>::value_unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& simdjson_result<T>::value_unsafe() && noexcept {
|
simdjson_inline T&& simdjson_result<T>::value_unsafe() && noexcept {
|
||||||
return std::forward<internal::simdjson_result_base<T>>(*this).value_unsafe();
|
return std::forward<internal::simdjson_result_base<T>>(*this).value_unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T>::simdjson_result(T &&value, error_code error) noexcept
|
simdjson_inline simdjson_result<T>::simdjson_result(T &&value, error_code error) noexcept
|
||||||
: internal::simdjson_result_base<T>(std::forward<T>(value), error) {}
|
: internal::simdjson_result_base<T>(std::forward<T>(value), error) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<T>::simdjson_result(error_code error) noexcept
|
||||||
: internal::simdjson_result_base<T>(error) {}
|
: internal::simdjson_result_base<T>(error) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T>::simdjson_result(T &&value) noexcept
|
simdjson_inline simdjson_result<T>::simdjson_result(T &&value) noexcept
|
||||||
: internal::simdjson_result_base<T>(std::forward<T>(value)) {}
|
: internal::simdjson_result_base<T>(std::forward<T>(value)) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T>::simdjson_result() noexcept
|
simdjson_inline simdjson_result<T>::simdjson_result() noexcept
|
||||||
: internal::simdjson_result_base<T>() {}
|
: internal::simdjson_result_base<T>() {}
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
+26
-26
@@ -111,22 +111,22 @@ struct simdjson_result_base : protected std::pair<T, error_code> {
|
|||||||
/**
|
/**
|
||||||
* Create a new empty result with error = UNINITIALIZED.
|
* Create a new empty result with error = UNINITIALIZED.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result_base() noexcept;
|
simdjson_inline simdjson_result_base() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new error result.
|
* Create a new error result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result_base(error_code error) noexcept;
|
simdjson_inline simdjson_result_base(error_code error) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new successful result.
|
* Create a new successful result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result_base(T &&value) noexcept;
|
simdjson_inline simdjson_result_base(T &&value) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new result with both things (use if you don't want to branch when creating the result).
|
* Create a new result with both things (use if you don't want to branch when creating the result).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result_base(T &&value, error_code error) noexcept;
|
simdjson_inline simdjson_result_base(T &&value, error_code error) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value and the error to the provided variables.
|
* Move the value and the error to the provided variables.
|
||||||
@@ -134,19 +134,19 @@ struct simdjson_result_base : protected std::pair<T, error_code> {
|
|||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void tie(T &value, error_code &error) && noexcept;
|
simdjson_inline void tie(T &value, error_code &error) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value to the provided variable.
|
* Move the value to the provided variable.
|
||||||
*
|
*
|
||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code get(T &value) && noexcept;
|
simdjson_inline error_code get(T &value) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The error.
|
* The error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code error() const noexcept;
|
simdjson_inline error_code error() const noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
@@ -155,41 +155,41 @@ struct simdjson_result_base : protected std::pair<T, error_code> {
|
|||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T& value() & noexcept(false);
|
simdjson_inline T& value() & noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value() && noexcept(false);
|
simdjson_inline T&& value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& take_value() && noexcept(false);
|
simdjson_inline T&& take_value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast to the value (will throw on error).
|
* Cast to the value (will throw on error).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator T&&() && noexcept(false);
|
simdjson_inline operator T&&() && noexcept(false);
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the result value. This function is safe if and only
|
* Get the result value. This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const T& value_unsafe() const& noexcept;
|
simdjson_inline const T& value_unsafe() const& noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it). This function is safe if and only
|
* Take the result value (move it). This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value_unsafe() && noexcept;
|
simdjson_inline T&& value_unsafe() && noexcept;
|
||||||
|
|
||||||
}; // struct simdjson_result_base
|
}; // struct simdjson_result_base
|
||||||
|
|
||||||
@@ -205,19 +205,19 @@ struct simdjson_result : public internal::simdjson_result_base<T> {
|
|||||||
/**
|
/**
|
||||||
* @private Create a new empty result with error = UNINITIALIZED.
|
* @private Create a new empty result with error = UNINITIALIZED.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result() noexcept;
|
simdjson_inline simdjson_result() noexcept;
|
||||||
/**
|
/**
|
||||||
* @private Create a new error result.
|
* @private Create a new error result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result(T &&value) noexcept;
|
simdjson_inline simdjson_result(T &&value) noexcept;
|
||||||
/**
|
/**
|
||||||
* @private Create a new successful result.
|
* @private Create a new successful result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result(error_code error_code) noexcept;
|
simdjson_inline simdjson_result(error_code error_code) noexcept;
|
||||||
/**
|
/**
|
||||||
* @private Create a new result with both things (use if you don't want to branch when creating the result).
|
* @private Create a new result with both things (use if you don't want to branch when creating the result).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result(T &&value, error_code error) noexcept;
|
simdjson_inline simdjson_result(T &&value, error_code error) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value and the error to the provided variables.
|
* Move the value and the error to the provided variables.
|
||||||
@@ -225,19 +225,19 @@ struct simdjson_result : public internal::simdjson_result_base<T> {
|
|||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void tie(T &value, error_code &error) && noexcept;
|
simdjson_inline void tie(T &value, error_code &error) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value to the provided variable.
|
* Move the value to the provided variable.
|
||||||
*
|
*
|
||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
*/
|
*/
|
||||||
simdjson_warn_unused simdjson_really_inline error_code get(T &value) && noexcept;
|
simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The error.
|
* The error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code error() const noexcept;
|
simdjson_inline error_code error() const noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
@@ -246,41 +246,41 @@ struct simdjson_result : public internal::simdjson_result_base<T> {
|
|||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T& value() & noexcept(false);
|
simdjson_inline T& value() & noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value() && noexcept(false);
|
simdjson_inline T&& value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& take_value() && noexcept(false);
|
simdjson_inline T&& take_value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast to the value (will throw on error).
|
* Cast to the value (will throw on error).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator T&&() && noexcept(false);
|
simdjson_inline operator T&&() && noexcept(false);
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the result value. This function is safe if and only
|
* Get the result value. This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const T& value_unsafe() const& noexcept;
|
simdjson_inline const T& value_unsafe() const& noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it). This function is safe if and only
|
* Take the result value (move it). This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value_unsafe() && noexcept;
|
simdjson_inline T&& value_unsafe() && noexcept;
|
||||||
|
|
||||||
}; // struct simdjson_result
|
}; // struct simdjson_result
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* result might be undefined when input_num is zero */
|
/* result might be undefined when input_num is zero */
|
||||||
simdjson_really_inline int leading_zeroes(uint64_t input_num) {
|
simdjson_inline int leading_zeroes(uint64_t input_num) {
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
unsigned long leading_zero = 0;
|
unsigned long leading_zero = 0;
|
||||||
// Search the mask data from most significant bit (MSB)
|
// Search the mask data from most significant bit (MSB)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using namespace simdjson::dom;
|
|||||||
|
|
||||||
class implementation final : public simdjson::implementation {
|
class implementation final : public simdjson::implementation {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline implementation() : simdjson::implementation(
|
simdjson_inline implementation() : simdjson::implementation(
|
||||||
"fallback",
|
"fallback",
|
||||||
"Generic fallback implementation",
|
"Generic fallback implementation",
|
||||||
0
|
0
|
||||||
@@ -30,4 +30,4 @@ public:
|
|||||||
} // namespace fallback
|
} // namespace fallback
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|
||||||
#endif // SIMDJSON_FALLBACK_IMPLEMENTATION_H
|
#endif // SIMDJSON_FALLBACK_IMPLEMENTATION_H
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace {
|
namespace {
|
||||||
// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
|
// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
|
||||||
static simdjson_really_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
|
static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
memcpy(&val, chars, sizeof(uint64_t));
|
memcpy(&val, chars, sizeof(uint64_t));
|
||||||
val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
|
val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
|
||||||
val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
|
val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
|
||||||
return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
|
return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
|
||||||
}
|
}
|
||||||
static simdjson_really_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
|
static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
|
||||||
return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars));
|
return parse_eight_digits_unrolled(reinterpret_cast<const char *>(chars));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,17 +11,17 @@ namespace {
|
|||||||
struct backslash_and_quote {
|
struct backslash_and_quote {
|
||||||
public:
|
public:
|
||||||
static constexpr uint32_t BYTES_PROCESSED = 1;
|
static constexpr uint32_t BYTES_PROCESSED = 1;
|
||||||
simdjson_really_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
|
simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
|
||||||
|
|
||||||
simdjson_really_inline bool has_quote_first() { return c == '"'; }
|
simdjson_inline bool has_quote_first() { return c == '"'; }
|
||||||
simdjson_really_inline bool has_backslash() { return c == '\\'; }
|
simdjson_inline bool has_backslash() { return c == '\\'; }
|
||||||
simdjson_really_inline int quote_index() { return c == '"' ? 0 : 1; }
|
simdjson_inline int quote_index() { return c == '"' ? 0 : 1; }
|
||||||
simdjson_really_inline int backslash_index() { return c == '\\' ? 0 : 1; }
|
simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; }
|
||||||
|
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
}; // struct backslash_and_quote
|
}; // struct backslash_and_quote
|
||||||
|
|
||||||
simdjson_really_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
|
simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
|
||||||
// store to dest unconditionally - we can overwrite the bits we don't like later
|
// store to dest unconditionally - we can overwrite the bits we don't like later
|
||||||
dst[0] = src[0];
|
dst[0] = src[0];
|
||||||
return { src[0] };
|
return { src[0] };
|
||||||
@@ -31,6 +31,4 @@ simdjson_really_inline backslash_and_quote backslash_and_quote::copy_and_find(co
|
|||||||
} // namespace SIMDJSON_IMPLEMENTATION
|
} // namespace SIMDJSON_IMPLEMENTATION
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|
||||||
#include "simdjson/generic/stringparsing.h"
|
|
||||||
|
|
||||||
#endif // SIMDJSON_FALLBACK_STRINGPARSING_H
|
#endif // SIMDJSON_FALLBACK_STRINGPARSING_H
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ namespace atomparsing {
|
|||||||
// You might think that using memcpy makes this function expensive, but you'd be wrong.
|
// You might think that using memcpy makes this function expensive, but you'd be wrong.
|
||||||
// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
|
// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
|
||||||
// to the compile-time constant 1936482662.
|
// to the compile-time constant 1936482662.
|
||||||
simdjson_really_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
|
simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
|
||||||
|
|
||||||
|
|
||||||
// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
|
// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
|
||||||
// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
|
// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
|
simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
|
||||||
uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
|
uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
|
||||||
static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
|
static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
|
||||||
std::memcpy(&srcval, src, sizeof(uint32_t));
|
std::memcpy(&srcval, src, sizeof(uint32_t));
|
||||||
@@ -24,36 +24,36 @@ simdjson_really_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_true_atom(const uint8_t *src) {
|
simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
|
||||||
return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
|
return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
|
simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
|
||||||
if (len > 4) { return is_valid_true_atom(src); }
|
if (len > 4) { return is_valid_true_atom(src); }
|
||||||
else if (len == 4) { return !str4ncmp(src, "true"); }
|
else if (len == 4) { return !str4ncmp(src, "true"); }
|
||||||
else { return false; }
|
else { return false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_false_atom(const uint8_t *src) {
|
simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
|
||||||
return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
|
return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
|
simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
|
||||||
if (len > 5) { return is_valid_false_atom(src); }
|
if (len > 5) { return is_valid_false_atom(src); }
|
||||||
else if (len == 5) { return !str4ncmp(src+1, "alse"); }
|
else if (len == 5) { return !str4ncmp(src+1, "alse"); }
|
||||||
else { return false; }
|
else { return false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_null_atom(const uint8_t *src) {
|
simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
|
||||||
return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
|
return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused
|
simdjson_warn_unused
|
||||||
simdjson_really_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
|
simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
|
||||||
if (len > 4) { return is_valid_null_atom(src); }
|
if (len > 4) { return is_valid_null_atom(src); }
|
||||||
else if (len == 4) { return !str4ncmp(src, "null"); }
|
else if (len == 4) { return !str4ncmp(src, "null"); }
|
||||||
else { return false; }
|
else { return false; }
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public:
|
|||||||
inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
|
inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
|
||||||
inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
|
inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
|
simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace SIMDJSON_IMPLEMENTATION {
|
|||||||
//
|
//
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline void implementation_simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept {
|
simdjson_inline void implementation_simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept {
|
||||||
error = this->second;
|
error = this->second;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
value = std::forward<implementation_simdjson_result_base<T>>(*this).first;
|
value = std::forward<implementation_simdjson_result_base<T>>(*this).first;
|
||||||
@@ -14,67 +14,67 @@ simdjson_really_inline void implementation_simdjson_result_base<T>::tie(T &value
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_warn_unused simdjson_really_inline error_code implementation_simdjson_result_base<T>::get(T &value) && noexcept {
|
simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base<T>::get(T &value) && noexcept {
|
||||||
error_code error;
|
error_code error;
|
||||||
std::forward<implementation_simdjson_result_base<T>>(*this).tie(value, error);
|
std::forward<implementation_simdjson_result_base<T>>(*this).tie(value, error);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline error_code implementation_simdjson_result_base<T>::error() const noexcept {
|
simdjson_inline error_code implementation_simdjson_result_base<T>::error() const noexcept {
|
||||||
return this->second;
|
return this->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T& implementation_simdjson_result_base<T>::value() & noexcept(false) {
|
simdjson_inline T& implementation_simdjson_result_base<T>::value() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return this->first;
|
return this->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& implementation_simdjson_result_base<T>::value() && noexcept(false) {
|
simdjson_inline T&& implementation_simdjson_result_base<T>::value() && noexcept(false) {
|
||||||
return std::forward<implementation_simdjson_result_base<T>>(*this).take_value();
|
return std::forward<implementation_simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& implementation_simdjson_result_base<T>::take_value() && noexcept(false) {
|
simdjson_inline T&& implementation_simdjson_result_base<T>::take_value() && noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return std::forward<T>(this->first);
|
return std::forward<T>(this->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline implementation_simdjson_result_base<T>::operator T&&() && noexcept(false) {
|
simdjson_inline implementation_simdjson_result_base<T>::operator T&&() && noexcept(false) {
|
||||||
return std::forward<implementation_simdjson_result_base<T>>(*this).take_value();
|
return std::forward<implementation_simdjson_result_base<T>>(*this).take_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline const T& implementation_simdjson_result_base<T>::value_unsafe() const& noexcept {
|
simdjson_inline const T& implementation_simdjson_result_base<T>::value_unsafe() const& noexcept {
|
||||||
return this->first;
|
return this->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T& implementation_simdjson_result_base<T>::value_unsafe() & noexcept {
|
simdjson_inline T& implementation_simdjson_result_base<T>::value_unsafe() & noexcept {
|
||||||
return this->first;
|
return this->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline T&& implementation_simdjson_result_base<T>::value_unsafe() && noexcept {
|
simdjson_inline T&& implementation_simdjson_result_base<T>::value_unsafe() && noexcept {
|
||||||
return std::forward<T>(this->first);
|
return std::forward<T>(this->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value, error_code error) noexcept
|
simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value, error_code error) noexcept
|
||||||
: first{std::forward<T>(value)}, second{error} {}
|
: first{std::forward<T>(value)}, second{error} {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(error_code error) noexcept
|
simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base(T{}, error) {}
|
: implementation_simdjson_result_base(T{}, error) {}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept
|
simdjson_inline implementation_simdjson_result_base<T>::implementation_simdjson_result_base(T &&value) noexcept
|
||||||
: implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {}
|
: implementation_simdjson_result_base(std::forward<T>(value), SUCCESS) {}
|
||||||
|
|
||||||
} // namespace SIMDJSON_IMPLEMENTATION
|
} // namespace SIMDJSON_IMPLEMENTATION
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -30,22 +30,22 @@ struct implementation_simdjson_result_base {
|
|||||||
/**
|
/**
|
||||||
* Create a new empty result with error = UNINITIALIZED.
|
* Create a new empty result with error = UNINITIALIZED.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline implementation_simdjson_result_base() noexcept = default;
|
simdjson_inline implementation_simdjson_result_base() noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new error result.
|
* Create a new error result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline implementation_simdjson_result_base(error_code error) noexcept;
|
simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new successful result.
|
* Create a new successful result.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline implementation_simdjson_result_base(T &&value) noexcept;
|
simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new result with both things (use if you don't want to branch when creating the result).
|
* Create a new result with both things (use if you don't want to branch when creating the result).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
|
simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value and the error to the provided variables.
|
* Move the value and the error to the provided variables.
|
||||||
@@ -53,19 +53,19 @@ struct implementation_simdjson_result_base {
|
|||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
* @param error The variable to assign the error to. Set to SUCCESS if there is no error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void tie(T &value, error_code &error) && noexcept;
|
simdjson_inline void tie(T &value, error_code &error) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the value to the provided variable.
|
* Move the value to the provided variable.
|
||||||
*
|
*
|
||||||
* @param value The variable to assign the value to. May not be set if there is an error.
|
* @param value The variable to assign the value to. May not be set if there is an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code get(T &value) && noexcept;
|
simdjson_inline error_code get(T &value) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The error.
|
* The error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code error() const noexcept;
|
simdjson_inline error_code error() const noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
|
|
||||||
@@ -74,28 +74,28 @@ struct implementation_simdjson_result_base {
|
|||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T& value() & noexcept(false);
|
simdjson_inline T& value() & noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value() && noexcept(false);
|
simdjson_inline T&& value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it).
|
* Take the result value (move it).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& take_value() && noexcept(false);
|
simdjson_inline T&& take_value() && noexcept(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast to the value (will throw on error).
|
* Cast to the value (will throw on error).
|
||||||
*
|
*
|
||||||
* @throw simdjson_error if there was an error.
|
* @throw simdjson_error if there was an error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator T&&() && noexcept(false);
|
simdjson_inline operator T&&() && noexcept(false);
|
||||||
|
|
||||||
|
|
||||||
#endif // SIMDJSON_EXCEPTIONS
|
#endif // SIMDJSON_EXCEPTIONS
|
||||||
@@ -104,17 +104,17 @@ struct implementation_simdjson_result_base {
|
|||||||
* Get the result value. This function is safe if and only
|
* Get the result value. This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const T& value_unsafe() const& noexcept;
|
simdjson_inline const T& value_unsafe() const& noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the result value. This function is safe if and only
|
* Get the result value. This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T& value_unsafe() & noexcept;
|
simdjson_inline T& value_unsafe() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Take the result value (move it). This function is safe if and only
|
* Take the result value (move it). This function is safe if and only
|
||||||
* the error() method returns a value that evaluates to false.
|
* the error() method returns a value that evaluates to false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline T&& value_unsafe() && noexcept;
|
simdjson_inline T&& value_unsafe() && noexcept;
|
||||||
protected:
|
protected:
|
||||||
/** users should never directly access first and second. **/
|
/** users should never directly access first and second. **/
|
||||||
T first{}; /** Users should never directly access 'first'. **/
|
T first{}; /** Users should never directly access 'first'. **/
|
||||||
@@ -122,4 +122,4 @@ protected:
|
|||||||
}; // struct implementation_simdjson_result_base
|
}; // struct implementation_simdjson_result_base
|
||||||
|
|
||||||
} // namespace SIMDJSON_IMPLEMENTATION
|
} // namespace SIMDJSON_IMPLEMENTATION
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ namespace jsoncharutils {
|
|||||||
|
|
||||||
// return non-zero if not a structural or whitespace char
|
// return non-zero if not a structural or whitespace char
|
||||||
// zero otherwise
|
// zero otherwise
|
||||||
simdjson_really_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
|
simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
|
||||||
return internal::structural_or_whitespace_negated[c];
|
return internal::structural_or_whitespace_negated[c];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint32_t is_structural_or_whitespace(uint8_t c) {
|
simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
|
||||||
return internal::structural_or_whitespace[c];
|
return internal::structural_or_whitespace[c];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ static inline uint32_t hex_to_u32_nocheck(
|
|||||||
//
|
//
|
||||||
// Note: we assume that surrogates are treated separately
|
// Note: we assume that surrogates are treated separately
|
||||||
//
|
//
|
||||||
simdjson_really_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
|
simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
|
||||||
if (cp <= 0x7F) {
|
if (cp <= 0x7F) {
|
||||||
c[0] = uint8_t(cp);
|
c[0] = uint8_t(cp);
|
||||||
return 1; // ascii
|
return 1; // ascii
|
||||||
@@ -75,10 +75,10 @@ simdjson_really_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
|
|||||||
#ifdef SIMDJSON_IS_32BITS // _umul128 for x86, arm
|
#ifdef SIMDJSON_IS_32BITS // _umul128 for x86, arm
|
||||||
// this is a slow emulation routine for 32-bit
|
// this is a slow emulation routine for 32-bit
|
||||||
//
|
//
|
||||||
static simdjson_really_inline uint64_t __emulu(uint32_t x, uint32_t y) {
|
static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
|
||||||
return x * (uint64_t)y;
|
return x * (uint64_t)y;
|
||||||
}
|
}
|
||||||
static simdjson_really_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
|
static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
|
||||||
uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
|
uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
|
||||||
uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
|
uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
|
||||||
uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
|
uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
|
||||||
@@ -92,7 +92,7 @@ static simdjson_really_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64
|
|||||||
|
|
||||||
using internal::value128;
|
using internal::value128;
|
||||||
|
|
||||||
simdjson_really_inline value128 full_multiplication(uint64_t value1, uint64_t value2) {
|
simdjson_inline value128 full_multiplication(uint64_t value1, uint64_t value2) {
|
||||||
value128 answer;
|
value128 answer;
|
||||||
#if defined(SIMDJSON_REGULAR_VISUAL_STUDIO) || defined(SIMDJSON_IS_32BITS)
|
#if defined(SIMDJSON_REGULAR_VISUAL_STUDIO) || defined(SIMDJSON_IS_32BITS)
|
||||||
#ifdef _M_ARM64
|
#ifdef _M_ARM64
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace {
|
|||||||
// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
|
// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
|
||||||
// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
|
// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
|
||||||
// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
|
// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
|
||||||
simdjson_really_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
|
simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
|
||||||
double d;
|
double d;
|
||||||
mantissa &= ~(1ULL << 52);
|
mantissa &= ~(1ULL << 52);
|
||||||
mantissa |= real_exponent << 52;
|
mantissa |= real_exponent << 52;
|
||||||
@@ -52,7 +52,7 @@ simdjson_really_inline double to_double(uint64_t mantissa, uint64_t real_exponen
|
|||||||
// set to false. This should work *most of the time* (like 99% of the time).
|
// set to false. This should work *most of the time* (like 99% of the time).
|
||||||
// We assume that power is in the [smallest_power,
|
// We assume that power is in the [smallest_power,
|
||||||
// largest_power] interval: the caller is responsible for this check.
|
// largest_power] interval: the caller is responsible for this check.
|
||||||
simdjson_really_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
|
simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
|
||||||
// we start with a fast path
|
// we start with a fast path
|
||||||
// It was described in
|
// It was described in
|
||||||
// Clinger WD. How to read floating point numbers accurately.
|
// Clinger WD. How to read floating point numbers accurately.
|
||||||
@@ -335,7 +335,7 @@ static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, dou
|
|||||||
// check quickly whether the next 8 chars are made of digits
|
// check quickly whether the next 8 chars are made of digits
|
||||||
// at a glance, it looks better than Mula's
|
// at a glance, it looks better than Mula's
|
||||||
// http://0x80.pl/articles/swar-digits-validate.html
|
// http://0x80.pl/articles/swar-digits-validate.html
|
||||||
simdjson_really_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
|
simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
// this can read up to 7 bytes beyond the buffer size, but we require
|
// this can read up to 7 bytes beyond the buffer size, but we require
|
||||||
// SIMDJSON_PADDING of padding
|
// SIMDJSON_PADDING of padding
|
||||||
@@ -362,7 +362,7 @@ error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
|
|||||||
|
|
||||||
template<typename I>
|
template<typename I>
|
||||||
SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
|
SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
|
||||||
simdjson_really_inline bool parse_digit(const uint8_t c, I &i) {
|
simdjson_inline bool parse_digit(const uint8_t c, I &i) {
|
||||||
const uint8_t digit = static_cast<uint8_t>(c - '0');
|
const uint8_t digit = static_cast<uint8_t>(c - '0');
|
||||||
if (digit > 9) {
|
if (digit > 9) {
|
||||||
return false;
|
return false;
|
||||||
@@ -372,7 +372,7 @@ simdjson_really_inline bool parse_digit(const uint8_t c, I &i) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline error_code parse_decimal(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
|
simdjson_inline error_code parse_decimal(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
|
||||||
// we continue with the fiction that we have an integer. If the
|
// we continue with the fiction that we have an integer. If the
|
||||||
// floating point number is representable as x * 10^z for some integer
|
// floating point number is representable as x * 10^z for some integer
|
||||||
// z that fits in 53 bits, then we will be able to convert back the
|
// z that fits in 53 bits, then we will be able to convert back the
|
||||||
@@ -400,7 +400,7 @@ simdjson_really_inline error_code parse_decimal(simdjson_unused const uint8_t *c
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
|
simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
|
||||||
// Exp Sign: -123.456e[-]78
|
// Exp Sign: -123.456e[-]78
|
||||||
bool neg_exp = ('-' == *p);
|
bool neg_exp = ('-' == *p);
|
||||||
if (neg_exp || '+' == *p) { p++; } // Skip + as well
|
if (neg_exp || '+' == *p) { p++; } // Skip + as well
|
||||||
@@ -451,7 +451,7 @@ simdjson_really_inline error_code parse_exponent(simdjson_unused const uint8_t *
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
|
simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
|
||||||
// It is possible that the integer had an overflow.
|
// It is possible that the integer had an overflow.
|
||||||
// We have to handle the case where we have 0.0000somenumber.
|
// We have to handle the case where we have 0.0000somenumber.
|
||||||
const uint8_t *start = start_digits;
|
const uint8_t *start = start_digits;
|
||||||
@@ -461,7 +461,7 @@ simdjson_really_inline size_t significant_digits(const uint8_t * start_digits, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename W>
|
template<typename W>
|
||||||
simdjson_really_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
|
simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
|
||||||
// If we frequently had to deal with long strings of digits,
|
// If we frequently had to deal with long strings of digits,
|
||||||
// we could extend our code by using a 128-bit integer instead
|
// we could extend our code by using a 128-bit integer instead
|
||||||
// of a 64-bit integer. However, this is uncommon in practice.
|
// of a 64-bit integer. However, this is uncommon in practice.
|
||||||
@@ -517,20 +517,20 @@ simdjson_really_inline error_code write_float(const uint8_t *const src, bool neg
|
|||||||
#ifdef SIMDJSON_SKIPNUMBERPARSING
|
#ifdef SIMDJSON_SKIPNUMBERPARSING
|
||||||
|
|
||||||
template<typename W>
|
template<typename W>
|
||||||
simdjson_really_inline error_code parse_number(const uint8_t *const, W &writer) {
|
simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
|
||||||
writer.append_s64(0); // always write zero
|
writer.append_s64(0); // always write zero
|
||||||
return SUCCESS; // always succeeds
|
return SUCCESS; // always succeeds
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<double> parse_double(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<double> parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
|
simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
|
||||||
simdjson_unused simdjson_really_inline bool is_negative(const uint8_t * src) noexcept { return false; }
|
simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept { return false; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { return false; }
|
simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept { return false; }
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<ondemand::number_type> get_number_type(const uint8_t * src) noexcept { return ondemand::number_type::signed_integer; }
|
simdjson_unused simdjson_inline simdjson_result<ondemand::number_type> get_number_type(const uint8_t * src) noexcept { return ondemand::number_type::signed_integer; }
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// parse the number at src
|
// parse the number at src
|
||||||
@@ -543,7 +543,7 @@ simdjson_unused simdjson_really_inline simdjson_result<ondemand::number_type> ge
|
|||||||
//
|
//
|
||||||
// Our objective is accurate parsing (ULP of 0) at high speed.
|
// Our objective is accurate parsing (ULP of 0) at high speed.
|
||||||
template<typename W>
|
template<typename W>
|
||||||
simdjson_really_inline error_code parse_number(const uint8_t *const src, W &writer) {
|
simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
@@ -693,7 +693,7 @@ const uint8_t integer_string_finisher[256] = {
|
|||||||
NUMBER_ERROR};
|
NUMBER_ERROR};
|
||||||
|
|
||||||
// Parse any number from 0 to 18,446,744,073,709,551,615
|
// Parse any number from 0 to 18,446,744,073,709,551,615
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src) noexcept {
|
||||||
const uint8_t *p = src;
|
const uint8_t *p = src;
|
||||||
//
|
//
|
||||||
// Parse the integer part.
|
// Parse the integer part.
|
||||||
@@ -743,7 +743,7 @@ simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned(
|
|||||||
|
|
||||||
// Parse any number from 0 to 18,446,744,073,709,551,615
|
// Parse any number from 0 to 18,446,744,073,709,551,615
|
||||||
// Never read at src_end or beyond
|
// Never read at src_end or beyond
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
|
||||||
const uint8_t *p = src;
|
const uint8_t *p = src;
|
||||||
//
|
//
|
||||||
// Parse the integer part.
|
// Parse the integer part.
|
||||||
@@ -791,7 +791,7 @@ simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse any number from 0 to 18,446,744,073,709,551,615
|
// Parse any number from 0 to 18,446,744,073,709,551,615
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<uint64_t> parse_unsigned_in_string(const uint8_t * const src) noexcept {
|
||||||
const uint8_t *p = src + 1;
|
const uint8_t *p = src + 1;
|
||||||
//
|
//
|
||||||
// Parse the integer part.
|
// Parse the integer part.
|
||||||
@@ -841,7 +841,7 @@ simdjson_unused simdjson_really_inline simdjson_result<uint64_t> parse_unsigned_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer(const uint8_t *src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t *src) noexcept {
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
//
|
//
|
||||||
@@ -884,7 +884,7 @@ simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer(co
|
|||||||
|
|
||||||
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
||||||
// Never read at src_end or beyond
|
// Never read at src_end or beyond
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
//
|
//
|
||||||
@@ -927,7 +927,7 @@ simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer(co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
// Parse any number from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t *src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<int64_t> parse_integer_in_string(const uint8_t *src) noexcept {
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
//
|
//
|
||||||
@@ -968,7 +968,7 @@ simdjson_unused simdjson_really_inline simdjson_result<int64_t> parse_integer_in
|
|||||||
return negative ? (~i+1) : i;
|
return negative ? (~i+1) : i;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<double> parse_double(const uint8_t * src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src) noexcept {
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
//
|
//
|
||||||
@@ -1046,11 +1046,11 @@ simdjson_unused simdjson_really_inline simdjson_result<double> parse_double(cons
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline bool is_negative(const uint8_t * src) noexcept {
|
simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
|
||||||
return (*src == '-');
|
return (*src == '-');
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<bool> is_integer(const uint8_t * src) noexcept {
|
||||||
bool negative = (*src == '-');
|
bool negative = (*src == '-');
|
||||||
src += negative;
|
src += negative;
|
||||||
const uint8_t *p = src;
|
const uint8_t *p = src;
|
||||||
@@ -1060,7 +1060,7 @@ simdjson_unused simdjson_really_inline simdjson_result<bool> is_integer(const ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<ondemand::number_type> get_number_type(const uint8_t * src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<ondemand::number_type> get_number_type(const uint8_t * src) noexcept {
|
||||||
bool negative = (*src == '-');
|
bool negative = (*src == '-');
|
||||||
src += negative;
|
src += negative;
|
||||||
const uint8_t *p = src;
|
const uint8_t *p = src;
|
||||||
@@ -1086,7 +1086,7 @@ simdjson_unused simdjson_really_inline simdjson_result<ondemand::number_type> ge
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Never read at src_end or beyond
|
// Never read at src_end or beyond
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<double> parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<double> parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
|
||||||
if(src == src_end) { return NUMBER_ERROR; }
|
if(src == src_end) { return NUMBER_ERROR; }
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
@@ -1167,7 +1167,7 @@ simdjson_unused simdjson_really_inline simdjson_result<double> parse_double(cons
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline simdjson_result<double> parse_double_in_string(const uint8_t * src) noexcept {
|
simdjson_unused simdjson_inline simdjson_result<double> parse_double_in_string(const uint8_t * src) noexcept {
|
||||||
//
|
//
|
||||||
// Check for minus sign
|
// Check for minus sign
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -40,45 +40,45 @@ namespace ondemand {
|
|||||||
// error == SUCCESS.
|
// error == SUCCESS.
|
||||||
//
|
//
|
||||||
|
|
||||||
simdjson_really_inline array::array(const value_iterator &_iter) noexcept
|
simdjson_inline array::array(const value_iterator &_iter) noexcept
|
||||||
: iter{_iter}
|
: iter{_iter}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<array> array::start(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<array> array::start(value_iterator &iter) noexcept {
|
||||||
// We don't need to know if the array is empty to start iteration, but we do want to know if there
|
// We don't need to know if the array is empty to start iteration, but we do want to know if there
|
||||||
// is an error--thus `simdjson_unused`.
|
// is an error--thus `simdjson_unused`.
|
||||||
simdjson_unused bool has_value;
|
simdjson_unused bool has_value;
|
||||||
SIMDJSON_TRY( iter.start_array().get(has_value) );
|
SIMDJSON_TRY( iter.start_array().get(has_value) );
|
||||||
return array(iter);
|
return array(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array> array::start_root(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<array> array::start_root(value_iterator &iter) noexcept {
|
||||||
simdjson_unused bool has_value;
|
simdjson_unused bool has_value;
|
||||||
SIMDJSON_TRY( iter.start_root_array().get(has_value) );
|
SIMDJSON_TRY( iter.start_root_array().get(has_value) );
|
||||||
return array(iter);
|
return array(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array> array::started(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<array> array::started(value_iterator &iter) noexcept {
|
||||||
bool has_value;
|
bool has_value;
|
||||||
SIMDJSON_TRY(iter.started_array().get(has_value));
|
SIMDJSON_TRY(iter.started_array().get(has_value));
|
||||||
return array(iter);
|
return array(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<array_iterator> array::begin() noexcept {
|
simdjson_inline simdjson_result<array_iterator> array::begin() noexcept {
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
|
if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
|
||||||
#endif
|
#endif
|
||||||
return array_iterator(iter);
|
return array_iterator(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array_iterator> array::end() noexcept {
|
simdjson_inline simdjson_result<array_iterator> array::end() noexcept {
|
||||||
return array_iterator(iter);
|
return array_iterator(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code array::consume() noexcept {
|
simdjson_inline error_code array::consume() noexcept {
|
||||||
auto error = iter.json_iter().skip_child(iter.depth()-1);
|
auto error = iter.json_iter().skip_child(iter.depth()-1);
|
||||||
if(error) { iter.abandon(); }
|
if(error) { iter.abandon(); }
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> array::raw_json() noexcept {
|
simdjson_inline simdjson_result<std::string_view> array::raw_json() noexcept {
|
||||||
const uint8_t * starting_point{iter.peek_start()};
|
const uint8_t * starting_point{iter.peek_start()};
|
||||||
auto error = consume();
|
auto error = consume();
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
@@ -91,7 +91,7 @@ simdjson_really_inline simdjson_result<std::string_view> array::raw_json() noexc
|
|||||||
|
|
||||||
SIMDJSON_PUSH_DISABLE_WARNINGS
|
SIMDJSON_PUSH_DISABLE_WARNINGS
|
||||||
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
||||||
simdjson_really_inline simdjson_result<size_t> array::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> array::count_elements() & noexcept {
|
||||||
size_t count{0};
|
size_t count{0};
|
||||||
// Important: we do not consume any of the values.
|
// Important: we do not consume any of the values.
|
||||||
for(simdjson_unused auto v : *this) { count++; }
|
for(simdjson_unused auto v : *this) { count++; }
|
||||||
@@ -104,7 +104,7 @@ simdjson_really_inline simdjson_result<size_t> array::count_elements() & noexcep
|
|||||||
}
|
}
|
||||||
SIMDJSON_POP_DISABLE_WARNINGS
|
SIMDJSON_POP_DISABLE_WARNINGS
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> array::is_empty() & noexcept {
|
simdjson_inline simdjson_result<bool> array::is_empty() & noexcept {
|
||||||
bool is_not_empty;
|
bool is_not_empty;
|
||||||
auto error = iter.reset_array().get(is_not_empty);
|
auto error = iter.reset_array().get(is_not_empty);
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
@@ -151,7 +151,7 @@ inline simdjson_result<value> array::at_pointer(std::string_view json_pointer) n
|
|||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> array::at(size_t index) noexcept {
|
simdjson_inline simdjson_result<value> array::at(size_t index) noexcept {
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (auto value : *this) {
|
for (auto value : *this) {
|
||||||
if (i == index) { return value; }
|
if (i == index) { return value; }
|
||||||
@@ -166,7 +166,7 @@ simdjson_really_inline simdjson_result<value> array::at(size_t index) noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::array &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::array &&value
|
||||||
) noexcept
|
) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(
|
||||||
@@ -174,34 +174,34 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
|
||||||
error_code error
|
error_code error
|
||||||
) noexcept
|
) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(error)
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::begin() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::begin() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::end() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::end() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.end();
|
return first.end();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::count_elements() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_elements();
|
return first.count_elements();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::is_empty() & noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::is_empty() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_empty();
|
return first.is_empty();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at(size_t index) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at(size_t index) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at(index);
|
return first.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,20 +17,20 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline array() noexcept = default;
|
simdjson_inline array() noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begin array iteration.
|
* Begin array iteration.
|
||||||
*
|
*
|
||||||
* Part of the std::iterable interface.
|
* Part of the std::iterable interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> begin() noexcept;
|
simdjson_inline simdjson_result<array_iterator> begin() noexcept;
|
||||||
/**
|
/**
|
||||||
* Sentinel representing the end of the array.
|
* Sentinel representing the end of the array.
|
||||||
*
|
*
|
||||||
* Part of the std::iterable interface.
|
* Part of the std::iterable interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> end() noexcept;
|
simdjson_inline simdjson_result<array_iterator> end() noexcept;
|
||||||
/**
|
/**
|
||||||
* This method scans the array and counts the number of elements.
|
* This method scans the array and counts the number of elements.
|
||||||
* The count_elements method should always be called before you have begun
|
* The count_elements method should always be called before you have begun
|
||||||
@@ -45,7 +45,7 @@ public:
|
|||||||
* To check that an array is empty, it is more performant to use
|
* To check that an array is empty, it is more performant to use
|
||||||
* the is_empty() method.
|
* the is_empty() method.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
/**
|
/**
|
||||||
* This method scans the beginning of the array and checks whether the
|
* This method scans the beginning of the array and checks whether the
|
||||||
* array is empty.
|
* array is empty.
|
||||||
@@ -55,7 +55,7 @@ public:
|
|||||||
* there is a missing comma), then an error is returned and it is no longer
|
* there is a missing comma), then an error is returned and it is no longer
|
||||||
* safe to continue.
|
* safe to continue.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> is_empty() & noexcept;
|
simdjson_inline simdjson_result<bool> is_empty() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Reset the iterator so that we are pointing back at the
|
* Reset the iterator so that we are pointing back at the
|
||||||
* beginning of the array. You should still consume values only once even if you
|
* beginning of the array. You should still consume values only once even if you
|
||||||
@@ -100,7 +100,7 @@ public:
|
|||||||
* Consumes the array and returns a string_view instance corresponding to the
|
* Consumes the array and returns a string_view instance corresponding to the
|
||||||
* array as represented in JSON. It points inside the original document.
|
* array as represented in JSON. It points inside the original document.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value at the given index. This function has linear-time complexity.
|
* Get the value at the given index. This function has linear-time complexity.
|
||||||
@@ -109,12 +109,12 @@ public:
|
|||||||
* @return The value at the given index, or:
|
* @return The value at the given index, or:
|
||||||
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> at(size_t index) noexcept;
|
simdjson_inline simdjson_result<value> at(size_t index) noexcept;
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Go to the end of the array, no matter where you are right now.
|
* Go to the end of the array, no matter where you are right now.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code consume() noexcept;
|
simdjson_inline error_code consume() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begin array iteration.
|
* Begin array iteration.
|
||||||
@@ -123,7 +123,7 @@ protected:
|
|||||||
* resulting array.
|
* resulting array.
|
||||||
* @error INCORRECT_TYPE if the iterator is not at [.
|
* @error INCORRECT_TYPE if the iterator is not at [.
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline simdjson_result<array> start(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<array> start(value_iterator &iter) noexcept;
|
||||||
/**
|
/**
|
||||||
* Begin array iteration from the root.
|
* Begin array iteration from the root.
|
||||||
*
|
*
|
||||||
@@ -132,7 +132,7 @@ protected:
|
|||||||
* @error INCORRECT_TYPE if the iterator is not at [.
|
* @error INCORRECT_TYPE if the iterator is not at [.
|
||||||
* @error TAPE_ERROR if there is no closing ] at the end of the document.
|
* @error TAPE_ERROR if there is no closing ] at the end of the document.
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline simdjson_result<array> start_root(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<array> start_root(value_iterator &iter) noexcept;
|
||||||
/**
|
/**
|
||||||
* Begin array iteration.
|
* Begin array iteration.
|
||||||
*
|
*
|
||||||
@@ -141,7 +141,7 @@ protected:
|
|||||||
*
|
*
|
||||||
* @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
|
* @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline simdjson_result<array> started(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<array> started(value_iterator &iter) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
|
* Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
|
||||||
@@ -150,7 +150,7 @@ protected:
|
|||||||
* == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
|
* == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
|
||||||
* into the resulting array.
|
* into the resulting array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline array(const value_iterator &iter) noexcept;
|
simdjson_inline array(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterator marking current position.
|
* Iterator marking current position.
|
||||||
@@ -175,17 +175,17 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::array &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::array &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() noexcept;
|
||||||
inline simdjson_result<size_t> count_elements() & noexcept;
|
inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
inline simdjson_result<bool> is_empty() & noexcept;
|
inline simdjson_result<bool> is_empty() & noexcept;
|
||||||
inline simdjson_result<bool> reset() & noexcept;
|
inline simdjson_result<bool> reset() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,21 +2,21 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
|
simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
|
||||||
: iter{_iter}
|
: iter{_iter}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> array_iterator::operator*() noexcept {
|
simdjson_inline simdjson_result<value> array_iterator::operator*() noexcept {
|
||||||
if (iter.error()) { iter.abandon(); return iter.error(); }
|
if (iter.error()) { iter.abandon(); return iter.error(); }
|
||||||
return value(iter.child());
|
return value(iter.child());
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
|
simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
|
||||||
return !(*this != other);
|
return !(*this != other);
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
|
simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
|
||||||
return iter.is_open();
|
return iter.is_open();
|
||||||
}
|
}
|
||||||
simdjson_really_inline array_iterator &array_iterator::operator++() noexcept {
|
simdjson_inline array_iterator &array_iterator::operator++() noexcept {
|
||||||
error_code error;
|
error_code error;
|
||||||
// PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
|
// PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
|
||||||
// However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
|
// However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
|
||||||
@@ -32,31 +32,31 @@ simdjson_really_inline array_iterator &array_iterator::operator++() noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::array_iterator &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::array_iterator &&value
|
||||||
) noexcept
|
) noexcept
|
||||||
: SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(value))
|
: SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>(value))
|
||||||
{
|
{
|
||||||
first.iter.assert_is_valid();
|
first.iter.assert_is_valid();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::simdjson_result(error_code error) noexcept
|
||||||
: SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>({}, error)
|
: SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>({}, error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator*() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator*() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return *first;
|
return *first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept {
|
||||||
if (!first.iter.is_valid()) { return !error(); }
|
if (!first.iter.is_valid()) { return !error(); }
|
||||||
return first == other.first;
|
return first == other.first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &other) const noexcept {
|
||||||
if (!first.iter.is_valid()) { return error(); }
|
if (!first.iter.is_valid()) { return error(); }
|
||||||
return first != other.first;
|
return first != other.first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator++() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator>::operator++() noexcept {
|
||||||
// Clear the error if there is one, so we don't yield it twice
|
// Clear the error if there is one, so we don't yield it twice
|
||||||
if (error()) { second = SUCCESS; return *this; }
|
if (error()) { second = SUCCESS; return *this; }
|
||||||
++(first);
|
++(first);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class document;
|
|||||||
class array_iterator {
|
class array_iterator {
|
||||||
public:
|
public:
|
||||||
/** Create a new, invalid array iterator. */
|
/** Create a new, invalid array iterator. */
|
||||||
simdjson_really_inline array_iterator() noexcept = default;
|
simdjson_inline array_iterator() noexcept = default;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Iterator interface
|
// Iterator interface
|
||||||
@@ -30,7 +30,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Part of the std::iterator interface.
|
* Part of the std::iterator interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
simdjson_inline simdjson_result<value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
||||||
/**
|
/**
|
||||||
* Check if we are at the end of the JSON.
|
* Check if we are at the end of the JSON.
|
||||||
*
|
*
|
||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return true if there are no more elements in the JSON array.
|
* @return true if there are no more elements in the JSON array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool operator==(const array_iterator &) const noexcept;
|
simdjson_inline bool operator==(const array_iterator &) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Check if there are more elements in the JSON array.
|
* Check if there are more elements in the JSON array.
|
||||||
*
|
*
|
||||||
@@ -46,18 +46,18 @@ public:
|
|||||||
*
|
*
|
||||||
* @return true if there are more elements in the JSON array.
|
* @return true if there are more elements in the JSON array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool operator!=(const array_iterator &) const noexcept;
|
simdjson_inline bool operator!=(const array_iterator &) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Move to the next element.
|
* Move to the next element.
|
||||||
*
|
*
|
||||||
* Part of the std::iterator interface.
|
* Part of the std::iterator interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline array_iterator &operator++() noexcept;
|
simdjson_inline array_iterator &operator++() noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
value_iterator iter{};
|
value_iterator iter{};
|
||||||
|
|
||||||
simdjson_really_inline array_iterator(const value_iterator &iter) noexcept;
|
simdjson_inline array_iterator(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
friend class array;
|
friend class array;
|
||||||
friend class value;
|
friend class value;
|
||||||
@@ -73,18 +73,18 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::array_iterator &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::array_iterator &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Iterator interface
|
// Iterator interface
|
||||||
//
|
//
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
||||||
simdjson_really_inline bool operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &) const noexcept;
|
simdjson_inline bool operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &) const noexcept;
|
||||||
simdjson_really_inline bool operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &) const noexcept;
|
simdjson_inline bool operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &) const noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &operator++() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> &operator++() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline document::document(ondemand::json_iterator &&_iter) noexcept
|
simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
|
||||||
: iter{std::forward<json_iterator>(_iter)}
|
: iter{std::forward<json_iterator>(_iter)}
|
||||||
{
|
{
|
||||||
logger::log_start_value(iter, "document");
|
logger::log_start_value(iter, "document");
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document document::start(json_iterator &&iter) noexcept {
|
simdjson_inline document document::start(json_iterator &&iter) noexcept {
|
||||||
return document(std::forward<json_iterator>(iter));
|
return document(std::forward<json_iterator>(iter));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,20 +31,20 @@ inline int32_t document::current_depth() const noexcept {
|
|||||||
inline bool document::is_alive() noexcept {
|
inline bool document::is_alive() noexcept {
|
||||||
return iter.is_alive();
|
return iter.is_alive();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value_iterator document::resume_value_iterator() noexcept {
|
simdjson_inline value_iterator document::resume_value_iterator() noexcept {
|
||||||
return value_iterator(&iter, 1, iter.root_position());
|
return value_iterator(&iter, 1, iter.root_position());
|
||||||
}
|
}
|
||||||
simdjson_really_inline value_iterator document::get_root_value_iterator() noexcept {
|
simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
|
||||||
return resume_value_iterator();
|
return resume_value_iterator();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object> document::start_or_resume_object() noexcept {
|
simdjson_inline simdjson_result<object> document::start_or_resume_object() noexcept {
|
||||||
if (iter.at_root()) {
|
if (iter.at_root()) {
|
||||||
return get_object();
|
return get_object();
|
||||||
} else {
|
} else {
|
||||||
return object::resume(resume_value_iterator());
|
return object::resume(resume_value_iterator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::get_value() noexcept {
|
simdjson_inline simdjson_result<value> document::get_value() noexcept {
|
||||||
// Make sure we start any arrays or objects before returning, so that start_root_<object/array>()
|
// Make sure we start any arrays or objects before returning, so that start_root_<object/array>()
|
||||||
// gets called.
|
// gets called.
|
||||||
iter.assert_at_document_depth();
|
iter.assert_at_document_depth();
|
||||||
@@ -59,83 +59,83 @@ simdjson_really_inline simdjson_result<value> document::get_value() noexcept {
|
|||||||
// return value(get_root_value_iterator());
|
// return value(get_root_value_iterator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array> document::get_array() & noexcept {
|
simdjson_inline simdjson_result<array> document::get_array() & noexcept {
|
||||||
auto value = get_root_value_iterator();
|
auto value = get_root_value_iterator();
|
||||||
return array::start_root(value);
|
return array::start_root(value);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object> document::get_object() & noexcept {
|
simdjson_inline simdjson_result<object> document::get_object() & noexcept {
|
||||||
auto value = get_root_value_iterator();
|
auto value = get_root_value_iterator();
|
||||||
return object::start_root(value);
|
return object::start_root(value);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> document::get_uint64() noexcept {
|
simdjson_inline simdjson_result<uint64_t> document::get_uint64() noexcept {
|
||||||
return get_root_value_iterator().get_root_uint64();
|
return get_root_value_iterator().get_root_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> document::get_uint64_in_string() noexcept {
|
simdjson_inline simdjson_result<uint64_t> document::get_uint64_in_string() noexcept {
|
||||||
return get_root_value_iterator().get_root_uint64_in_string();
|
return get_root_value_iterator().get_root_uint64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> document::get_int64() noexcept {
|
simdjson_inline simdjson_result<int64_t> document::get_int64() noexcept {
|
||||||
return get_root_value_iterator().get_root_int64();
|
return get_root_value_iterator().get_root_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> document::get_int64_in_string() noexcept {
|
simdjson_inline simdjson_result<int64_t> document::get_int64_in_string() noexcept {
|
||||||
return get_root_value_iterator().get_root_int64_in_string();
|
return get_root_value_iterator().get_root_int64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> document::get_double() noexcept {
|
simdjson_inline simdjson_result<double> document::get_double() noexcept {
|
||||||
return get_root_value_iterator().get_root_double();
|
return get_root_value_iterator().get_root_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> document::get_double_in_string() noexcept {
|
simdjson_inline simdjson_result<double> document::get_double_in_string() noexcept {
|
||||||
return get_root_value_iterator().get_root_double_in_string();
|
return get_root_value_iterator().get_root_double_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document::get_string() noexcept {
|
simdjson_inline simdjson_result<std::string_view> document::get_string() noexcept {
|
||||||
return get_root_value_iterator().get_root_string();
|
return get_root_value_iterator().get_root_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> document::get_raw_json_string() noexcept {
|
simdjson_inline simdjson_result<raw_json_string> document::get_raw_json_string() noexcept {
|
||||||
return get_root_value_iterator().get_root_raw_json_string();
|
return get_root_value_iterator().get_root_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> document::get_bool() noexcept {
|
simdjson_inline simdjson_result<bool> document::get_bool() noexcept {
|
||||||
return get_root_value_iterator().get_root_bool();
|
return get_root_value_iterator().get_root_bool();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool document::is_null() noexcept {
|
simdjson_inline bool document::is_null() noexcept {
|
||||||
return get_root_value_iterator().is_root_null();
|
return get_root_value_iterator().is_root_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> simdjson_really_inline simdjson_result<array> document::get() & noexcept { return get_array(); }
|
template<> simdjson_inline simdjson_result<array> document::get() & noexcept { return get_array(); }
|
||||||
template<> simdjson_really_inline simdjson_result<object> document::get() & noexcept { return get_object(); }
|
template<> simdjson_inline simdjson_result<object> document::get() & noexcept { return get_object(); }
|
||||||
template<> simdjson_really_inline simdjson_result<raw_json_string> document::get() & noexcept { return get_raw_json_string(); }
|
template<> simdjson_inline simdjson_result<raw_json_string> document::get() & noexcept { return get_raw_json_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<std::string_view> document::get() & noexcept { return get_string(); }
|
template<> simdjson_inline simdjson_result<std::string_view> document::get() & noexcept { return get_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<double> document::get() & noexcept { return get_double(); }
|
template<> simdjson_inline simdjson_result<double> document::get() & noexcept { return get_double(); }
|
||||||
template<> simdjson_really_inline simdjson_result<uint64_t> document::get() & noexcept { return get_uint64(); }
|
template<> simdjson_inline simdjson_result<uint64_t> document::get() & noexcept { return get_uint64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<int64_t> document::get() & noexcept { return get_int64(); }
|
template<> simdjson_inline simdjson_result<int64_t> document::get() & noexcept { return get_int64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<bool> document::get() & noexcept { return get_bool(); }
|
template<> simdjson_inline simdjson_result<bool> document::get() & noexcept { return get_bool(); }
|
||||||
template<> simdjson_really_inline simdjson_result<value> document::get() & noexcept { return get_value(); }
|
template<> simdjson_inline simdjson_result<value> document::get() & noexcept { return get_value(); }
|
||||||
|
|
||||||
template<> simdjson_really_inline simdjson_result<raw_json_string> document::get() && noexcept { return get_raw_json_string(); }
|
template<> simdjson_inline simdjson_result<raw_json_string> document::get() && noexcept { return get_raw_json_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<std::string_view> document::get() && noexcept { return get_string(); }
|
template<> simdjson_inline simdjson_result<std::string_view> document::get() && noexcept { return get_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<double> document::get() && noexcept { return std::forward<document>(*this).get_double(); }
|
template<> simdjson_inline simdjson_result<double> document::get() && noexcept { return std::forward<document>(*this).get_double(); }
|
||||||
template<> simdjson_really_inline simdjson_result<uint64_t> document::get() && noexcept { return std::forward<document>(*this).get_uint64(); }
|
template<> simdjson_inline simdjson_result<uint64_t> document::get() && noexcept { return std::forward<document>(*this).get_uint64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<int64_t> document::get() && noexcept { return std::forward<document>(*this).get_int64(); }
|
template<> simdjson_inline simdjson_result<int64_t> document::get() && noexcept { return std::forward<document>(*this).get_int64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<bool> document::get() && noexcept { return std::forward<document>(*this).get_bool(); }
|
template<> simdjson_inline simdjson_result<bool> document::get() && noexcept { return std::forward<document>(*this).get_bool(); }
|
||||||
template<> simdjson_really_inline simdjson_result<value> document::get() && noexcept { return get_value(); }
|
template<> simdjson_inline simdjson_result<value> document::get() && noexcept { return get_value(); }
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline error_code document::get(T &out) & noexcept {
|
template<typename T> simdjson_inline error_code document::get(T &out) & noexcept {
|
||||||
return get<T>().get(out);
|
return get<T>().get(out);
|
||||||
}
|
}
|
||||||
template<typename T> simdjson_really_inline error_code document::get(T &out) && noexcept {
|
template<typename T> simdjson_inline error_code document::get(T &out) && noexcept {
|
||||||
return std::forward<document>(*this).get<T>().get(out);
|
return std::forward<document>(*this).get<T>().get(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline document::operator array() & noexcept(false) { return get_array(); }
|
simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
|
||||||
simdjson_really_inline document::operator object() & noexcept(false) { return get_object(); }
|
simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
|
||||||
simdjson_really_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
|
simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
|
||||||
simdjson_really_inline document::operator int64_t() noexcept(false) { return get_int64(); }
|
simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
|
||||||
simdjson_really_inline document::operator double() noexcept(false) { return get_double(); }
|
simdjson_inline document::operator double() noexcept(false) { return get_double(); }
|
||||||
simdjson_really_inline document::operator std::string_view() noexcept(false) { return get_string(); }
|
simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(); }
|
||||||
simdjson_really_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
|
simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
|
||||||
simdjson_really_inline document::operator bool() noexcept(false) { return get_bool(); }
|
simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
|
||||||
simdjson_really_inline document::operator value() noexcept(false) { return get_value(); }
|
simdjson_inline document::operator value() noexcept(false) { return get_value(); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> document::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> document::count_elements() & noexcept {
|
||||||
auto a = get_array();
|
auto a = get_array();
|
||||||
simdjson_result<size_t> answer = a.count_elements();
|
simdjson_result<size_t> answer = a.count_elements();
|
||||||
/* If there was an array, we are now left pointing at its first element. */
|
/* If there was an array, we are now left pointing at its first element. */
|
||||||
@@ -145,7 +145,7 @@ simdjson_really_inline simdjson_result<size_t> document::count_elements() & noex
|
|||||||
}
|
}
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> document::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> document::count_fields() & noexcept {
|
||||||
auto a = get_object();
|
auto a = get_object();
|
||||||
simdjson_result<size_t> answer = a.count_fields();
|
simdjson_result<size_t> answer = a.count_fields();
|
||||||
/* If there was an array, we are now left pointing at its first element. */
|
/* If there was an array, we are now left pointing at its first element. */
|
||||||
@@ -155,43 +155,43 @@ simdjson_really_inline simdjson_result<size_t> document::count_fields() & noexce
|
|||||||
}
|
}
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::at(size_t index) & noexcept {
|
simdjson_inline simdjson_result<value> document::at(size_t index) & noexcept {
|
||||||
auto a = get_array();
|
auto a = get_array();
|
||||||
return a.at(index);
|
return a.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array_iterator> document::begin() & noexcept {
|
simdjson_inline simdjson_result<array_iterator> document::begin() & noexcept {
|
||||||
return get_array().begin();
|
return get_array().begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array_iterator> document::end() & noexcept {
|
simdjson_inline simdjson_result<array_iterator> document::end() & noexcept {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> document::find_field(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> document::find_field(std::string_view key) & noexcept {
|
||||||
return start_or_resume_object().find_field(key);
|
return start_or_resume_object().find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::find_field(const char *key) & noexcept {
|
simdjson_inline simdjson_result<value> document::find_field(const char *key) & noexcept {
|
||||||
return start_or_resume_object().find_field(key);
|
return start_or_resume_object().find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::find_field_unordered(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> document::find_field_unordered(std::string_view key) & noexcept {
|
||||||
return start_or_resume_object().find_field_unordered(key);
|
return start_or_resume_object().find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::find_field_unordered(const char *key) & noexcept {
|
simdjson_inline simdjson_result<value> document::find_field_unordered(const char *key) & noexcept {
|
||||||
return start_or_resume_object().find_field_unordered(key);
|
return start_or_resume_object().find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::operator[](std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> document::operator[](std::string_view key) & noexcept {
|
||||||
return start_or_resume_object()[key];
|
return start_or_resume_object()[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> document::operator[](const char *key) & noexcept {
|
simdjson_inline simdjson_result<value> document::operator[](const char *key) & noexcept {
|
||||||
return start_or_resume_object()[key];
|
return start_or_resume_object()[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline error_code document::consume() noexcept {
|
simdjson_inline error_code document::consume() noexcept {
|
||||||
auto error = iter.skip_child(0);
|
auto error = iter.skip_child(0);
|
||||||
if(error) { iter.abandon(); }
|
if(error) { iter.abandon(); }
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document::raw_json() noexcept {
|
simdjson_inline simdjson_result<std::string_view> document::raw_json() noexcept {
|
||||||
auto _iter = get_root_value_iterator();
|
auto _iter = get_root_value_iterator();
|
||||||
const uint8_t * starting_point{_iter.peek_start()};
|
const uint8_t * starting_point{_iter.peek_start()};
|
||||||
auto error = consume();
|
auto error = consume();
|
||||||
@@ -203,40 +203,40 @@ simdjson_really_inline simdjson_result<std::string_view> document::raw_json() no
|
|||||||
return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point));
|
return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<json_type> document::type() noexcept {
|
simdjson_inline simdjson_result<json_type> document::type() noexcept {
|
||||||
return get_root_value_iterator().type();
|
return get_root_value_iterator().type();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> document::is_scalar() noexcept {
|
simdjson_inline simdjson_result<bool> document::is_scalar() noexcept {
|
||||||
json_type this_type;
|
json_type this_type;
|
||||||
auto error = type().get(this_type);
|
auto error = type().get(this_type);
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
return ! ((this_type == json_type::array) || (this_type == json_type::object));
|
return ! ((this_type == json_type::array) || (this_type == json_type::object));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool document::is_negative() noexcept {
|
simdjson_inline bool document::is_negative() noexcept {
|
||||||
return get_root_value_iterator().is_root_negative();
|
return get_root_value_iterator().is_root_negative();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> document::is_integer() noexcept {
|
simdjson_inline simdjson_result<bool> document::is_integer() noexcept {
|
||||||
return get_root_value_iterator().is_root_integer();
|
return get_root_value_iterator().is_root_integer();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<number_type> document::get_number_type() noexcept {
|
simdjson_inline simdjson_result<number_type> document::get_number_type() noexcept {
|
||||||
return get_root_value_iterator().get_root_number_type();
|
return get_root_value_iterator().get_root_number_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<number> document::get_number() noexcept {
|
simdjson_inline simdjson_result<number> document::get_number() noexcept {
|
||||||
return get_root_value_iterator().get_root_number();
|
return get_root_value_iterator().get_root_number();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document::raw_json_token() noexcept {
|
simdjson_inline simdjson_result<std::string_view> document::raw_json_token() noexcept {
|
||||||
auto _iter = get_root_value_iterator();
|
auto _iter = get_root_value_iterator();
|
||||||
return std::string_view(reinterpret_cast<const char*>(_iter.peek_start()), _iter.peek_start_length());
|
return std::string_view(reinterpret_cast<const char*>(_iter.peek_start()), _iter.peek_start_length());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> document::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<value> document::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
rewind(); // Rewind the document each time at_pointer is called
|
rewind(); // Rewind the document each time at_pointer is called
|
||||||
if (json_pointer.empty()) {
|
if (json_pointer.empty()) {
|
||||||
return this->get_value();
|
return this->get_value();
|
||||||
@@ -260,7 +260,7 @@ simdjson_really_inline simdjson_result<value> document::at_pointer(std::string_v
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::document &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::document &&value
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>(
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>(
|
||||||
@@ -268,7 +268,7 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::docume
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::simdjson_result(
|
||||||
error_code error
|
error_code error
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>(
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>(
|
||||||
@@ -276,216 +276,216 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::docume
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::count_elements() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_elements();
|
return first.count_elements();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::count_fields() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_fields();
|
return first.count_fields();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::at(size_t index) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::at(size_t index) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at(index);
|
return first.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::rewind() noexcept {
|
simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::rewind() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
first.rewind();
|
first.rewind();
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::begin() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::begin() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::end() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::end() & noexcept {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field_unordered(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field_unordered(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field_unordered(const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field_unordered(const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator[](std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator[](std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator[](const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator[](const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field(const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::find_field(const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_array() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_array() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_array();
|
return first.get_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_object() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_object() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_object();
|
return first.get_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_uint64() noexcept {
|
simdjson_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_uint64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_uint64();
|
return first.get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_int64() noexcept {
|
simdjson_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_int64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_int64();
|
return first.get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_double() noexcept {
|
simdjson_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_double() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_double();
|
return first.get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_string() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_string();
|
return first.get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_raw_json_string() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_raw_json_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_raw_json_string();
|
return first.get_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_bool() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_bool() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_bool();
|
return first.get_bool();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_value() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_value() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_value();
|
return first.get_value();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_null() noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_null() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_null();
|
return first.is_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get() & noexcept {
|
simdjson_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>();
|
return first.get<T>();
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get() && noexcept {
|
simdjson_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get() && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first).get<T>();
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first).get<T>();
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get(T &out) & noexcept {
|
simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get(T &out) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>(out);
|
return first.get<T>(out);
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get(T &out) && noexcept {
|
simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get(T &out) && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first).get<T>(out);
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first).get<T>(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>() & noexcept = delete;
|
template<> simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>() & noexcept = delete;
|
||||||
template<> simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>() && noexcept {
|
template<> simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>() && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first);
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first);
|
||||||
}
|
}
|
||||||
template<> simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>(SIMDJSON_IMPLEMENTATION::ondemand::document &out) & noexcept = delete;
|
template<> simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>(SIMDJSON_IMPLEMENTATION::ondemand::document &out) & noexcept = delete;
|
||||||
template<> simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>(SIMDJSON_IMPLEMENTATION::ondemand::document &out) && noexcept {
|
template<> simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>(SIMDJSON_IMPLEMENTATION::ondemand::document &out) && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
out = std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first);
|
out = std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document>(first);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.type();
|
return first.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_scalar() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_scalar() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_scalar();
|
return first.is_scalar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_negative() noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_negative() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_negative();
|
return first.is_negative();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_integer() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::is_integer() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_integer();
|
return first.is_integer();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_number_type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_number_type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number_type();
|
return first.get_number_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_number() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get_number() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number();
|
return first.get_number();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator uint64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator uint64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator int64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator int64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator double() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator double() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator std::string_view() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator std::string_view() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator bool() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator bool() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::current_location() noexcept {
|
simdjson_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::current_location() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.current_location();
|
return first.current_location();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline int32_t simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::current_depth() const noexcept {
|
simdjson_inline int32_t simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::current_depth() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.current_depth();
|
return first.current_depth();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::raw_json_token() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::raw_json_token() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.raw_json_token();
|
return first.raw_json_token();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
@@ -498,54 +498,54 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline document_reference::document_reference() noexcept : doc{nullptr} {}
|
simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
|
||||||
simdjson_really_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
|
simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
|
||||||
simdjson_really_inline void document_reference::rewind() noexcept { doc->rewind(); }
|
simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
|
||||||
simdjson_really_inline simdjson_result<array> document_reference::get_array() & noexcept { return doc->get_array(); }
|
simdjson_inline simdjson_result<array> document_reference::get_array() & noexcept { return doc->get_array(); }
|
||||||
simdjson_really_inline simdjson_result<object> document_reference::get_object() & noexcept { return doc->get_object(); }
|
simdjson_inline simdjson_result<object> document_reference::get_object() & noexcept { return doc->get_object(); }
|
||||||
simdjson_really_inline simdjson_result<uint64_t> document_reference::get_uint64() noexcept { return doc->get_uint64(); }
|
simdjson_inline simdjson_result<uint64_t> document_reference::get_uint64() noexcept { return doc->get_uint64(); }
|
||||||
simdjson_really_inline simdjson_result<int64_t> document_reference::get_int64() noexcept { return doc->get_int64(); }
|
simdjson_inline simdjson_result<int64_t> document_reference::get_int64() noexcept { return doc->get_int64(); }
|
||||||
simdjson_really_inline simdjson_result<double> document_reference::get_double() noexcept { return doc->get_double(); }
|
simdjson_inline simdjson_result<double> document_reference::get_double() noexcept { return doc->get_double(); }
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document_reference::get_string() noexcept { return doc->get_string(); }
|
simdjson_inline simdjson_result<std::string_view> document_reference::get_string() noexcept { return doc->get_string(); }
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> document_reference::get_raw_json_string() noexcept { return doc->get_raw_json_string(); }
|
simdjson_inline simdjson_result<raw_json_string> document_reference::get_raw_json_string() noexcept { return doc->get_raw_json_string(); }
|
||||||
simdjson_really_inline simdjson_result<bool> document_reference::get_bool() noexcept { return doc->get_bool(); }
|
simdjson_inline simdjson_result<bool> document_reference::get_bool() noexcept { return doc->get_bool(); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::get_value() noexcept { return doc->get_value(); }
|
simdjson_inline simdjson_result<value> document_reference::get_value() noexcept { return doc->get_value(); }
|
||||||
simdjson_really_inline bool document_reference::is_null() noexcept { return doc->is_null(); }
|
simdjson_inline bool document_reference::is_null() noexcept { return doc->is_null(); }
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
|
simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
|
||||||
simdjson_really_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
|
simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
|
||||||
simdjson_really_inline document_reference::operator uint64_t() noexcept(false) { return uint64_t(*doc); }
|
simdjson_inline document_reference::operator uint64_t() noexcept(false) { return uint64_t(*doc); }
|
||||||
simdjson_really_inline document_reference::operator int64_t() noexcept(false) { return int64_t(*doc); }
|
simdjson_inline document_reference::operator int64_t() noexcept(false) { return int64_t(*doc); }
|
||||||
simdjson_really_inline document_reference::operator double() noexcept(false) { return double(*doc); }
|
simdjson_inline document_reference::operator double() noexcept(false) { return double(*doc); }
|
||||||
simdjson_really_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
|
simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
|
||||||
simdjson_really_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
|
simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
|
||||||
simdjson_really_inline document_reference::operator bool() noexcept(false) { return bool(*doc); }
|
simdjson_inline document_reference::operator bool() noexcept(false) { return bool(*doc); }
|
||||||
simdjson_really_inline document_reference::operator value() noexcept(false) { return value(*doc); }
|
simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> document_reference::count_elements() & noexcept { return doc->count_elements(); }
|
simdjson_inline simdjson_result<size_t> document_reference::count_elements() & noexcept { return doc->count_elements(); }
|
||||||
simdjson_really_inline simdjson_result<size_t> document_reference::count_fields() & noexcept { return doc->count_fields(); }
|
simdjson_inline simdjson_result<size_t> document_reference::count_fields() & noexcept { return doc->count_fields(); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::at(size_t index) & noexcept { return doc->at(index); }
|
simdjson_inline simdjson_result<value> document_reference::at(size_t index) & noexcept { return doc->at(index); }
|
||||||
simdjson_really_inline simdjson_result<array_iterator> document_reference::begin() & noexcept { return doc->begin(); }
|
simdjson_inline simdjson_result<array_iterator> document_reference::begin() & noexcept { return doc->begin(); }
|
||||||
simdjson_really_inline simdjson_result<array_iterator> document_reference::end() & noexcept { return doc->end(); }
|
simdjson_inline simdjson_result<array_iterator> document_reference::end() & noexcept { return doc->end(); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
|
simdjson_inline simdjson_result<value> document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
|
simdjson_inline simdjson_result<value> document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
|
simdjson_inline simdjson_result<value> document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
|
simdjson_inline simdjson_result<value> document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
|
simdjson_inline simdjson_result<value> document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
|
simdjson_inline simdjson_result<value> document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
|
||||||
simdjson_really_inline simdjson_result<json_type> document_reference::type() noexcept { return doc->type(); }
|
simdjson_inline simdjson_result<json_type> document_reference::type() noexcept { return doc->type(); }
|
||||||
simdjson_really_inline simdjson_result<bool> document_reference::is_scalar() noexcept { return doc->is_scalar(); }
|
simdjson_inline simdjson_result<bool> document_reference::is_scalar() noexcept { return doc->is_scalar(); }
|
||||||
simdjson_really_inline simdjson_result<const char *> document_reference::current_location() noexcept { return doc->current_location(); }
|
simdjson_inline simdjson_result<const char *> document_reference::current_location() noexcept { return doc->current_location(); }
|
||||||
simdjson_really_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
|
simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
|
||||||
simdjson_really_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
|
simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
|
||||||
simdjson_really_inline simdjson_result<bool> document_reference::is_integer() noexcept { return doc->is_integer(); }
|
simdjson_inline simdjson_result<bool> document_reference::is_integer() noexcept { return doc->is_integer(); }
|
||||||
simdjson_really_inline simdjson_result<number_type> document_reference::get_number_type() noexcept { return doc->get_number_type(); }
|
simdjson_inline simdjson_result<number_type> document_reference::get_number_type() noexcept { return doc->get_number_type(); }
|
||||||
simdjson_really_inline simdjson_result<number> document_reference::get_number() noexcept { return doc->get_number(); }
|
simdjson_inline simdjson_result<number> document_reference::get_number() noexcept { return doc->get_number(); }
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
|
simdjson_inline simdjson_result<std::string_view> document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
|
||||||
simdjson_really_inline simdjson_result<value> document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
|
simdjson_inline simdjson_result<value> document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
|
||||||
simdjson_really_inline simdjson_result<std::string_view> document_reference::raw_json() noexcept { return doc->raw_json();}
|
simdjson_inline simdjson_result<std::string_view> document_reference::raw_json() noexcept { return doc->raw_json();}
|
||||||
simdjson_really_inline document_reference::operator document&() const noexcept { return *doc; }
|
simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
|
||||||
|
|
||||||
} // namespace ondemand
|
} // namespace ondemand
|
||||||
} // namespace SIMDJSON_IMPLEMENTATION
|
} // namespace SIMDJSON_IMPLEMENTATION
|
||||||
@@ -554,172 +554,172 @@ simdjson_really_inline document_reference::operator document&() const noexcept {
|
|||||||
|
|
||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_reference value, error_code error)
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_reference value, error_code error)
|
||||||
noexcept : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>(value), error) {}
|
noexcept : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>(value), error) {}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::count_elements() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_elements();
|
return first.count_elements();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::count_fields() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_fields();
|
return first.count_fields();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::at(size_t index) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::at(size_t index) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at(index);
|
return first.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::rewind() noexcept {
|
simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::rewind() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
first.rewind();
|
first.rewind();
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::begin() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::begin() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::end() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::end() & noexcept {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field_unordered(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field_unordered(const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator[](std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator[](std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator[](const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator[](const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field(const char *key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::find_field(const char *key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_array() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_array() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_array();
|
return first.get_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_object() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_object() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_object();
|
return first.get_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_uint64() noexcept {
|
simdjson_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_uint64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_uint64();
|
return first.get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_int64() noexcept {
|
simdjson_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_int64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_int64();
|
return first.get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_double() noexcept {
|
simdjson_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_double() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_double();
|
return first.get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_string() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_string();
|
return first.get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_raw_json_string() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_raw_json_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_raw_json_string();
|
return first.get_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_bool() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_bool() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_bool();
|
return first.get_bool();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_value() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_value() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_value();
|
return first.get_value();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_null() noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_null() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_null();
|
return first.is_null();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.type();
|
return first.type();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_scalar() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_scalar() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_scalar();
|
return first.is_scalar();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_negative() noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_negative() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_negative();
|
return first.is_negative();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_integer() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::is_integer() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_integer();
|
return first.is_integer();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_number_type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_number_type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number_type();
|
return first.get_number_type();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_number() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::get_number() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number();
|
return first.get_number();
|
||||||
}
|
}
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator uint64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator uint64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator int64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator int64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator double() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator double() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator std::string_view() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator std::string_view() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator bool() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator bool() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::current_location() noexcept {
|
simdjson_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::current_location() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.current_location();
|
return first.current_location();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::raw_json_token() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::raw_json_token() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.raw_json_token();
|
return first.raw_json_token();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference>::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline document() noexcept = default;
|
simdjson_inline document() noexcept = default;
|
||||||
simdjson_really_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
|
simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
|
||||||
simdjson_really_inline document(document &&other) noexcept = default;
|
simdjson_inline document(document &&other) noexcept = default;
|
||||||
simdjson_really_inline document &operator=(const document &other) noexcept = delete;
|
simdjson_inline document &operator=(const document &other) noexcept = delete;
|
||||||
simdjson_really_inline document &operator=(document &&other) noexcept = default;
|
simdjson_inline document &operator=(document &&other) noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an array.
|
* Cast this JSON value to an array.
|
||||||
@@ -38,49 +38,49 @@ public:
|
|||||||
* @returns An object that can be used to iterate the array.
|
* @returns An object that can be used to iterate the array.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array> get_array() & noexcept;
|
simdjson_inline simdjson_result<array> get_array() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an object.
|
* Cast this JSON value to an object.
|
||||||
*
|
*
|
||||||
* @returns An object that can be used to look up or iterate fields.
|
* @returns An object that can be used to look up or iterate fields.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<object> get_object() & noexcept;
|
simdjson_inline simdjson_result<object> get_object() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an unsigned integer.
|
* Cast this JSON value to an unsigned integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to an unsigned integer.
|
* Cast this JSON value (inside string) to an unsigned integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a signed integer.
|
* Cast this JSON value to a signed integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to a signed integer.
|
* Cast this JSON value (inside string) to a signed integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a double.
|
* Cast this JSON value to a double.
|
||||||
*
|
*
|
||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to a double.
|
* Cast this JSON value (inside string) to a double.
|
||||||
@@ -88,7 +88,7 @@ public:
|
|||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<double> get_double_in_string() noexcept;
|
simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a string.
|
* Cast this JSON value to a string.
|
||||||
*
|
*
|
||||||
@@ -100,7 +100,7 @@ public:
|
|||||||
* time it parses a document or when it is destroyed.
|
* time it parses a document or when it is destroyed.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a raw_json_string.
|
* Cast this JSON value to a raw_json_string.
|
||||||
*
|
*
|
||||||
@@ -109,28 +109,28 @@ public:
|
|||||||
* @returns A pointer to the raw JSON for the given string.
|
* @returns A pointer to the raw JSON for the given string.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a bool.
|
* Cast this JSON value to a bool.
|
||||||
*
|
*
|
||||||
* @returns A bool value.
|
* @returns A bool value.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not true or false.
|
* @returns INCORRECT_TYPE if the JSON value is not true or false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a value when the document is an object or an array.
|
* Cast this JSON value to a value when the document is an object or an array.
|
||||||
*
|
*
|
||||||
* @returns A value if a JSON array or object cannot be found.
|
* @returns A value if a JSON array or object cannot be found.
|
||||||
* @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
|
* @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> get_value() noexcept;
|
simdjson_inline simdjson_result<value> get_value() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this JSON value is null.
|
* Checks if this JSON value is null.
|
||||||
*
|
*
|
||||||
* @returns Whether the value is null.
|
* @returns Whether the value is null.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get this value as the given type.
|
* Get this value as the given type.
|
||||||
@@ -143,13 +143,13 @@ public:
|
|||||||
* @returns A value of the given type, parsed from the JSON.
|
* @returns A value of the given type, parsed from the JSON.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not the given type.
|
* @returns INCORRECT_TYPE If the JSON value is not the given type.
|
||||||
*/
|
*/
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() & noexcept {
|
template<typename T> simdjson_inline simdjson_result<T> get() & noexcept {
|
||||||
// Unless the simdjson library provides an inline implementation, calling this method should
|
// Unless the simdjson library provides an inline implementation, calling this method should
|
||||||
// immediately fail.
|
// immediately fail.
|
||||||
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
||||||
}
|
}
|
||||||
/** @overload template<typename T> simdjson_result<T> get() & noexcept */
|
/** @overload template<typename T> simdjson_result<T> get() & noexcept */
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() && noexcept {
|
template<typename T> simdjson_inline simdjson_result<T> get() && noexcept {
|
||||||
// Unless the simdjson library provides an inline implementation, calling this method should
|
// Unless the simdjson library provides an inline implementation, calling this method should
|
||||||
// immediately fail.
|
// immediately fail.
|
||||||
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
||||||
@@ -166,9 +166,9 @@ public:
|
|||||||
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
||||||
* @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
|
* @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
|
||||||
*/
|
*/
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) & noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) & noexcept;
|
||||||
/** @overload template<typename T> error_code get(T &out) & noexcept */
|
/** @overload template<typename T> error_code get(T &out) & noexcept */
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) && noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) && noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
/**
|
/**
|
||||||
@@ -177,35 +177,35 @@ public:
|
|||||||
* @returns An object that can be used to iterate the array.
|
* @returns An object that can be used to iterate the array.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator array() & noexcept(false);
|
simdjson_inline operator array() & noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an object.
|
* Cast this JSON value to an object.
|
||||||
*
|
*
|
||||||
* @returns An object that can be used to look up or iterate fields.
|
* @returns An object that can be used to look up or iterate fields.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator object() & noexcept(false);
|
simdjson_inline operator object() & noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an unsigned integer.
|
* Cast this JSON value to an unsigned integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a signed integer.
|
* Cast this JSON value to a signed integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a double.
|
* Cast this JSON value to a double.
|
||||||
*
|
*
|
||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a string.
|
* Cast this JSON value to a string.
|
||||||
*
|
*
|
||||||
@@ -215,7 +215,7 @@ public:
|
|||||||
* time it parses a document or when it is destroyed.
|
* time it parses a document or when it is destroyed.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a raw_json_string.
|
* Cast this JSON value to a raw_json_string.
|
||||||
*
|
*
|
||||||
@@ -224,21 +224,21 @@ public:
|
|||||||
* @returns A pointer to the raw JSON for the given string.
|
* @returns A pointer to the raw JSON for the given string.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator raw_json_string() noexcept(false);
|
simdjson_inline operator raw_json_string() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a bool.
|
* Cast this JSON value to a bool.
|
||||||
*
|
*
|
||||||
* @returns A bool value.
|
* @returns A bool value.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a value.
|
* Cast this JSON value to a value.
|
||||||
*
|
*
|
||||||
* @returns A value value.
|
* @returns A value value.
|
||||||
* @exception if a JSON value cannot be found
|
* @exception if a JSON value cannot be found
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator value() noexcept(false);
|
simdjson_inline operator value() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* This method scans the array and counts the number of elements.
|
* This method scans the array and counts the number of elements.
|
||||||
@@ -251,7 +251,7 @@ public:
|
|||||||
* there is a missing comma), then an error is returned and it is no longer
|
* there is a missing comma), then an error is returned and it is no longer
|
||||||
* safe to continue.
|
* safe to continue.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
/**
|
/**
|
||||||
* This method scans the object and counts the number of key-value pairs.
|
* This method scans the object and counts the number of key-value pairs.
|
||||||
* The count_fields method should always be called before you have begun
|
* The count_fields method should always be called before you have begun
|
||||||
@@ -266,7 +266,7 @@ public:
|
|||||||
* To check that an object is empty, it is more performant to use
|
* To check that an object is empty, it is more performant to use
|
||||||
* the is_empty() method.
|
* the is_empty() method.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the value at the given index in the array. This function has linear-time complexity.
|
* Get the value at the given index in the array. This function has linear-time complexity.
|
||||||
* This function should only be called once on an array instance since the array iterator is not reset between each call.
|
* This function should only be called once on an array instance since the array iterator is not reset between each call.
|
||||||
@@ -274,19 +274,19 @@ public:
|
|||||||
* @return The value at the given index, or:
|
* @return The value at the given index, or:
|
||||||
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> at(size_t index) & noexcept;
|
simdjson_inline simdjson_result<value> at(size_t index) & noexcept;
|
||||||
/**
|
/**
|
||||||
* Begin array iteration.
|
* Begin array iteration.
|
||||||
*
|
*
|
||||||
* Part of the std::iterable interface.
|
* Part of the std::iterable interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> begin() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Sentinel representing the end of the array.
|
* Sentinel representing the end of the array.
|
||||||
*
|
*
|
||||||
* Part of the std::iterable interface.
|
* Part of the std::iterable interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> end() & noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object (order-sensitive).
|
* Look up a field by name on an object (order-sensitive).
|
||||||
@@ -320,9 +320,9 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field(const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field(const char *key) & noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object, without regard to key order.
|
* Look up a field by name on an object, without regard to key order.
|
||||||
@@ -354,13 +354,13 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> operator[](const char *key) & noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of this JSON value.
|
* Get the type of this JSON value.
|
||||||
@@ -371,7 +371,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<json_type> type() noexcept;
|
simdjson_inline simdjson_result<json_type> type() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the document is a scalar (string, number, null, Boolean).
|
* Checks whether the document is a scalar (string, number, null, Boolean).
|
||||||
@@ -380,14 +380,14 @@ public:
|
|||||||
* @returns true if the type is string, number, null, Boolean
|
* @returns true if the type is string, number, null, Boolean
|
||||||
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the document is a negative number.
|
* Checks whether the document is a negative number.
|
||||||
*
|
*
|
||||||
* @returns true if the number if negative.
|
* @returns true if the number if negative.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_negative() noexcept;
|
simdjson_inline bool is_negative() noexcept;
|
||||||
/**
|
/**
|
||||||
* Checks whether the document is an integer number. Note that
|
* Checks whether the document is an integer number. Note that
|
||||||
* this requires to partially parse the number string. If
|
* this requires to partially parse the number string. If
|
||||||
@@ -397,7 +397,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns true if the number if negative.
|
* @returns true if the number if negative.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
/**
|
/**
|
||||||
* Determine the number type (integer or floating-point number) as quickly
|
* Determine the number type (integer or floating-point number) as quickly
|
||||||
* as possible. This function does not fully validate the input. It is
|
* as possible. This function does not fully validate the input. It is
|
||||||
@@ -420,7 +420,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns the type of the number
|
* @returns the type of the number
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to parse an ondemand::number. An ondemand::number may
|
* Attempt to parse an ondemand::number. An ondemand::number may
|
||||||
@@ -448,7 +448,7 @@ public:
|
|||||||
* to call "get_int64()" when number.get_number_type() is not
|
* to call "get_int64()" when number.get_number_type() is not
|
||||||
* number_type::signed_integer and when number.is_int64() is false.
|
* number_type::signed_integer and when number.is_int64() is false.
|
||||||
*/
|
*/
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<number> get_number() noexcept;
|
simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the raw JSON for this token.
|
* Get the raw JSON for this token.
|
||||||
@@ -472,7 +472,7 @@ public:
|
|||||||
* - false
|
* - false
|
||||||
* - null
|
* - null
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the iterator inside the document instance so we are pointing back at the
|
* Reset the iterator inside the document instance so we are pointing back at the
|
||||||
@@ -504,7 +504,7 @@ public:
|
|||||||
* 2 = , or } inside root array/object
|
* 2 = , or } inside root array/object
|
||||||
* 3 = key or value inside root array/object.
|
* 3 = key or value inside root array/object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
||||||
@@ -537,26 +537,26 @@ public:
|
|||||||
* - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
|
* - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
|
||||||
* - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
|
* - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
/**
|
/**
|
||||||
* Consumes the document and returns a string_view instance corresponding to the
|
* Consumes the document and returns a string_view instance corresponding to the
|
||||||
* document as represented in JSON. It points inside the original byte array containing
|
* document as represented in JSON. It points inside the original byte array containing
|
||||||
* the JSON document.
|
* the JSON document.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Consumes the document.
|
* Consumes the document.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code consume() noexcept;
|
simdjson_inline error_code consume() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline document(ondemand::json_iterator &&iter) noexcept;
|
simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
|
||||||
simdjson_really_inline const uint8_t *text(uint32_t idx) const noexcept;
|
simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
|
||||||
|
|
||||||
simdjson_really_inline value_iterator resume_value_iterator() noexcept;
|
simdjson_inline value_iterator resume_value_iterator() noexcept;
|
||||||
simdjson_really_inline value_iterator get_root_value_iterator() noexcept;
|
simdjson_inline value_iterator get_root_value_iterator() noexcept;
|
||||||
simdjson_really_inline simdjson_result<object> start_or_resume_object() noexcept;
|
simdjson_inline simdjson_result<object> start_or_resume_object() noexcept;
|
||||||
static simdjson_really_inline document start(ondemand::json_iterator &&iter) noexcept;
|
static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fields
|
// Fields
|
||||||
@@ -580,59 +580,59 @@ protected:
|
|||||||
*/
|
*/
|
||||||
class document_reference {
|
class document_reference {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline document_reference() noexcept;
|
simdjson_inline document_reference() noexcept;
|
||||||
simdjson_really_inline document_reference(document &d) noexcept;
|
simdjson_inline document_reference(document &d) noexcept;
|
||||||
simdjson_really_inline document_reference(const document_reference &other) noexcept = default;
|
simdjson_inline document_reference(const document_reference &other) noexcept = default;
|
||||||
simdjson_really_inline document_reference& operator=(const document_reference &other) noexcept = default;
|
simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
|
||||||
simdjson_really_inline void rewind() noexcept;
|
simdjson_inline void rewind() noexcept;
|
||||||
simdjson_really_inline simdjson_result<array> get_array() & noexcept;
|
simdjson_inline simdjson_result<array> get_array() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<object> get_object() & noexcept;
|
simdjson_inline simdjson_result<object> get_object() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> get_value() noexcept;
|
simdjson_inline simdjson_result<value> get_value() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
|
||||||
simdjson_really_inline operator document&() const noexcept;
|
simdjson_inline operator document&() const noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline operator array() & noexcept(false);
|
simdjson_inline operator array() & noexcept(false);
|
||||||
simdjson_really_inline operator object() & noexcept(false);
|
simdjson_inline operator object() & noexcept(false);
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
simdjson_really_inline operator raw_json_string() noexcept(false);
|
simdjson_inline operator raw_json_string() noexcept(false);
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
simdjson_really_inline operator value() noexcept(false);
|
simdjson_inline operator value() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> at(size_t index) & noexcept;
|
simdjson_inline simdjson_result<value> at(size_t index) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> begin() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> end() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> find_field(const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field(const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> operator[](const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> operator[](const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(const char *key) & noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<json_type> type() noexcept;
|
simdjson_inline simdjson_result<json_type> type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> current_location() noexcept;
|
simdjson_inline simdjson_result<const char *> current_location() noexcept;
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
simdjson_really_inline bool is_negative() noexcept;
|
simdjson_inline bool is_negative() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
simdjson_really_inline simdjson_result<number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<number> get_number() noexcept;
|
simdjson_inline simdjson_result<number> get_number() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
||||||
simdjson_really_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
private:
|
private:
|
||||||
document *doc{nullptr};
|
document *doc{nullptr};
|
||||||
};
|
};
|
||||||
@@ -645,63 +645,63 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
simdjson_really_inline error_code rewind() noexcept;
|
simdjson_inline error_code rewind() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double_from_string() noexcept;
|
simdjson_inline simdjson_result<double> get_double_from_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> get_value() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> get_value() noexcept;
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() & noexcept;
|
template<typename T> simdjson_inline simdjson_result<T> get() & noexcept;
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() && noexcept;
|
template<typename T> simdjson_inline simdjson_result<T> get() && noexcept;
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) & noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) & noexcept;
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) && noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) && noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false);
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
simdjson_really_inline simdjson_result<const char *> current_location() noexcept;
|
simdjson_inline simdjson_result<const char *> current_location() noexcept;
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
simdjson_really_inline bool is_negative() noexcept;
|
simdjson_inline bool is_negative() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
||||||
/** @copydoc simdjson_really_inline std::string_view document::raw_json_token() const noexcept */
|
/** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -714,56 +714,56 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_reference> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_reference> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_reference value, error_code error) noexcept;
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_reference value, error_code error) noexcept;
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
simdjson_really_inline error_code rewind() noexcept;
|
simdjson_inline error_code rewind() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> get_value() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> get_value() noexcept;
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() & noexcept(false);
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
simdjson_really_inline simdjson_result<const char *> current_location() noexcept;
|
simdjson_inline simdjson_result<const char *> current_location() noexcept;
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
simdjson_really_inline bool is_negative() noexcept;
|
simdjson_inline bool is_negative() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
||||||
/** @copydoc simdjson_really_inline std::string_view document_reference::raw_json_token() const noexcept */
|
/** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t nex
|
|||||||
|
|
||||||
#endif // SIMDJSON_THREADS_ENABLED
|
#endif // SIMDJSON_THREADS_ENABLED
|
||||||
|
|
||||||
simdjson_really_inline document_stream::document_stream(
|
simdjson_inline document_stream::document_stream(
|
||||||
ondemand::parser &_parser,
|
ondemand::parser &_parser,
|
||||||
const uint8_t *_buf,
|
const uint8_t *_buf,
|
||||||
size_t _len,
|
size_t _len,
|
||||||
@@ -102,7 +102,7 @@ simdjson_really_inline document_stream::document_stream(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::document_stream() noexcept
|
simdjson_inline document_stream::document_stream() noexcept
|
||||||
: parser{nullptr},
|
: parser{nullptr},
|
||||||
buf{nullptr},
|
buf{nullptr},
|
||||||
len{0},
|
len{0},
|
||||||
@@ -114,7 +114,7 @@ simdjson_really_inline document_stream::document_stream() noexcept
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::~document_stream() noexcept
|
simdjson_inline document_stream::~document_stream() noexcept
|
||||||
{
|
{
|
||||||
#ifdef SIMDJSON_THREADS_ENABLED
|
#ifdef SIMDJSON_THREADS_ENABLED
|
||||||
worker.reset();
|
worker.reset();
|
||||||
@@ -130,20 +130,20 @@ inline size_t document_stream::truncated_bytes() const noexcept {
|
|||||||
return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
|
return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator::iterator() noexcept
|
simdjson_inline document_stream::iterator::iterator() noexcept
|
||||||
: stream{nullptr}, finished{true} {
|
: stream{nullptr}, finished{true} {
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
|
simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
|
||||||
: stream{_stream}, finished{is_end} {
|
: stream{_stream}, finished{is_end} {
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<ondemand::document_reference> document_stream::iterator::operator*() noexcept {
|
simdjson_inline simdjson_result<ondemand::document_reference> document_stream::iterator::operator*() noexcept {
|
||||||
//if(stream->error) { return stream->error; }
|
//if(stream->error) { return stream->error; }
|
||||||
return simdjson_result<ondemand::document_reference>(stream->doc, stream->error);
|
return simdjson_result<ondemand::document_reference>(stream->doc, stream->error);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
|
simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
|
||||||
// If there is an error, then we want the iterator
|
// If there is an error, then we want the iterator
|
||||||
// to be finished, no matter what. (E.g., we do not
|
// to be finished, no matter what. (E.g., we do not
|
||||||
// keep generating documents with errors, or go beyond
|
// keep generating documents with errors, or go beyond
|
||||||
@@ -170,17 +170,17 @@ simdjson_really_inline document_stream::iterator& document_stream::iterator::ope
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
|
simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
|
||||||
return finished != other.finished;
|
return finished != other.finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator document_stream::begin() noexcept {
|
simdjson_inline document_stream::iterator document_stream::begin() noexcept {
|
||||||
start();
|
start();
|
||||||
// If there are no documents, we're finished.
|
// If there are no documents, we're finished.
|
||||||
return iterator(this, error == EMPTY);
|
return iterator(this, error == EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline document_stream::iterator document_stream::end() noexcept {
|
simdjson_inline document_stream::iterator document_stream::end() noexcept {
|
||||||
return iterator(this, true);
|
return iterator(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,11 +310,11 @@ inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline size_t document_stream::iterator::current_index() const noexcept {
|
simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
|
||||||
return stream->doc_index;
|
return stream->doc_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline std::string_view document_stream::iterator::source() const noexcept {
|
simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
|
||||||
auto depth = stream->doc.iter.depth();
|
auto depth = stream->doc.iter.depth();
|
||||||
auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
|
auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
|
||||||
|
|
||||||
@@ -389,13 +389,13 @@ inline void document_stream::start_stage1_thread() noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>::simdjson_result(
|
||||||
error_code error
|
error_code error
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>(error)
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>(error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>(
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream>(
|
||||||
@@ -404,4 +404,4 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::docume
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,13 +81,13 @@ public:
|
|||||||
* auto error = parser.iterate_many(json).get(docs);
|
* auto error = parser.iterate_many(json).get(docs);
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline document_stream() noexcept;
|
simdjson_inline document_stream() noexcept;
|
||||||
/** Move one document_stream to another. */
|
/** Move one document_stream to another. */
|
||||||
simdjson_really_inline document_stream(document_stream &&other) noexcept = default;
|
simdjson_inline document_stream(document_stream &&other) noexcept = default;
|
||||||
/** Move one document_stream to another. */
|
/** Move one document_stream to another. */
|
||||||
simdjson_really_inline document_stream &operator=(document_stream &&other) noexcept = default;
|
simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline ~document_stream() noexcept;
|
simdjson_inline ~document_stream() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the input size in bytes.
|
* Returns the input size in bytes.
|
||||||
@@ -126,11 +126,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator() noexcept;
|
simdjson_inline iterator() noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the current document (or error).
|
* Get the current document (or error).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<ondemand::document_reference> operator*() noexcept;
|
simdjson_inline simdjson_result<ondemand::document_reference> operator*() noexcept;
|
||||||
/**
|
/**
|
||||||
* Advance to the next document (prefix).
|
* Advance to the next document (prefix).
|
||||||
*/
|
*/
|
||||||
@@ -139,7 +139,7 @@ public:
|
|||||||
* Check if we're at the end yet.
|
* Check if we're at the end yet.
|
||||||
* @param other the end iterator to compare to.
|
* @param other the end iterator to compare to.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool operator!=(const iterator &other) const noexcept;
|
simdjson_inline bool operator!=(const iterator &other) const noexcept;
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*
|
*
|
||||||
@@ -155,7 +155,7 @@ public:
|
|||||||
* may change in future versions of simdjson: we find the API somewhat
|
* may change in future versions of simdjson: we find the API somewhat
|
||||||
* awkward and we would like to offer something friendlier.
|
* awkward and we would like to offer something friendlier.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline size_t current_index() const noexcept;
|
simdjson_inline size_t current_index() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
@@ -176,7 +176,7 @@ public:
|
|||||||
* awkward and we would like to offer something friendlier.
|
* awkward and we would like to offer something friendlier.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline std::string_view source() const noexcept;
|
simdjson_inline std::string_view source() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns error of the stream (if any).
|
* Returns error of the stream (if any).
|
||||||
@@ -184,7 +184,7 @@ public:
|
|||||||
inline error_code error() const noexcept;
|
inline error_code error() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
simdjson_really_inline iterator(document_stream *s, bool finished) noexcept;
|
simdjson_inline iterator(document_stream *s, bool finished) noexcept;
|
||||||
/** The document_stream we're iterating through. */
|
/** The document_stream we're iterating through. */
|
||||||
document_stream* stream;
|
document_stream* stream;
|
||||||
/** Whether we're finished or not. */
|
/** Whether we're finished or not. */
|
||||||
@@ -198,11 +198,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Start iterating the documents in the stream.
|
* Start iterating the documents in the stream.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator begin() noexcept;
|
simdjson_inline iterator begin() noexcept;
|
||||||
/**
|
/**
|
||||||
* The end of the stream, for iterator comparison purposes.
|
* The end of the stream, for iterator comparison purposes.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline iterator end() noexcept;
|
simdjson_inline iterator end() noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ private:
|
|||||||
* @param len is the length of the raw byte buffer in bytes
|
* @param len is the length of the raw byte buffer in bytes
|
||||||
* @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
|
* @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline document_stream(
|
simdjson_inline document_stream(
|
||||||
ondemand::parser &parser,
|
ondemand::parser &parser,
|
||||||
const uint8_t *buf,
|
const uint8_t *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
@@ -322,9 +322,9 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -3,41 +3,41 @@ namespace SIMDJSON_IMPLEMENTATION {
|
|||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
|
// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
|
||||||
simdjson_really_inline field::field() noexcept : std::pair<raw_json_string, ondemand::value>() {}
|
simdjson_inline field::field() noexcept : std::pair<raw_json_string, ondemand::value>() {}
|
||||||
|
|
||||||
simdjson_really_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
|
simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
|
||||||
: std::pair<raw_json_string, ondemand::value>(key, std::forward<ondemand::value>(value))
|
: std::pair<raw_json_string, ondemand::value>(key, std::forward<ondemand::value>(value))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<field> field::start(value_iterator &parent_iter) noexcept {
|
simdjson_inline simdjson_result<field> field::start(value_iterator &parent_iter) noexcept {
|
||||||
raw_json_string key;
|
raw_json_string key;
|
||||||
SIMDJSON_TRY( parent_iter.field_key().get(key) );
|
SIMDJSON_TRY( parent_iter.field_key().get(key) );
|
||||||
SIMDJSON_TRY( parent_iter.field_value() );
|
SIMDJSON_TRY( parent_iter.field_value() );
|
||||||
return field::start(parent_iter, key);
|
return field::start(parent_iter, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<field> field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
|
simdjson_inline simdjson_result<field> field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
|
||||||
return field(key, parent_iter.child());
|
return field(key, parent_iter.child());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> field::unescaped_key() noexcept {
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> field::unescaped_key() noexcept {
|
||||||
SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
|
SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
|
||||||
simdjson_result<std::string_view> answer = first.unescape(second.iter.json_iter());
|
simdjson_result<std::string_view> answer = first.unescape(second.iter.json_iter());
|
||||||
first.consume();
|
first.consume();
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline raw_json_string field::key() const noexcept {
|
simdjson_inline raw_json_string field::key() const noexcept {
|
||||||
SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
|
SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline value &field::value() & noexcept {
|
simdjson_inline value &field::value() & noexcept {
|
||||||
return second;
|
return second;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline value field::value() && noexcept {
|
simdjson_inline value field::value() && noexcept {
|
||||||
return std::forward<field>(*this).second;
|
return std::forward<field>(*this).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ simdjson_really_inline value field::value() && noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::field &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::field &&value
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(
|
||||||
@@ -55,22 +55,22 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::simdjson_result(
|
||||||
error_code error
|
error_code error
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(error)
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field>(error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::key() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.key();
|
return first.key();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::unescaped_key() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::unescaped_key() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.unescaped_key();
|
return first.unescaped_key();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::value() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field>::value() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::move(first.value());
|
return std::move(first.value());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline field() noexcept;
|
simdjson_inline field() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the key as a string_view (for higher speed, consider raw_key).
|
* Get the key as a string_view (for higher speed, consider raw_key).
|
||||||
@@ -28,25 +28,25 @@ public:
|
|||||||
* This consumes the key: once you have called unescaped_key(), you cannot
|
* This consumes the key: once you have called unescaped_key(), you cannot
|
||||||
* call it again nor can you call key().
|
* call it again nor can you call key().
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> unescaped_key() noexcept;
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescaped_key() noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the key as a raw_json_string. Can be used for direct comparison with
|
* Get the key as a raw_json_string. Can be used for direct comparison with
|
||||||
* an unescaped C string: e.g., key() == "test".
|
* an unescaped C string: e.g., key() == "test".
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline raw_json_string key() const noexcept;
|
simdjson_inline raw_json_string key() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the field value.
|
* Get the field value.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline ondemand::value &value() & noexcept;
|
simdjson_inline ondemand::value &value() & noexcept;
|
||||||
/**
|
/**
|
||||||
* @overload ondemand::value &ondemand::value() & noexcept
|
* @overload ondemand::value &ondemand::value() & noexcept
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline ondemand::value value() && noexcept;
|
simdjson_inline ondemand::value value() && noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
simdjson_really_inline field(raw_json_string key, ondemand::value &&value) noexcept;
|
simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
|
||||||
static simdjson_really_inline simdjson_result<field> start(value_iterator &parent_iter) noexcept;
|
static simdjson_inline simdjson_result<field> start(value_iterator &parent_iter) noexcept;
|
||||||
static simdjson_really_inline simdjson_result<field> start(const value_iterator &parent_iter, raw_json_string key) noexcept;
|
static simdjson_inline simdjson_result<field> start(const value_iterator &parent_iter, raw_json_string key) noexcept;
|
||||||
friend struct simdjson_result<field>;
|
friend struct simdjson_result<field>;
|
||||||
friend class object_iterator;
|
friend class object_iterator;
|
||||||
};
|
};
|
||||||
@@ -60,13 +60,13 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::field> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::field &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::field &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> unescaped_key() noexcept;
|
simdjson_inline simdjson_result<std::string_view> unescaped_key() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> key() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> key() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> value() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> value() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline json_iterator::json_iterator(json_iterator &&other) noexcept
|
simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
|
||||||
: token(std::forward<token_iterator>(other.token)),
|
: token(std::forward<token_iterator>(other.token)),
|
||||||
parser{other.parser},
|
parser{other.parser},
|
||||||
_string_buf_loc{other._string_buf_loc},
|
_string_buf_loc{other._string_buf_loc},
|
||||||
@@ -13,7 +13,7 @@ simdjson_really_inline json_iterator::json_iterator(json_iterator &&other) noexc
|
|||||||
{
|
{
|
||||||
other.parser = nullptr;
|
other.parser = nullptr;
|
||||||
}
|
}
|
||||||
simdjson_really_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
|
simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
|
||||||
token = other.token;
|
token = other.token;
|
||||||
parser = other.parser;
|
parser = other.parser;
|
||||||
_string_buf_loc = other._string_buf_loc;
|
_string_buf_loc = other._string_buf_loc;
|
||||||
@@ -25,7 +25,7 @@ simdjson_really_inline json_iterator &json_iterator::operator=(json_iterator &&o
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
|
simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
|
||||||
: token(buf, &_parser->implementation->structural_indexes[0]),
|
: token(buf, &_parser->implementation->structural_indexes[0]),
|
||||||
parser{_parser},
|
parser{_parser},
|
||||||
_string_buf_loc{parser->string_buf.get()},
|
_string_buf_loc{parser->string_buf.get()},
|
||||||
@@ -73,7 +73,7 @@ inline bool json_iterator::balanced() const noexcept {
|
|||||||
// skip_child() function is not marked inline).
|
// skip_child() function is not marked inline).
|
||||||
SIMDJSON_PUSH_DISABLE_WARNINGS
|
SIMDJSON_PUSH_DISABLE_WARNINGS
|
||||||
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
||||||
simdjson_warn_unused simdjson_really_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
|
simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
|
||||||
if (depth() <= parent_depth) { return SUCCESS; }
|
if (depth() <= parent_depth) { return SUCCESS; }
|
||||||
switch (*return_current_and_advance()) {
|
switch (*return_current_and_advance()) {
|
||||||
// TODO consider whether matching braces is a requirement: if non-matching braces indicates
|
// TODO consider whether matching braces is a requirement: if non-matching braces indicates
|
||||||
@@ -150,23 +150,23 @@ simdjson_warn_unused simdjson_really_inline error_code json_iterator::skip_child
|
|||||||
|
|
||||||
SIMDJSON_POP_DISABLE_WARNINGS
|
SIMDJSON_POP_DISABLE_WARNINGS
|
||||||
|
|
||||||
simdjson_really_inline bool json_iterator::at_root() const noexcept {
|
simdjson_inline bool json_iterator::at_root() const noexcept {
|
||||||
return position() == root_position();
|
return position() == root_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool json_iterator::streaming() const noexcept {
|
simdjson_inline bool json_iterator::streaming() const noexcept {
|
||||||
return _streaming;
|
return _streaming;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline token_position json_iterator::root_position() const noexcept {
|
simdjson_inline token_position json_iterator::root_position() const noexcept {
|
||||||
return _root;
|
return _root;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::assert_at_document_depth() const noexcept {
|
simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
|
||||||
SIMDJSON_ASSUME( _depth == 1 );
|
SIMDJSON_ASSUME( _depth == 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::assert_at_root() const noexcept {
|
simdjson_inline void json_iterator::assert_at_root() const noexcept {
|
||||||
SIMDJSON_ASSUME( _depth == 1 );
|
SIMDJSON_ASSUME( _depth == 1 );
|
||||||
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
||||||
// Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
|
// Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
|
||||||
@@ -175,21 +175,21 @@ simdjson_really_inline void json_iterator::assert_at_root() const noexcept {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
|
simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
|
||||||
assert_valid_position(token._position + required_tokens - 1);
|
assert_valid_position(token._position + required_tokens - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
|
simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
|
||||||
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
||||||
SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
|
SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
|
||||||
SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
|
SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool json_iterator::at_end() const noexcept {
|
simdjson_inline bool json_iterator::at_end() const noexcept {
|
||||||
return position() == end_position();
|
return position() == end_position();
|
||||||
}
|
}
|
||||||
simdjson_really_inline token_position json_iterator::end_position() const noexcept {
|
simdjson_inline token_position json_iterator::end_position() const noexcept {
|
||||||
uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
|
uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
|
||||||
return &parser->implementation->structural_indexes[n_structural_indexes];
|
return &parser->implementation->structural_indexes[n_structural_indexes];
|
||||||
}
|
}
|
||||||
@@ -218,42 +218,42 @@ inline simdjson_result<const char *> json_iterator::current_location() noexcept
|
|||||||
return reinterpret_cast<const char *>(token.peek());
|
return reinterpret_cast<const char *>(token.peek());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool json_iterator::is_alive() const noexcept {
|
simdjson_inline bool json_iterator::is_alive() const noexcept {
|
||||||
return parser;
|
return parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::abandon() noexcept {
|
simdjson_inline void json_iterator::abandon() noexcept {
|
||||||
parser = nullptr;
|
parser = nullptr;
|
||||||
_depth = 0;
|
_depth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
|
simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
|
||||||
#if SIMDJSON_CHECK_EOF
|
#if SIMDJSON_CHECK_EOF
|
||||||
assert_more_tokens();
|
assert_more_tokens();
|
||||||
#endif // SIMDJSON_CHECK_EOF
|
#endif // SIMDJSON_CHECK_EOF
|
||||||
return token.return_current_and_advance();
|
return token.return_current_and_advance();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
|
simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
|
||||||
// deliberately done without safety guard:
|
// deliberately done without safety guard:
|
||||||
return token.peek(0);
|
return token.peek(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
|
simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
|
||||||
#if SIMDJSON_CHECK_EOF
|
#if SIMDJSON_CHECK_EOF
|
||||||
assert_more_tokens(delta+1);
|
assert_more_tokens(delta+1);
|
||||||
#endif // SIMDJSON_CHECK_EOF
|
#endif // SIMDJSON_CHECK_EOF
|
||||||
return token.peek(delta);
|
return token.peek(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
|
simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
|
||||||
#if SIMDJSON_CHECK_EOF
|
#if SIMDJSON_CHECK_EOF
|
||||||
assert_more_tokens(delta+1);
|
assert_more_tokens(delta+1);
|
||||||
#endif // #if SIMDJSON_CHECK_EOF
|
#endif // #if SIMDJSON_CHECK_EOF
|
||||||
return token.peek_length(delta);
|
return token.peek_length(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
|
simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
|
||||||
// todo: currently we require end-of-string buffering, but the following
|
// todo: currently we require end-of-string buffering, but the following
|
||||||
// assert_valid_position should be turned on if/when we lift that condition.
|
// assert_valid_position should be turned on if/when we lift that condition.
|
||||||
// assert_valid_position(position);
|
// assert_valid_position(position);
|
||||||
@@ -262,14 +262,14 @@ simdjson_really_inline const uint8_t *json_iterator::peek(token_position positio
|
|||||||
return token.peek(position);
|
return token.peek(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
|
simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
|
||||||
#if SIMDJSON_CHECK_EOF
|
#if SIMDJSON_CHECK_EOF
|
||||||
assert_valid_position(position);
|
assert_valid_position(position);
|
||||||
#endif // SIMDJSON_CHECK_EOF
|
#endif // SIMDJSON_CHECK_EOF
|
||||||
return token.peek_length(position);
|
return token.peek_length(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline token_position json_iterator::last_position() const noexcept {
|
simdjson_inline token_position json_iterator::last_position() const noexcept {
|
||||||
// The following line fails under some compilers...
|
// The following line fails under some compilers...
|
||||||
// SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
|
// SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
|
||||||
// since it has side-effects.
|
// since it has side-effects.
|
||||||
@@ -277,49 +277,49 @@ simdjson_really_inline token_position json_iterator::last_position() const noexc
|
|||||||
SIMDJSON_ASSUME(n_structural_indexes > 0);
|
SIMDJSON_ASSUME(n_structural_indexes > 0);
|
||||||
return &parser->implementation->structural_indexes[n_structural_indexes - 1];
|
return &parser->implementation->structural_indexes[n_structural_indexes - 1];
|
||||||
}
|
}
|
||||||
simdjson_really_inline const uint8_t *json_iterator::peek_last() const noexcept {
|
simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
|
||||||
return token.peek(last_position());
|
return token.peek(last_position());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
|
simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
|
||||||
SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
|
SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
|
||||||
SIMDJSON_ASSUME(_depth == parent_depth + 1);
|
SIMDJSON_ASSUME(_depth == parent_depth + 1);
|
||||||
_depth = parent_depth;
|
_depth = parent_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
|
simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
|
||||||
SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
|
SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
|
||||||
SIMDJSON_ASSUME(_depth == child_depth - 1);
|
SIMDJSON_ASSUME(_depth == child_depth - 1);
|
||||||
_depth = child_depth;
|
_depth = child_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline depth_t json_iterator::depth() const noexcept {
|
simdjson_inline depth_t json_iterator::depth() const noexcept {
|
||||||
return _depth;
|
return _depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
|
simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
|
||||||
return _string_buf_loc;
|
return _string_buf_loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
|
simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
|
||||||
SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
|
SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
|
||||||
logger::log_error(*this, message);
|
logger::log_error(*this, message);
|
||||||
error = _error;
|
error = _error;
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline token_position json_iterator::position() const noexcept {
|
simdjson_inline token_position json_iterator::position() const noexcept {
|
||||||
return token.position();
|
return token.position();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in) noexcept {
|
simdjson_inline simdjson_result<std::string_view> json_iterator::unescape(raw_json_string in) noexcept {
|
||||||
return parser->unescape(in, _string_buf_loc);
|
return parser->unescape(in, _string_buf_loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
|
simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
|
||||||
SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
|
SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
|
||||||
SIMDJSON_ASSUME(_depth == child_depth - 1);
|
SIMDJSON_ASSUME(_depth == child_depth - 1);
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
|
||||||
SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
|
SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
|
||||||
#endif
|
#endif
|
||||||
@@ -328,27 +328,27 @@ simdjson_really_inline void json_iterator::reenter_child(token_position position
|
|||||||
_depth = child_depth;
|
_depth = child_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
|
|
||||||
simdjson_really_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
|
simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
|
||||||
return parser->start_positions[depth];
|
return parser->start_positions[depth];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
|
simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
|
||||||
parser->start_positions[depth] = position;
|
parser->start_positions[depth] = position;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
|
simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
|
||||||
SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
|
SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
|
||||||
logger::log_error(*this, message);
|
logger::log_error(*this, message);
|
||||||
return _error;
|
return _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int N>
|
template<int N>
|
||||||
simdjson_warn_unused simdjson_really_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t (&tmpbuf)[N]) noexcept {
|
simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t (&tmpbuf)[N]) noexcept {
|
||||||
// Let us guard against silly cases:
|
// Let us guard against silly cases:
|
||||||
if((N < max_len) || (N == 0)) { return false; }
|
if((N < max_len) || (N == 0)) { return false; }
|
||||||
// Truncate whitespace to fit the buffer.
|
// Truncate whitespace to fit the buffer.
|
||||||
@@ -369,9 +369,9 @@ simdjson_warn_unused simdjson_really_inline bool json_iterator::copy_to_buffer(c
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator>(error) {}
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -61,20 +61,20 @@ protected:
|
|||||||
bool _streaming{false};
|
bool _streaming{false};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline json_iterator() noexcept = default;
|
simdjson_inline json_iterator() noexcept = default;
|
||||||
simdjson_really_inline json_iterator(json_iterator &&other) noexcept;
|
simdjson_inline json_iterator(json_iterator &&other) noexcept;
|
||||||
simdjson_really_inline json_iterator &operator=(json_iterator &&other) noexcept;
|
simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
|
||||||
simdjson_really_inline explicit json_iterator(const json_iterator &other) noexcept = default;
|
simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
|
||||||
simdjson_really_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
|
simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
|
||||||
/**
|
/**
|
||||||
* Skips a JSON value, whether it is a scalar, array or object.
|
* Skips a JSON value, whether it is a scalar, array or object.
|
||||||
*/
|
*/
|
||||||
simdjson_warn_unused simdjson_really_inline error_code skip_child(depth_t parent_depth) noexcept;
|
simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell whether the iterator is still at the start
|
* Tell whether the iterator is still at the start
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool at_root() const noexcept;
|
simdjson_inline bool at_root() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell whether we should be expected to run in streaming
|
* Tell whether we should be expected to run in streaming
|
||||||
@@ -82,53 +82,53 @@ public:
|
|||||||
* that does not affect how the iterator works. It is used by
|
* that does not affect how the iterator works. It is used by
|
||||||
* start_root_array() and start_root_object().
|
* start_root_array() and start_root_object().
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool streaming() const noexcept;
|
simdjson_inline bool streaming() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the root value iterator
|
* Get the root value iterator
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline token_position root_position() const noexcept;
|
simdjson_inline token_position root_position() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Assert that we are at the document depth (== 1)
|
* Assert that we are at the document depth (== 1)
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void assert_at_document_depth() const noexcept;
|
simdjson_inline void assert_at_document_depth() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Assert that we are at the root of the document
|
* Assert that we are at the root of the document
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void assert_at_root() const noexcept;
|
simdjson_inline void assert_at_root() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell whether the iterator is at the EOF mark
|
* Tell whether the iterator is at the EOF mark
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool at_end() const noexcept;
|
simdjson_inline bool at_end() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell whether the iterator is live (has not been moved).
|
* Tell whether the iterator is live (has not been moved).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_alive() const noexcept;
|
simdjson_inline bool is_alive() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abandon this iterator, setting depth to 0 (as if the document is finished).
|
* Abandon this iterator, setting depth to 0 (as if the document is finished).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void abandon() noexcept;
|
simdjson_inline void abandon() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advance the current token without modifying depth.
|
* Advance the current token without modifying depth.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *return_current_and_advance() noexcept;
|
simdjson_inline const uint8_t *return_current_and_advance() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assert that there are at least the given number of tokens left.
|
* Assert that there are at least the given number of tokens left.
|
||||||
*
|
*
|
||||||
* Has no effect in release builds.
|
* Has no effect in release builds.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
|
simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Assert that the given position addresses an actual token (is within bounds).
|
* Assert that the given position addresses an actual token (is within bounds).
|
||||||
*
|
*
|
||||||
* Has no effect in release builds.
|
* Has no effect in release builds.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void assert_valid_position(token_position position) const noexcept;
|
simdjson_inline void assert_valid_position(token_position position) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the JSON text for a given token (relative).
|
* Get the JSON text for a given token (relative).
|
||||||
*
|
*
|
||||||
@@ -139,7 +139,7 @@ public:
|
|||||||
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
||||||
* it isn't used ...
|
* it isn't used ...
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *peek(int32_t delta=0) const noexcept;
|
simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the maximum length of the JSON text for the current token (or relative).
|
* Get the maximum length of the JSON text for the current token (or relative).
|
||||||
*
|
*
|
||||||
@@ -147,7 +147,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
|
* @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_length(int32_t delta=0) const noexcept;
|
simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get a pointer to the current location in the input buffer.
|
* Get a pointer to the current location in the input buffer.
|
||||||
*
|
*
|
||||||
@@ -156,7 +156,7 @@ public:
|
|||||||
* You may be pointing outside of the input buffer: it is not generally
|
* You may be pointing outside of the input buffer: it is not generally
|
||||||
* safe to dereference this pointer.
|
* safe to dereference this pointer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *unsafe_pointer() const noexcept;
|
simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the JSON text for a given token.
|
* Get the JSON text for a given token.
|
||||||
*
|
*
|
||||||
@@ -167,7 +167,7 @@ public:
|
|||||||
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
||||||
* it isn't used ...
|
* it isn't used ...
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *peek(token_position position) const noexcept;
|
simdjson_inline const uint8_t *peek(token_position position) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the maximum length of the JSON text for the current token (or relative).
|
* Get the maximum length of the JSON text for the current token (or relative).
|
||||||
*
|
*
|
||||||
@@ -175,7 +175,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @param position The position of the token to retrieve.
|
* @param position The position of the token to retrieve.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_length(token_position position) const noexcept;
|
simdjson_inline uint32_t peek_length(token_position position) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the JSON text for the last token in the document.
|
* Get the JSON text for the last token in the document.
|
||||||
*
|
*
|
||||||
@@ -184,7 +184,7 @@ public:
|
|||||||
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
||||||
* it isn't used ...
|
* it isn't used ...
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *peek_last() const noexcept;
|
simdjson_inline const uint8_t *peek_last() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ascend one level.
|
* Ascend one level.
|
||||||
@@ -193,7 +193,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @param parent_depth the expected parent depth.
|
* @param parent_depth the expected parent depth.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void ascend_to(depth_t parent_depth) noexcept;
|
simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Descend one level.
|
* Descend one level.
|
||||||
@@ -202,18 +202,18 @@ public:
|
|||||||
*
|
*
|
||||||
* @param child_depth the expected child depth.
|
* @param child_depth the expected child depth.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void descend_to(depth_t child_depth) noexcept;
|
simdjson_inline void descend_to(depth_t child_depth) noexcept;
|
||||||
simdjson_really_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
|
simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current depth.
|
* Get current depth.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline depth_t depth() const noexcept;
|
simdjson_inline depth_t depth() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current (writeable) location in the string buffer.
|
* Get current (writeable) location in the string buffer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint8_t *&string_buf_loc() noexcept;
|
simdjson_inline uint8_t *&string_buf_loc() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report an unrecoverable error, preventing further iteration.
|
* Report an unrecoverable error, preventing further iteration.
|
||||||
@@ -221,30 +221,31 @@ public:
|
|||||||
* @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
|
* @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
|
||||||
* @param message An error message to report with the error.
|
* @param message An error message to report with the error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code report_error(error_code error, const char *message) noexcept;
|
simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log error, but don't stop iteration.
|
* Log error, but don't stop iteration.
|
||||||
* @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
|
* @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
|
||||||
* @param message An error message to report with the error.
|
* @param message An error message to report with the error.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code optional_error(error_code error, const char *message) noexcept;
|
simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
|
||||||
|
|
||||||
template<int N> simdjson_warn_unused simdjson_really_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t (&tmpbuf)[N]) noexcept;
|
template<int N> simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t (&tmpbuf)[N]) noexcept;
|
||||||
|
|
||||||
simdjson_really_inline token_position position() const noexcept;
|
simdjson_inline token_position position() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Write the raw_json_string to the string buffer and return a string_view.
|
* Write the raw_json_string to the string buffer and return a string_view.
|
||||||
* Each raw_json_string should be unescaped once, or else the string buffer might
|
* Each raw_json_string should be unescaped once, or else the string buffer might
|
||||||
* overflow.
|
* overflow.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> unescape(raw_json_string in) noexcept;
|
simdjson_inline simdjson_result<std::string_view> unescape(raw_json_string in) noexcept;
|
||||||
simdjson_really_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
|
simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
|
||||||
|
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
simdjson_really_inline token_position start_position(depth_t depth) const noexcept;
|
simdjson_inline token_position start_position(depth_t depth) const noexcept;
|
||||||
simdjson_really_inline void set_start_position(depth_t depth, token_position position) noexcept;
|
simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Useful for debugging and logging purposes. */
|
/* Useful for debugging and logging purposes. */
|
||||||
inline std::string to_string() const noexcept;
|
inline std::string to_string() const noexcept;
|
||||||
|
|
||||||
@@ -266,13 +267,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
inline bool balanced() const noexcept;
|
inline bool balanced() const noexcept;
|
||||||
protected:
|
protected:
|
||||||
simdjson_really_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
|
simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
|
||||||
/// The last token before the end
|
/// The last token before the end
|
||||||
simdjson_really_inline token_position last_position() const noexcept;
|
simdjson_inline token_position last_position() const noexcept;
|
||||||
/// The token *at* the end. This points at gibberish and should only be used for comparison.
|
/// The token *at* the end. This points at gibberish and should only be used for comparison.
|
||||||
simdjson_really_inline token_position end_position() const noexcept;
|
simdjson_inline token_position end_position() const noexcept;
|
||||||
/// The end of the buffer.
|
/// The end of the buffer.
|
||||||
simdjson_really_inline token_position end() const noexcept;
|
simdjson_inline token_position end() const noexcept;
|
||||||
|
|
||||||
friend class document;
|
friend class document;
|
||||||
friend class document_stream;
|
friend class document_stream;
|
||||||
@@ -282,8 +283,8 @@ protected:
|
|||||||
friend class raw_json_string;
|
friend class raw_json_string;
|
||||||
friend class parser;
|
friend class parser;
|
||||||
friend class value_iterator;
|
friend class value_iterator;
|
||||||
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
|
friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
|
||||||
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail) noexcept;
|
friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail) noexcept;
|
||||||
}; // json_iterator
|
}; // json_iterator
|
||||||
|
|
||||||
} // namespace ondemand
|
} // namespace ondemand
|
||||||
@@ -295,10 +296,10 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -32,48 +32,48 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result<json_type> &t
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline number_type number::get_number_type() const noexcept {
|
simdjson_inline number_type number::get_number_type() const noexcept {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool number::is_uint64() const noexcept {
|
simdjson_inline bool number::is_uint64() const noexcept {
|
||||||
return get_number_type() == number_type::unsigned_integer;
|
return get_number_type() == number_type::unsigned_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint64_t number::get_uint64() const noexcept {
|
simdjson_inline uint64_t number::get_uint64() const noexcept {
|
||||||
return payload.unsigned_integer;
|
return payload.unsigned_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline number::operator uint64_t() const noexcept {
|
simdjson_inline number::operator uint64_t() const noexcept {
|
||||||
return get_uint64();
|
return get_uint64();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline bool number::is_int64() const noexcept {
|
simdjson_inline bool number::is_int64() const noexcept {
|
||||||
return get_number_type() == number_type::signed_integer;
|
return get_number_type() == number_type::signed_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline int64_t number::get_int64() const noexcept {
|
simdjson_inline int64_t number::get_int64() const noexcept {
|
||||||
return payload.signed_integer;
|
return payload.signed_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline number::operator int64_t() const noexcept {
|
simdjson_inline number::operator int64_t() const noexcept {
|
||||||
return get_int64();
|
return get_int64();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool number::is_double() const noexcept {
|
simdjson_inline bool number::is_double() const noexcept {
|
||||||
return get_number_type() == number_type::floating_point_number;
|
return get_number_type() == number_type::floating_point_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline double number::get_double() const noexcept {
|
simdjson_inline double number::get_double() const noexcept {
|
||||||
return payload.floating_point_number;
|
return payload.floating_point_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline number::operator double() const noexcept {
|
simdjson_inline number::operator double() const noexcept {
|
||||||
return get_double();
|
return get_double();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline double number::as_double() const noexcept {
|
simdjson_inline double number::as_double() const noexcept {
|
||||||
if(is_double()) {
|
if(is_double()) {
|
||||||
return payload.floating_point_number;
|
return payload.floating_point_number;
|
||||||
}
|
}
|
||||||
@@ -83,22 +83,22 @@ simdjson_really_inline double number::as_double() const noexcept {
|
|||||||
return double(payload.unsigned_integer);
|
return double(payload.unsigned_integer);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void number::append_s64(int64_t value) noexcept {
|
simdjson_inline void number::append_s64(int64_t value) noexcept {
|
||||||
payload.signed_integer = value;
|
payload.signed_integer = value;
|
||||||
type = number_type::signed_integer;
|
type = number_type::signed_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void number::append_u64(uint64_t value) noexcept {
|
simdjson_inline void number::append_u64(uint64_t value) noexcept {
|
||||||
payload.unsigned_integer = value;
|
payload.unsigned_integer = value;
|
||||||
type = number_type::unsigned_integer;
|
type = number_type::unsigned_integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void number::append_double(double value) noexcept {
|
simdjson_inline void number::append_double(double value) noexcept {
|
||||||
payload.floating_point_number = value;
|
payload.floating_point_number = value;
|
||||||
type = number_type::floating_point_number;
|
type = number_type::floating_point_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void number::skip_double() noexcept {
|
simdjson_inline void number::skip_double() noexcept {
|
||||||
type = number_type::floating_point_number;
|
type = number_type::floating_point_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,9 +108,9 @@ simdjson_really_inline void number::skip_double() noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_type &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_type &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type>(error) {}
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -34,46 +34,46 @@ struct number {
|
|||||||
* unsigned_integer /// a positive integer larger or equal to 1<<63
|
* unsigned_integer /// a positive integer larger or equal to 1<<63
|
||||||
* };
|
* };
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline number_type get_number_type() const noexcept;
|
simdjson_inline number_type get_number_type() const noexcept;
|
||||||
/**
|
/**
|
||||||
* return true if the automatically determined type of
|
* return true if the automatically determined type of
|
||||||
* the number is number_type::unsigned_integer.
|
* the number is number_type::unsigned_integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_uint64() const noexcept;
|
simdjson_inline bool is_uint64() const noexcept;
|
||||||
/**
|
/**
|
||||||
* return the value as a uint64_t, only valid if is_uint64() is true.
|
* return the value as a uint64_t, only valid if is_uint64() is true.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint64_t get_uint64() const noexcept;
|
simdjson_inline uint64_t get_uint64() const noexcept;
|
||||||
simdjson_really_inline operator uint64_t() const noexcept;
|
simdjson_inline operator uint64_t() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return true if the automatically determined type of
|
* return true if the automatically determined type of
|
||||||
* the number is number_type::signed_integer.
|
* the number is number_type::signed_integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_int64() const noexcept;
|
simdjson_inline bool is_int64() const noexcept;
|
||||||
/**
|
/**
|
||||||
* return the value as a int64_t, only valid if is_int64() is true.
|
* return the value as a int64_t, only valid if is_int64() is true.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline int64_t get_int64() const noexcept;
|
simdjson_inline int64_t get_int64() const noexcept;
|
||||||
simdjson_really_inline operator int64_t() const noexcept;
|
simdjson_inline operator int64_t() const noexcept;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return true if the automatically determined type of
|
* return true if the automatically determined type of
|
||||||
* the number is number_type::floating_point_number.
|
* the number is number_type::floating_point_number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_double() const noexcept;
|
simdjson_inline bool is_double() const noexcept;
|
||||||
/**
|
/**
|
||||||
* return the value as a double, only valid if is_double() is true.
|
* return the value as a double, only valid if is_double() is true.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline double get_double() const noexcept;
|
simdjson_inline double get_double() const noexcept;
|
||||||
simdjson_really_inline operator double() const noexcept;
|
simdjson_inline operator double() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the number to a double. Though it always succeed, the conversion
|
* Convert the number to a double. Though it always succeed, the conversion
|
||||||
* may be lossy if the number cannot be represented exactly.
|
* may be lossy if the number cannot be represented exactly.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline double as_double() const noexcept;
|
simdjson_inline double as_double() const noexcept;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -90,13 +90,13 @@ protected:
|
|||||||
template<typename W>
|
template<typename W>
|
||||||
friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
|
friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
|
||||||
/** Store a signed 64-bit value to the number. */
|
/** Store a signed 64-bit value to the number. */
|
||||||
simdjson_really_inline void append_s64(int64_t value) noexcept;
|
simdjson_inline void append_s64(int64_t value) noexcept;
|
||||||
/** Store an unsigned 64-bit value to the number. */
|
/** Store an unsigned 64-bit value to the number. */
|
||||||
simdjson_really_inline void append_u64(uint64_t value) noexcept;
|
simdjson_inline void append_u64(uint64_t value) noexcept;
|
||||||
/** Store a double value to the number. */
|
/** Store a double value to the number. */
|
||||||
simdjson_really_inline void append_double(double value) noexcept;
|
simdjson_inline void append_double(double value) noexcept;
|
||||||
/** Specifies that the value is a double, but leave it undefined. */
|
/** Specifies that the value is a double, but leave it undefined. */
|
||||||
simdjson_really_inline void skip_double() noexcept;
|
simdjson_inline void skip_double() noexcept;
|
||||||
/**
|
/**
|
||||||
* End of friend declarations.
|
* End of friend declarations.
|
||||||
*/
|
*/
|
||||||
@@ -144,10 +144,10 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_type> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_type &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_type &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
simdjson_really_inline ~simdjson_result() noexcept = default; ///< @private
|
simdjson_inline ~simdjson_result() noexcept = default; ///< @private
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,46 +2,46 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) & noexcept {
|
||||||
bool has_value;
|
bool has_value;
|
||||||
SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
|
SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
|
||||||
if (!has_value) { return NO_SUCH_FIELD; }
|
if (!has_value) { return NO_SUCH_FIELD; }
|
||||||
return value(iter.child());
|
return value(iter.child());
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<value> object::find_field_unordered(const std::string_view key) && noexcept {
|
||||||
bool has_value;
|
bool has_value;
|
||||||
SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
|
SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
|
||||||
if (!has_value) { return NO_SUCH_FIELD; }
|
if (!has_value) { return NO_SUCH_FIELD; }
|
||||||
return value(iter.child());
|
return value(iter.child());
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> object::operator[](const std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> object::operator[](const std::string_view key) & noexcept {
|
||||||
return find_field_unordered(key);
|
return find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> object::operator[](const std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<value> object::operator[](const std::string_view key) && noexcept {
|
||||||
return std::forward<object>(*this).find_field_unordered(key);
|
return std::forward<object>(*this).find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> object::find_field(const std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<value> object::find_field(const std::string_view key) & noexcept {
|
||||||
bool has_value;
|
bool has_value;
|
||||||
SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
|
SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
|
||||||
if (!has_value) { return NO_SUCH_FIELD; }
|
if (!has_value) { return NO_SUCH_FIELD; }
|
||||||
return value(iter.child());
|
return value(iter.child());
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> object::find_field(const std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<value> object::find_field(const std::string_view key) && noexcept {
|
||||||
bool has_value;
|
bool has_value;
|
||||||
SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
|
SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
|
||||||
if (!has_value) { return NO_SUCH_FIELD; }
|
if (!has_value) { return NO_SUCH_FIELD; }
|
||||||
return value(iter.child());
|
return value(iter.child());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<object> object::start(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<object> object::start(value_iterator &iter) noexcept {
|
||||||
SIMDJSON_TRY( iter.start_object().error() );
|
SIMDJSON_TRY( iter.start_object().error() );
|
||||||
return object(iter);
|
return object(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object> object::start_root(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<object> object::start_root(value_iterator &iter) noexcept {
|
||||||
SIMDJSON_TRY( iter.start_root_object().error() );
|
SIMDJSON_TRY( iter.start_root_object().error() );
|
||||||
return object(iter);
|
return object(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline error_code object::consume() noexcept {
|
simdjson_inline error_code object::consume() noexcept {
|
||||||
if(iter.is_at_key()) {
|
if(iter.is_at_key()) {
|
||||||
/**
|
/**
|
||||||
* whenever you are pointing at a key, calling skip_child() is
|
* whenever you are pointing at a key, calling skip_child() is
|
||||||
@@ -67,7 +67,7 @@ simdjson_really_inline error_code object::consume() noexcept {
|
|||||||
return error_skip;
|
return error_skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> object::raw_json() noexcept {
|
simdjson_inline simdjson_result<std::string_view> object::raw_json() noexcept {
|
||||||
const uint8_t * starting_point{iter.peek_start()};
|
const uint8_t * starting_point{iter.peek_start()};
|
||||||
auto error = consume();
|
auto error = consume();
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
@@ -75,27 +75,27 @@ simdjson_really_inline simdjson_result<std::string_view> object::raw_json() noex
|
|||||||
return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point));
|
return std::string_view(reinterpret_cast<const char*>(starting_point), size_t(final_point - starting_point));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<object> object::started(value_iterator &iter) noexcept {
|
simdjson_inline simdjson_result<object> object::started(value_iterator &iter) noexcept {
|
||||||
SIMDJSON_TRY( iter.started_object().error() );
|
SIMDJSON_TRY( iter.started_object().error() );
|
||||||
return object(iter);
|
return object(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline object object::resume(const value_iterator &iter) noexcept {
|
simdjson_inline object object::resume(const value_iterator &iter) noexcept {
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline object::object(const value_iterator &_iter) noexcept
|
simdjson_inline object::object(const value_iterator &_iter) noexcept
|
||||||
: iter{_iter}
|
: iter{_iter}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<object_iterator> object::begin() noexcept {
|
simdjson_inline simdjson_result<object_iterator> object::begin() noexcept {
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
|
if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
|
||||||
#endif
|
#endif
|
||||||
return object_iterator(iter);
|
return object_iterator(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object_iterator> object::end() noexcept {
|
simdjson_inline simdjson_result<object_iterator> object::end() noexcept {
|
||||||
return object_iterator(iter);
|
return object_iterator(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ inline simdjson_result<value> object::at_pointer(std::string_view json_pointer)
|
|||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<size_t> object::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> object::count_fields() & noexcept {
|
||||||
size_t count{0};
|
size_t count{0};
|
||||||
// Important: we do not consume any of the values.
|
// Important: we do not consume any of the values.
|
||||||
for(simdjson_unused auto v : *this) { count++; }
|
for(simdjson_unused auto v : *this) { count++; }
|
||||||
@@ -151,14 +151,14 @@ simdjson_really_inline simdjson_result<size_t> object::count_fields() & noexcept
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> object::is_empty() & noexcept {
|
simdjson_inline simdjson_result<bool> object::is_empty() & noexcept {
|
||||||
bool is_not_empty;
|
bool is_not_empty;
|
||||||
auto error = iter.reset_object().get(is_not_empty);
|
auto error = iter.reset_object().get(is_not_empty);
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
return !is_not_empty;
|
return !is_not_empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> object::reset() & noexcept {
|
simdjson_inline simdjson_result<bool> object::reset() & noexcept {
|
||||||
return iter.reset_object();
|
return iter.reset_object();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,45 +168,45 @@ simdjson_really_inline simdjson_result<bool> object::reset() & noexcept {
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object>(error) {}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::begin() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::begin() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::end() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::end() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.end();
|
return first.end();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field_unordered(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field_unordered(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field_unordered(std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field_unordered(std::string_view key) && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first).find_field_unordered(key);
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first).find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::operator[](std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::operator[](std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::operator[](std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::operator[](std::string_view key) && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first)[key];
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first)[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field(std::string_view key) & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field(std::string_view key) & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field(std::string_view key) && noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::find_field(std::string_view key) && noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first).find_field(key);
|
return std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object>(first).find_field(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
@@ -221,7 +221,7 @@ inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::
|
|||||||
return first.is_empty();
|
return first.is_empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object>::count_fields() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_fields();
|
return first.count_fields();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline object() noexcept = default;
|
simdjson_inline object() noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<object_iterator> begin() noexcept;
|
simdjson_inline simdjson_result<object_iterator> begin() noexcept;
|
||||||
simdjson_really_inline simdjson_result<object_iterator> end() noexcept;
|
simdjson_inline simdjson_result<object_iterator> end() noexcept;
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object (order-sensitive).
|
* Look up a field by name on an object (order-sensitive).
|
||||||
*
|
*
|
||||||
@@ -38,7 +38,8 @@ public:
|
|||||||
* e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
|
* e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
|
||||||
*
|
*
|
||||||
* You must consume the fields on an object one at a time. A request for a new key
|
* You must consume the fields on an object one at a time. A request for a new key
|
||||||
* invalidates previous field values: it makes them unsafe. E.g., the array
|
* invalidates previous field values: it makes them unsafe. The value instance you get
|
||||||
|
* from `content["bids"]` becomes invalid when you call `content["asks"]`. The array
|
||||||
* given by content["bids"].get_array() should not be accessed after you have called
|
* given by content["bids"].get_array() should not be accessed after you have called
|
||||||
* content["asks"].get_array(). You can detect such mistakes by first compiling and running
|
* content["asks"].get_array(). You can detect such mistakes by first compiling and running
|
||||||
* the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
|
* the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
|
||||||
@@ -51,9 +52,9 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field(std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<value> find_field(std::string_view key) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object, without regard to key order.
|
* Look up a field by name on an object, without regard to key order.
|
||||||
@@ -75,7 +76,8 @@ public:
|
|||||||
* that only one field is returned.
|
* that only one field is returned.
|
||||||
*
|
*
|
||||||
* You must consume the fields on an object one at a time. A request for a new key
|
* You must consume the fields on an object one at a time. A request for a new key
|
||||||
* invalidates previous field values: it makes them unsafe. E.g., the array
|
* invalidates previous field values: it makes them unsafe. The value instance you get
|
||||||
|
* from `content["bids"]` becomes invalid when you call `content["asks"]`. The array
|
||||||
* given by content["bids"].get_array() should not be accessed after you have called
|
* given by content["bids"].get_array() should not be accessed after you have called
|
||||||
* content["asks"].get_array(). You can detect such mistakes by first compiling and running
|
* content["asks"].get_array(). You can detect such mistakes by first compiling and running
|
||||||
* the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
|
* the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
|
||||||
@@ -87,13 +89,13 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) && noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<value> operator[](std::string_view key) & noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) & noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<value> operator[](std::string_view key) && noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
||||||
@@ -165,26 +167,26 @@ public:
|
|||||||
* To check that an object is empty, it is more performant to use
|
* To check that an object is empty, it is more performant to use
|
||||||
* the is_empty() method.
|
* the is_empty() method.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Consumes the object and returns a string_view instance corresponding to the
|
* Consumes the object and returns a string_view instance corresponding to the
|
||||||
* object as represented in JSON. It points inside the original byte array containing
|
* object as represented in JSON. It points inside the original byte array containing
|
||||||
* the JSON document.
|
* the JSON document.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Go to the end of the object, no matter where you are right now.
|
* Go to the end of the object, no matter where you are right now.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline error_code consume() noexcept;
|
simdjson_inline error_code consume() noexcept;
|
||||||
static simdjson_really_inline simdjson_result<object> start(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<object> start(value_iterator &iter) noexcept;
|
||||||
static simdjson_really_inline simdjson_result<object> start_root(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<object> start_root(value_iterator &iter) noexcept;
|
||||||
static simdjson_really_inline simdjson_result<object> started(value_iterator &iter) noexcept;
|
static simdjson_inline simdjson_result<object> started(value_iterator &iter) noexcept;
|
||||||
static simdjson_really_inline object resume(const value_iterator &iter) noexcept;
|
static simdjson_inline object resume(const value_iterator &iter) noexcept;
|
||||||
simdjson_really_inline object(const value_iterator &iter) noexcept;
|
simdjson_inline object(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline error_code find_field_raw(const std::string_view key) noexcept;
|
simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
|
||||||
|
|
||||||
value_iterator iter{};
|
value_iterator iter{};
|
||||||
|
|
||||||
@@ -202,19 +204,19 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> begin() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> begin() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> end() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> end() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) && noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) && noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) && noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) && noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
inline simdjson_result<bool> reset() noexcept;
|
inline simdjson_result<bool> reset() noexcept;
|
||||||
inline simdjson_result<bool> is_empty() noexcept;
|
inline simdjson_result<bool> is_empty() noexcept;
|
||||||
inline simdjson_result<size_t> count_fields() & noexcept;
|
inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ namespace ondemand {
|
|||||||
// object_iterator
|
// object_iterator
|
||||||
//
|
//
|
||||||
|
|
||||||
simdjson_really_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
|
simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
|
||||||
: iter{_iter}
|
: iter{_iter}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<field> object_iterator::operator*() noexcept {
|
simdjson_inline simdjson_result<field> object_iterator::operator*() noexcept {
|
||||||
error_code error = iter.error();
|
error_code error = iter.error();
|
||||||
if (error) { iter.abandon(); return error; }
|
if (error) { iter.abandon(); return error; }
|
||||||
auto result = field::start(iter);
|
auto result = field::start(iter);
|
||||||
@@ -19,16 +19,16 @@ simdjson_really_inline simdjson_result<field> object_iterator::operator*() noexc
|
|||||||
if (result.error()) { iter.abandon(); }
|
if (result.error()) { iter.abandon(); }
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
|
simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
|
||||||
return !(*this != other);
|
return !(*this != other);
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
|
simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
|
||||||
return iter.is_open();
|
return iter.is_open();
|
||||||
}
|
}
|
||||||
|
|
||||||
SIMDJSON_PUSH_DISABLE_WARNINGS
|
SIMDJSON_PUSH_DISABLE_WARNINGS
|
||||||
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
|
||||||
simdjson_really_inline object_iterator &object_iterator::operator++() noexcept {
|
simdjson_inline object_iterator &object_iterator::operator++() noexcept {
|
||||||
// TODO this is a safety rail ... users should exit loops as soon as they receive an error.
|
// TODO this is a safety rail ... users should exit loops as soon as they receive an error.
|
||||||
// Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
|
// Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
|
||||||
if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
|
if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
|
||||||
@@ -89,34 +89,34 @@ SIMDJSON_POP_DISABLE_WARNINGS
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::object_iterator &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::object_iterator &&value
|
||||||
) noexcept
|
) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>(value))
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>(value))
|
||||||
{
|
{
|
||||||
first.iter.assert_is_valid();
|
first.iter.assert_is_valid();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>({}, error)
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>({}, error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator*() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator*() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return *first;
|
return *first;
|
||||||
}
|
}
|
||||||
// If we're iterating and there is an error, return the error once.
|
// If we're iterating and there is an error, return the error once.
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &other) const noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &other) const noexcept {
|
||||||
if (!first.iter.is_valid()) { return !error(); }
|
if (!first.iter.is_valid()) { return !error(); }
|
||||||
return first == other.first;
|
return first == other.first;
|
||||||
}
|
}
|
||||||
// If we're iterating and there is an error, return the error once.
|
// If we're iterating and there is an error, return the error once.
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &other) const noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &other) const noexcept {
|
||||||
if (!first.iter.is_valid()) { return error(); }
|
if (!first.iter.is_valid()) { return error(); }
|
||||||
return first != other.first;
|
return first != other.first;
|
||||||
}
|
}
|
||||||
// Checks for ']' and ','
|
// Checks for ']' and ','
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator++() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator>::operator++() noexcept {
|
||||||
// Clear the error if there is one, so we don't yield it twice
|
// Clear the error if there is one, so we don't yield it twice
|
||||||
if (error()) { second = SUCCESS; return *this; }
|
if (error()) { second = SUCCESS; return *this; }
|
||||||
++first;
|
++first;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline object_iterator() noexcept = default;
|
simdjson_inline object_iterator() noexcept = default;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Iterator interface
|
// Iterator interface
|
||||||
@@ -21,13 +21,13 @@ public:
|
|||||||
|
|
||||||
// Reads key and value, yielding them to the user.
|
// Reads key and value, yielding them to the user.
|
||||||
// MUST ONLY BE CALLED ONCE PER ITERATION.
|
// MUST ONLY BE CALLED ONCE PER ITERATION.
|
||||||
simdjson_really_inline simdjson_result<field> operator*() noexcept;
|
simdjson_inline simdjson_result<field> operator*() noexcept;
|
||||||
// Assumes it's being compared with the end. true if depth < iter->depth.
|
// Assumes it's being compared with the end. true if depth < iter->depth.
|
||||||
simdjson_really_inline bool operator==(const object_iterator &) const noexcept;
|
simdjson_inline bool operator==(const object_iterator &) const noexcept;
|
||||||
// Assumes it's being compared with the end. true if depth >= iter->depth.
|
// Assumes it's being compared with the end. true if depth >= iter->depth.
|
||||||
simdjson_really_inline bool operator!=(const object_iterator &) const noexcept;
|
simdjson_inline bool operator!=(const object_iterator &) const noexcept;
|
||||||
// Checks for ']' and ','
|
// Checks for ']' and ','
|
||||||
simdjson_really_inline object_iterator &operator++() noexcept;
|
simdjson_inline object_iterator &operator++() noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
@@ -38,7 +38,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
value_iterator iter{};
|
value_iterator iter{};
|
||||||
|
|
||||||
simdjson_really_inline object_iterator(const value_iterator &iter) noexcept;
|
simdjson_inline object_iterator(const value_iterator &iter) noexcept;
|
||||||
friend struct simdjson_result<object_iterator>;
|
friend struct simdjson_result<object_iterator>;
|
||||||
friend class object;
|
friend class object;
|
||||||
};
|
};
|
||||||
@@ -52,22 +52,22 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object_iterator &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::object_iterator &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Iterator interface
|
// Iterator interface
|
||||||
//
|
//
|
||||||
|
|
||||||
// Reads key and value, yielding them to the user.
|
// Reads key and value, yielding them to the user.
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::field> operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
|
||||||
// Assumes it's being compared with the end. true if depth < iter->depth.
|
// Assumes it's being compared with the end. true if depth < iter->depth.
|
||||||
simdjson_really_inline bool operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &) const noexcept;
|
simdjson_inline bool operator==(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &) const noexcept;
|
||||||
// Assumes it's being compared with the end. true if depth >= iter->depth.
|
// Assumes it's being compared with the end. true if depth >= iter->depth.
|
||||||
simdjson_really_inline bool operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &) const noexcept;
|
simdjson_inline bool operator!=(const simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &) const noexcept;
|
||||||
// Checks for ']' and ','
|
// Checks for ']' and ','
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &operator++() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object_iterator> &operator++() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline parser::parser(size_t max_capacity) noexcept
|
simdjson_inline parser::parser(size_t max_capacity) noexcept
|
||||||
: _max_capacity{max_capacity} {
|
: _max_capacity{max_capacity} {
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
|
simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
|
||||||
if (new_capacity > max_capacity()) { return CAPACITY; }
|
if (new_capacity > max_capacity()) { return CAPACITY; }
|
||||||
if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
|
if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ simdjson_warn_unused simdjson_really_inline error_code parser::allocate(size_t n
|
|||||||
_capacity = 0;
|
_capacity = 0;
|
||||||
size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
|
size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
|
||||||
string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
|
string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
|
start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
|
||||||
#endif
|
#endif
|
||||||
if (implementation) {
|
if (implementation) {
|
||||||
@@ -28,7 +28,7 @@ simdjson_warn_unused simdjson_really_inline error_code parser::allocate(size_t n
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(padded_string_view json) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(padded_string_view json) & noexcept {
|
||||||
if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
|
if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
|
||||||
|
|
||||||
// Allocate if needed
|
// Allocate if needed
|
||||||
@@ -41,37 +41,37 @@ simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::it
|
|||||||
return document::start({ reinterpret_cast<const uint8_t *>(json.data()), this });
|
return document::start({ reinterpret_cast<const uint8_t *>(json.data()), this });
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
|
||||||
return iterate(padded_string_view(json, len, allocated));
|
return iterate(padded_string_view(json, len, allocated));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
|
||||||
return iterate(padded_string_view(json, len, allocated));
|
return iterate(padded_string_view(json, len, allocated));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(std::string_view json, size_t allocated) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(std::string_view json, size_t allocated) & noexcept {
|
||||||
return iterate(padded_string_view(json, allocated));
|
return iterate(padded_string_view(json, allocated));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(const std::string &json) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const std::string &json) & noexcept {
|
||||||
return iterate(padded_string_view(json));
|
return iterate(padded_string_view(json));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string_view> &result) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string_view> &result) & noexcept {
|
||||||
// We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception
|
// We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception
|
||||||
SIMDJSON_TRY( result.error() );
|
SIMDJSON_TRY( result.error() );
|
||||||
padded_string_view json = result.value_unsafe();
|
padded_string_view json = result.value_unsafe();
|
||||||
return iterate(json);
|
return iterate(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string> &result) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<document> parser::iterate(const simdjson_result<padded_string> &result) & noexcept {
|
||||||
// We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception
|
// We don't presently have a way to temporarily get a const T& from a simdjson_result<T> without throwing an exception
|
||||||
SIMDJSON_TRY( result.error() );
|
SIMDJSON_TRY( result.error() );
|
||||||
const padded_string &json = result.value_unsafe();
|
const padded_string &json = result.value_unsafe();
|
||||||
return iterate(json);
|
return iterate(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<json_iterator> parser::iterate_raw(padded_string_view json) & noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<json_iterator> parser::iterate_raw(padded_string_view json) & noexcept {
|
||||||
if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
|
if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
|
||||||
|
|
||||||
// Allocate if needed
|
// Allocate if needed
|
||||||
@@ -98,17 +98,17 @@ inline simdjson_result<document_stream> parser::iterate_many(const padded_string
|
|||||||
return iterate_many(s.data(), s.length(), batch_size);
|
return iterate_many(s.data(), s.length(), batch_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline size_t parser::capacity() const noexcept {
|
simdjson_inline size_t parser::capacity() const noexcept {
|
||||||
return _capacity;
|
return _capacity;
|
||||||
}
|
}
|
||||||
simdjson_really_inline size_t parser::max_capacity() const noexcept {
|
simdjson_inline size_t parser::max_capacity() const noexcept {
|
||||||
return _max_capacity;
|
return _max_capacity;
|
||||||
}
|
}
|
||||||
simdjson_really_inline size_t parser::max_depth() const noexcept {
|
simdjson_inline size_t parser::max_depth() const noexcept {
|
||||||
return _max_depth;
|
return _max_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
|
simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
|
||||||
size_t MINIMAL_DOCUMENT_CAPACITY = 32;
|
size_t MINIMAL_DOCUMENT_CAPACITY = 32;
|
||||||
if(max_capacity < MINIMAL_DOCUMENT_CAPACITY) {
|
if(max_capacity < MINIMAL_DOCUMENT_CAPACITY) {
|
||||||
_max_capacity = max_capacity;
|
_max_capacity = max_capacity;
|
||||||
@@ -117,7 +117,7 @@ simdjson_really_inline void parser::set_max_capacity(size_t max_capacity) noexce
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> parser::unescape(raw_json_string in, uint8_t *&dst) const noexcept {
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> parser::unescape(raw_json_string in, uint8_t *&dst) const noexcept {
|
||||||
uint8_t *end = implementation->parse_string(in.buf, dst);
|
uint8_t *end = implementation->parse_string(in.buf, dst);
|
||||||
if (!end) { return STRING_ERROR; }
|
if (!end) { return STRING_ERROR; }
|
||||||
std::string_view result(reinterpret_cast<const char *>(dst), end-dst);
|
std::string_view result(reinterpret_cast<const char *>(dst), end-dst);
|
||||||
@@ -131,9 +131,9 @@ simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> pa
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::parser &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::parser &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::parser>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::parser>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser>(error) {}
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ public:
|
|||||||
inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
|
inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
|
||||||
|
|
||||||
inline parser(parser &&other) noexcept = default;
|
inline parser(parser &&other) noexcept = default;
|
||||||
simdjson_really_inline parser(const parser &other) = delete;
|
simdjson_inline parser(const parser &other) = delete;
|
||||||
simdjson_really_inline parser &operator=(const parser &other) = delete;
|
simdjson_inline parser &operator=(const parser &other) = delete;
|
||||||
simdjson_really_inline parser &operator=(parser &&other) noexcept = default;
|
simdjson_inline parser &operator=(parser &&other) noexcept = default;
|
||||||
|
|
||||||
/** Deallocate the JSON parser. */
|
/** Deallocate the JSON parser. */
|
||||||
inline ~parser() noexcept = default;
|
inline ~parser() noexcept = default;
|
||||||
@@ -226,12 +226,12 @@ public:
|
|||||||
simdjson_result<document_stream> iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
|
simdjson_result<document_stream> iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
|
||||||
|
|
||||||
/** The capacity of this parser (the largest document it can process). */
|
/** The capacity of this parser (the largest document it can process). */
|
||||||
simdjson_really_inline size_t capacity() const noexcept;
|
simdjson_inline size_t capacity() const noexcept;
|
||||||
/** The maximum capacity of this parser (the largest document it is allowed to process). */
|
/** The maximum capacity of this parser (the largest document it is allowed to process). */
|
||||||
simdjson_really_inline size_t max_capacity() const noexcept;
|
simdjson_inline size_t max_capacity() const noexcept;
|
||||||
simdjson_really_inline void set_max_capacity(size_t max_capacity) noexcept;
|
simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
|
||||||
/** The maximum depth of this parser (the most deeply nested objects and arrays it can process). */
|
/** The maximum depth of this parser (the most deeply nested objects and arrays it can process). */
|
||||||
simdjson_really_inline size_t max_depth() const noexcept;
|
simdjson_inline size_t max_depth() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
|
* Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
|
||||||
@@ -272,7 +272,7 @@ public:
|
|||||||
* @return A string_view pointing at the unescaped string in dst
|
* @return A string_view pointing at the unescaped string in dst
|
||||||
* @error STRING_ERROR if escapes are incorrect.
|
* @error STRING_ERROR if escapes are incorrect.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> unescape(raw_json_string in, uint8_t *&dst) const noexcept;
|
simdjson_inline simdjson_result<std::string_view> unescape(raw_json_string in, uint8_t *&dst) const noexcept;
|
||||||
private:
|
private:
|
||||||
/** @private [for benchmarking access] The implementation to use */
|
/** @private [for benchmarking access] The implementation to use */
|
||||||
std::unique_ptr<internal::dom_parser_implementation> implementation{};
|
std::unique_ptr<internal::dom_parser_implementation> implementation{};
|
||||||
@@ -280,7 +280,7 @@ private:
|
|||||||
size_t _max_capacity;
|
size_t _max_capacity;
|
||||||
size_t _max_depth{DEFAULT_MAX_DEPTH};
|
size_t _max_depth{DEFAULT_MAX_DEPTH};
|
||||||
std::unique_ptr<uint8_t[]> string_buf{};
|
std::unique_ptr<uint8_t[]> string_buf{};
|
||||||
#ifdef SIMDJSON_DEVELOPMENT_CHECKS
|
#if SIMDJSON_DEVELOPMENT_CHECKS
|
||||||
std::unique_ptr<token_position[]> start_positions{};
|
std::unique_ptr<token_position[]> start_positions{};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -297,9 +297,9 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::parser> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::parser> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::parser &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::parser &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
|
simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
|
||||||
|
|
||||||
simdjson_really_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast<const char *>(buf); }
|
simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast<const char *>(buf); }
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
|
simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
|
||||||
size_t pos{0};
|
size_t pos{0};
|
||||||
// if the content has no escape character, just scan through it quickly!
|
// if the content has no escape character, just scan through it quickly!
|
||||||
for(;pos < target.size() && target[pos] != '\\';pos++) {}
|
for(;pos < target.size() && target[pos] != '\\';pos++) {}
|
||||||
@@ -26,7 +26,7 @@ simdjson_really_inline bool raw_json_string::is_free_from_unescaped_quote(std::s
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
|
simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
|
||||||
size_t pos{0};
|
size_t pos{0};
|
||||||
// if the content has no escape character, just scan through it quickly!
|
// if the content has no escape character, just scan through it quickly!
|
||||||
for(;target[pos] && target[pos] != '\\';pos++) {}
|
for(;target[pos] && target[pos] != '\\';pos++) {}
|
||||||
@@ -45,12 +45,12 @@ simdjson_really_inline bool raw_json_string::is_free_from_unescaped_quote(const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
|
simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
|
||||||
// If we are going to call memcmp, then we must know something about the length of the raw_json_string.
|
// If we are going to call memcmp, then we must know something about the length of the raw_json_string.
|
||||||
return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
|
return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
|
simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
|
||||||
// Assumptions: does not contain unescaped quote characters, and
|
// Assumptions: does not contain unescaped quote characters, and
|
||||||
// the raw content is quote terminated within a valid JSON string.
|
// the raw content is quote terminated within a valid JSON string.
|
||||||
if(target.size() <= SIMDJSON_PADDING) {
|
if(target.size() <= SIMDJSON_PADDING) {
|
||||||
@@ -65,7 +65,7 @@ simdjson_really_inline bool raw_json_string::unsafe_is_equal(std::string_view ta
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
|
simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
|
||||||
const char * r{raw()};
|
const char * r{raw()};
|
||||||
size_t pos{0};
|
size_t pos{0};
|
||||||
bool escaping{false};
|
bool escaping{false};
|
||||||
@@ -89,7 +89,7 @@ simdjson_really_inline bool raw_json_string::is_equal(std::string_view target) c
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
|
simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
|
||||||
// Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
|
// Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
|
||||||
// the raw content is quote terminated within a valid JSON string.
|
// the raw content is quote terminated within a valid JSON string.
|
||||||
const char * r{raw()};
|
const char * r{raw()};
|
||||||
@@ -101,7 +101,7 @@ simdjson_really_inline bool raw_json_string::unsafe_is_equal(const char * target
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool raw_json_string::is_equal(const char* target) const noexcept {
|
simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
|
||||||
// Assumptions: does not contain unescaped quote characters, and
|
// Assumptions: does not contain unescaped quote characters, and
|
||||||
// the raw content is quote terminated within a valid JSON string.
|
// the raw content is quote terminated within a valid JSON string.
|
||||||
const char * r{raw()};
|
const char * r{raw()};
|
||||||
@@ -126,29 +126,29 @@ simdjson_really_inline bool raw_json_string::is_equal(const char* target) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
|
simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
|
||||||
return a.unsafe_is_equal(c);
|
return a.unsafe_is_equal(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
|
simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
|
||||||
return a == c;
|
return a == c;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
|
simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
|
||||||
return !(a == c);
|
return !(a == c);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
|
simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
|
||||||
return !(a == c);
|
return !(a == c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter) const noexcept {
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter) const noexcept {
|
||||||
return iter.unescape(*this);
|
return iter.unescape(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
|
simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
|
||||||
bool in_escape = false;
|
bool in_escape = false;
|
||||||
const char *s = str.raw();
|
const char *s = str.raw();
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -168,16 +168,16 @@ simdjson_unused simdjson_really_inline std::ostream &operator<<(std::ostream &ou
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>(error) {}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::raw() const noexcept {
|
simdjson_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::raw() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.raw();
|
return first.raw();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::unescape(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &iter) const noexcept {
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string>::unescape(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &iter) const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.unescape(iter);
|
return first.unescape(iter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline raw_json_string() noexcept = default;
|
simdjson_inline raw_json_string() noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new invalid raw_json_string pointed at the given location in the JSON.
|
* Create a new invalid raw_json_string pointed at the given location in the JSON.
|
||||||
@@ -47,14 +47,14 @@ public:
|
|||||||
*
|
*
|
||||||
* It *must* be terminated by a ", and be a valid JSON string.
|
* It *must* be terminated by a ", and be a valid JSON string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline raw_json_string(const uint8_t * _buf) noexcept;
|
simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the raw pointer to the beginning of the string in the JSON (just after the ").
|
* Get the raw pointer to the beginning of the string in the JSON (just after the ").
|
||||||
*
|
*
|
||||||
* It is possible for this function to return a null pointer if the instance
|
* It is possible for this function to return a null pointer if the instance
|
||||||
* has outlived its existence.
|
* has outlived its existence.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const char * raw() const noexcept;
|
simdjson_inline const char * raw() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This compares the current instance to the std::string_view target: returns true if
|
* This compares the current instance to the std::string_view target: returns true if
|
||||||
@@ -70,7 +70,7 @@ public:
|
|||||||
* Performance: the comparison may be done using memcmp which may be efficient
|
* Performance: the comparison may be done using memcmp which may be efficient
|
||||||
* for long strings.
|
* for long strings.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
|
simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This compares the current instance to the std::string_view target: returns true if
|
* This compares the current instance to the std::string_view target: returns true if
|
||||||
@@ -87,7 +87,7 @@ public:
|
|||||||
* static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
|
* static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
|
||||||
* s.unsafe_is_equal(target);
|
* s.unsafe_is_equal(target);
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool unsafe_is_equal(std::string_view target) const noexcept;
|
simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This compares the current instance to the C string target: returns true if
|
* This compares the current instance to the C string target: returns true if
|
||||||
@@ -101,27 +101,27 @@ public:
|
|||||||
* static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
|
* static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
|
||||||
* s.unsafe_is_equal(target);
|
* s.unsafe_is_equal(target);
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool unsafe_is_equal(const char* target) const noexcept;
|
simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This compares the current instance to the std::string_view target: returns true if
|
* This compares the current instance to the std::string_view target: returns true if
|
||||||
* they are byte-by-byte equal (no escaping is done).
|
* they are byte-by-byte equal (no escaping is done).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_equal(std::string_view target) const noexcept;
|
simdjson_inline bool is_equal(std::string_view target) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This compares the current instance to the C string target: returns true if
|
* This compares the current instance to the C string target: returns true if
|
||||||
* they are byte-by-byte equal (no escaping is done).
|
* they are byte-by-byte equal (no escaping is done).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_equal(const char* target) const noexcept;
|
simdjson_inline bool is_equal(const char* target) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if target is free from unescaped quote. If target is known at
|
* Returns true if target is free from unescaped quote. If target is known at
|
||||||
* compile-time, we might expect the computation to happen at compile time with
|
* compile-time, we might expect the computation to happen at compile time with
|
||||||
* many compilers (not all!).
|
* many compilers (not all!).
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
|
static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
|
||||||
static simdjson_really_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
|
static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -130,12 +130,12 @@ private:
|
|||||||
* This will set the inner pointer to zero, effectively making
|
* This will set the inner pointer to zero, effectively making
|
||||||
* this instance unusable.
|
* this instance unusable.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void consume() noexcept { buf = nullptr; }
|
simdjson_inline void consume() noexcept { buf = nullptr; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the inner pointer is non-null and thus usable.
|
* Checks whether the inner pointer is non-null and thus usable.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
|
simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unescape this JSON string, replacing \\ with \, \n with newline, etc.
|
* Unescape this JSON string, replacing \\ with \, \n with newline, etc.
|
||||||
@@ -146,7 +146,7 @@ private:
|
|||||||
*
|
*
|
||||||
* @param iter A json_iterator, which contains a buffer where the string will be written.
|
* @param iter A json_iterator, which contains a buffer where the string will be written.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(json_iterator &iter) const noexcept;
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(json_iterator &iter) const noexcept;
|
||||||
|
|
||||||
const uint8_t * buf{};
|
const uint8_t * buf{};
|
||||||
friend class object;
|
friend class object;
|
||||||
@@ -155,16 +155,16 @@ private:
|
|||||||
friend struct simdjson_result<raw_json_string>;
|
friend struct simdjson_result<raw_json_string>;
|
||||||
};
|
};
|
||||||
|
|
||||||
simdjson_unused simdjson_really_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
|
simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
|
* Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
|
||||||
* for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
|
* for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
|
||||||
*/
|
*/
|
||||||
simdjson_unused simdjson_really_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
|
simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
|
||||||
simdjson_unused simdjson_really_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
|
simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
|
||||||
simdjson_unused simdjson_really_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
|
simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
|
||||||
simdjson_unused simdjson_really_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
|
simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
|
||||||
|
|
||||||
|
|
||||||
} // namespace ondemand
|
} // namespace ondemand
|
||||||
@@ -176,13 +176,13 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
simdjson_really_inline ~simdjson_result() noexcept = default; ///< @private
|
simdjson_inline ~simdjson_result() noexcept = default; ///< @private
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> raw() const noexcept;
|
simdjson_inline simdjson_result<const char *> raw() const noexcept;
|
||||||
simdjson_really_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &iter) const noexcept;
|
simdjson_inline simdjson_warn_unused simdjson_result<std::string_view> unescape(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &iter) const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,65 +2,65 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline token_iterator::token_iterator(
|
simdjson_inline token_iterator::token_iterator(
|
||||||
const uint8_t *_buf,
|
const uint8_t *_buf,
|
||||||
token_position position
|
token_position position
|
||||||
) noexcept : buf{_buf}, _position{position}
|
) noexcept : buf{_buf}, _position{position}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline uint32_t token_iterator::current_offset() const noexcept {
|
simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
|
||||||
return *(_position);
|
return *(_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
|
simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
|
||||||
return &buf[*(_position++)];
|
return &buf[*(_position++)];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
|
simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
|
||||||
return &buf[*position];
|
return &buf[*position];
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
|
simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
|
||||||
return *position;
|
return *position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
|
simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
|
||||||
return *(position+1) - *position;
|
return *(position+1) - *position;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
|
simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
|
||||||
return &buf[*(_position+delta)];
|
return &buf[*(_position+delta)];
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
|
simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
|
||||||
return *(_position+delta);
|
return *(_position+delta);
|
||||||
}
|
}
|
||||||
simdjson_really_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
|
simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
|
||||||
return *(_position+delta+1) - *(_position+delta);
|
return *(_position+delta+1) - *(_position+delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline token_position token_iterator::position() const noexcept {
|
simdjson_inline token_position token_iterator::position() const noexcept {
|
||||||
return _position;
|
return _position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline void token_iterator::set_position(token_position target_position) noexcept {
|
simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
|
||||||
_position = target_position;
|
_position = target_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
|
||||||
return _position == other._position;
|
return _position == other._position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
|
||||||
return _position != other._position;
|
return _position != other._position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
|
||||||
return _position > other._position;
|
return _position > other._position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
|
||||||
return _position >= other._position;
|
return _position >= other._position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
|
||||||
return _position < other._position;
|
return _position < other._position;
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
|
simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
|
||||||
return _position <= other._position;
|
return _position <= other._position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,9 +70,9 @@ simdjson_really_inline bool token_iterator::operator<=(const token_iterator &oth
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::token_iterator &&value) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>::simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::token_iterator &&value) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(value)) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(std::forward<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(value)) {}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>::simdjson_result(error_code error) noexcept
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>::simdjson_result(error_code error) noexcept
|
||||||
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(error) {}
|
: implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator>(error) {}
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -15,20 +15,20 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline token_iterator() noexcept = default;
|
simdjson_inline token_iterator() noexcept = default;
|
||||||
simdjson_really_inline token_iterator(token_iterator &&other) noexcept = default;
|
simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
|
||||||
simdjson_really_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
|
simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
|
||||||
simdjson_really_inline token_iterator(const token_iterator &other) noexcept = default;
|
simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
|
||||||
simdjson_really_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
|
simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advance to the next token (returning the current one).
|
* Advance to the next token (returning the current one).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *return_current_and_advance() noexcept;
|
simdjson_inline const uint8_t *return_current_and_advance() noexcept;
|
||||||
/**
|
/**
|
||||||
* Reports the current offset in bytes from the start of the underlying buffer.
|
* Reports the current offset in bytes from the start of the underlying buffer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t current_offset() const noexcept;
|
simdjson_inline uint32_t current_offset() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the JSON text for a given token (relative).
|
* Get the JSON text for a given token (relative).
|
||||||
*
|
*
|
||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
* TODO consider a string_view, assuming the length will get stripped out by the optimizer when
|
||||||
* it isn't used ...
|
* it isn't used ...
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *peek(int32_t delta=0) const noexcept;
|
simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the maximum length of the JSON text for a given token.
|
* Get the maximum length of the JSON text for a given token.
|
||||||
*
|
*
|
||||||
@@ -49,7 +49,7 @@ public:
|
|||||||
* @param delta The relative position of the token to retrieve. e.g. 0 = current token,
|
* @param delta The relative position of the token to retrieve. e.g. 0 = current token,
|
||||||
* 1 = next token, -1 = prev token.
|
* 1 = next token, -1 = prev token.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_length(int32_t delta=0) const noexcept;
|
simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the JSON text for a given token.
|
* Get the JSON text for a given token.
|
||||||
@@ -59,7 +59,7 @@ public:
|
|||||||
* @param position The position of the token.
|
* @param position The position of the token.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline const uint8_t *peek(token_position position) const noexcept;
|
simdjson_inline const uint8_t *peek(token_position position) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the maximum length of the JSON text for a given token.
|
* Get the maximum length of the JSON text for a given token.
|
||||||
*
|
*
|
||||||
@@ -67,29 +67,29 @@ public:
|
|||||||
*
|
*
|
||||||
* @param position The position of the token.
|
* @param position The position of the token.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_length(token_position position) const noexcept;
|
simdjson_inline uint32_t peek_length(token_position position) const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the current index.
|
* Return the current index.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline token_position position() const noexcept;
|
simdjson_inline token_position position() const noexcept;
|
||||||
/**
|
/**
|
||||||
* Reset to a previously saved index.
|
* Reset to a previously saved index.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void set_position(token_position target_position) noexcept;
|
simdjson_inline void set_position(token_position target_position) noexcept;
|
||||||
|
|
||||||
// NOTE: we don't support a full C++ iterator interface, because we expect people to make
|
// NOTE: we don't support a full C++ iterator interface, because we expect people to make
|
||||||
// different calls to advance the iterator based on *their own* state.
|
// different calls to advance the iterator based on *their own* state.
|
||||||
|
|
||||||
simdjson_really_inline bool operator==(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator==(const token_iterator &other) const noexcept;
|
||||||
simdjson_really_inline bool operator!=(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
|
||||||
simdjson_really_inline bool operator>(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator>(const token_iterator &other) const noexcept;
|
||||||
simdjson_really_inline bool operator>=(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
|
||||||
simdjson_really_inline bool operator<(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator<(const token_iterator &other) const noexcept;
|
||||||
simdjson_really_inline bool operator<=(const token_iterator &other) const noexcept;
|
simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
simdjson_really_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
|
simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the index of the JSON text for a given token (relative).
|
* Get the index of the JSON text for a given token (relative).
|
||||||
@@ -99,7 +99,7 @@ protected:
|
|||||||
* @param delta The relative position of the token to retrieve. e.g. 0 = current token,
|
* @param delta The relative position of the token to retrieve. e.g. 0 = current token,
|
||||||
* 1 = next token, -1 = prev token.
|
* 1 = next token, -1 = prev token.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_index(int32_t delta=0) const noexcept;
|
simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the index of the JSON text for a given token.
|
* Get the index of the JSON text for a given token.
|
||||||
*
|
*
|
||||||
@@ -108,7 +108,7 @@ protected:
|
|||||||
* @param position The position of the token.
|
* @param position The position of the token.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline uint32_t peek_index(token_position position) const noexcept;
|
simdjson_inline uint32_t peek_index(token_position position) const noexcept;
|
||||||
|
|
||||||
const uint8_t *buf{};
|
const uint8_t *buf{};
|
||||||
token_position _position{};
|
token_position _position{};
|
||||||
@@ -116,8 +116,8 @@ protected:
|
|||||||
friend class json_iterator;
|
friend class json_iterator;
|
||||||
friend class value_iterator;
|
friend class value_iterator;
|
||||||
friend class object;
|
friend class object;
|
||||||
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
|
friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
|
||||||
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail) noexcept;
|
friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ondemand
|
} // namespace ondemand
|
||||||
@@ -129,10 +129,10 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::token_iterator> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::token_iterator &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::token_iterator &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
simdjson_really_inline ~simdjson_result() noexcept = default; ///< @private
|
simdjson_inline ~simdjson_result() noexcept = default; ///< @private
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
@@ -2,24 +2,24 @@ namespace simdjson {
|
|||||||
namespace SIMDJSON_IMPLEMENTATION {
|
namespace SIMDJSON_IMPLEMENTATION {
|
||||||
namespace ondemand {
|
namespace ondemand {
|
||||||
|
|
||||||
simdjson_really_inline value::value(const value_iterator &_iter) noexcept
|
simdjson_inline value::value(const value_iterator &_iter) noexcept
|
||||||
: iter{_iter}
|
: iter{_iter}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline value value::start(const value_iterator &iter) noexcept {
|
simdjson_inline value value::start(const value_iterator &iter) noexcept {
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
simdjson_really_inline value value::resume(const value_iterator &iter) noexcept {
|
simdjson_inline value value::resume(const value_iterator &iter) noexcept {
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<array> value::get_array() noexcept {
|
simdjson_inline simdjson_result<array> value::get_array() noexcept {
|
||||||
return array::start(iter);
|
return array::start(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object> value::get_object() noexcept {
|
simdjson_inline simdjson_result<object> value::get_object() noexcept {
|
||||||
return object::start(iter);
|
return object::start(iter);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<object> value::start_or_resume_object() noexcept {
|
simdjson_inline simdjson_result<object> value::start_or_resume_object() noexcept {
|
||||||
if (iter.at_start()) {
|
if (iter.at_start()) {
|
||||||
return get_object();
|
return get_object();
|
||||||
} else {
|
} else {
|
||||||
@@ -27,85 +27,85 @@ simdjson_really_inline simdjson_result<object> value::start_or_resume_object() n
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> value::get_raw_json_string() noexcept {
|
simdjson_inline simdjson_result<raw_json_string> value::get_raw_json_string() noexcept {
|
||||||
return iter.get_raw_json_string();
|
return iter.get_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> value::get_string() noexcept {
|
simdjson_inline simdjson_result<std::string_view> value::get_string() noexcept {
|
||||||
return iter.get_string();
|
return iter.get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> value::get_double() noexcept {
|
simdjson_inline simdjson_result<double> value::get_double() noexcept {
|
||||||
return iter.get_double();
|
return iter.get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> value::get_double_in_string() noexcept {
|
simdjson_inline simdjson_result<double> value::get_double_in_string() noexcept {
|
||||||
return iter.get_double_in_string();
|
return iter.get_double_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64() noexcept {
|
simdjson_inline simdjson_result<uint64_t> value::get_uint64() noexcept {
|
||||||
return iter.get_uint64();
|
return iter.get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> value::get_uint64_in_string() noexcept {
|
simdjson_inline simdjson_result<uint64_t> value::get_uint64_in_string() noexcept {
|
||||||
return iter.get_uint64_in_string();
|
return iter.get_uint64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> value::get_int64() noexcept {
|
simdjson_inline simdjson_result<int64_t> value::get_int64() noexcept {
|
||||||
return iter.get_int64();
|
return iter.get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> value::get_int64_in_string() noexcept {
|
simdjson_inline simdjson_result<int64_t> value::get_int64_in_string() noexcept {
|
||||||
return iter.get_int64_in_string();
|
return iter.get_int64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> value::get_bool() noexcept {
|
simdjson_inline simdjson_result<bool> value::get_bool() noexcept {
|
||||||
return iter.get_bool();
|
return iter.get_bool();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool value::is_null() noexcept {
|
simdjson_inline bool value::is_null() noexcept {
|
||||||
return iter.is_null();
|
return iter.is_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> simdjson_really_inline simdjson_result<array> value::get() noexcept { return get_array(); }
|
template<> simdjson_inline simdjson_result<array> value::get() noexcept { return get_array(); }
|
||||||
template<> simdjson_really_inline simdjson_result<object> value::get() noexcept { return get_object(); }
|
template<> simdjson_inline simdjson_result<object> value::get() noexcept { return get_object(); }
|
||||||
template<> simdjson_really_inline simdjson_result<raw_json_string> value::get() noexcept { return get_raw_json_string(); }
|
template<> simdjson_inline simdjson_result<raw_json_string> value::get() noexcept { return get_raw_json_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<std::string_view> value::get() noexcept { return get_string(); }
|
template<> simdjson_inline simdjson_result<std::string_view> value::get() noexcept { return get_string(); }
|
||||||
template<> simdjson_really_inline simdjson_result<number> value::get() noexcept { return get_number(); }
|
template<> simdjson_inline simdjson_result<number> value::get() noexcept { return get_number(); }
|
||||||
template<> simdjson_really_inline simdjson_result<double> value::get() noexcept { return get_double(); }
|
template<> simdjson_inline simdjson_result<double> value::get() noexcept { return get_double(); }
|
||||||
template<> simdjson_really_inline simdjson_result<uint64_t> value::get() noexcept { return get_uint64(); }
|
template<> simdjson_inline simdjson_result<uint64_t> value::get() noexcept { return get_uint64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<int64_t> value::get() noexcept { return get_int64(); }
|
template<> simdjson_inline simdjson_result<int64_t> value::get() noexcept { return get_int64(); }
|
||||||
template<> simdjson_really_inline simdjson_result<bool> value::get() noexcept { return get_bool(); }
|
template<> simdjson_inline simdjson_result<bool> value::get() noexcept { return get_bool(); }
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline error_code value::get(T &out) noexcept {
|
template<typename T> simdjson_inline error_code value::get(T &out) noexcept {
|
||||||
return get<T>().get(out);
|
return get<T>().get(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline value::operator array() noexcept(false) {
|
simdjson_inline value::operator array() noexcept(false) {
|
||||||
return get_array();
|
return get_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator object() noexcept(false) {
|
simdjson_inline value::operator object() noexcept(false) {
|
||||||
return get_object();
|
return get_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator uint64_t() noexcept(false) {
|
simdjson_inline value::operator uint64_t() noexcept(false) {
|
||||||
return get_uint64();
|
return get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator int64_t() noexcept(false) {
|
simdjson_inline value::operator int64_t() noexcept(false) {
|
||||||
return get_int64();
|
return get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator double() noexcept(false) {
|
simdjson_inline value::operator double() noexcept(false) {
|
||||||
return get_double();
|
return get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator std::string_view() noexcept(false) {
|
simdjson_inline value::operator std::string_view() noexcept(false) {
|
||||||
return get_string();
|
return get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator raw_json_string() noexcept(false) {
|
simdjson_inline value::operator raw_json_string() noexcept(false) {
|
||||||
return get_raw_json_string();
|
return get_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline value::operator bool() noexcept(false) {
|
simdjson_inline value::operator bool() noexcept(false) {
|
||||||
return get_bool();
|
return get_bool();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<array_iterator> value::begin() & noexcept {
|
simdjson_inline simdjson_result<array_iterator> value::begin() & noexcept {
|
||||||
return get_array().begin();
|
return get_array().begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<array_iterator> value::end() & noexcept {
|
simdjson_inline simdjson_result<array_iterator> value::end() & noexcept {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> value::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> value::count_elements() & noexcept {
|
||||||
simdjson_result<size_t> answer;
|
simdjson_result<size_t> answer;
|
||||||
auto a = get_array();
|
auto a = get_array();
|
||||||
answer = a.count_elements();
|
answer = a.count_elements();
|
||||||
@@ -115,77 +115,77 @@ simdjson_really_inline simdjson_result<size_t> value::count_elements() & noexcep
|
|||||||
iter.move_at_start();
|
iter.move_at_start();
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> value::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> value::count_fields() & noexcept {
|
||||||
simdjson_result<size_t> answer;
|
simdjson_result<size_t> answer;
|
||||||
auto a = get_object();
|
auto a = get_object();
|
||||||
answer = a.count_fields();
|
answer = a.count_fields();
|
||||||
iter.move_at_start();
|
iter.move_at_start();
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> value::at(size_t index) noexcept {
|
simdjson_inline simdjson_result<value> value::at(size_t index) noexcept {
|
||||||
auto a = get_array();
|
auto a = get_array();
|
||||||
return a.at(index);
|
return a.at(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> value::find_field(std::string_view key) noexcept {
|
simdjson_inline simdjson_result<value> value::find_field(std::string_view key) noexcept {
|
||||||
return start_or_resume_object().find_field(key);
|
return start_or_resume_object().find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> value::find_field(const char *key) noexcept {
|
simdjson_inline simdjson_result<value> value::find_field(const char *key) noexcept {
|
||||||
return start_or_resume_object().find_field(key);
|
return start_or_resume_object().find_field(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> value::find_field_unordered(std::string_view key) noexcept {
|
simdjson_inline simdjson_result<value> value::find_field_unordered(std::string_view key) noexcept {
|
||||||
return start_or_resume_object().find_field_unordered(key);
|
return start_or_resume_object().find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> value::find_field_unordered(const char *key) noexcept {
|
simdjson_inline simdjson_result<value> value::find_field_unordered(const char *key) noexcept {
|
||||||
return start_or_resume_object().find_field_unordered(key);
|
return start_or_resume_object().find_field_unordered(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> value::operator[](std::string_view key) noexcept {
|
simdjson_inline simdjson_result<value> value::operator[](std::string_view key) noexcept {
|
||||||
return start_or_resume_object()[key];
|
return start_or_resume_object()[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<value> value::operator[](const char *key) noexcept {
|
simdjson_inline simdjson_result<value> value::operator[](const char *key) noexcept {
|
||||||
return start_or_resume_object()[key];
|
return start_or_resume_object()[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<json_type> value::type() noexcept {
|
simdjson_inline simdjson_result<json_type> value::type() noexcept {
|
||||||
return iter.type();
|
return iter.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> value::is_scalar() noexcept {
|
simdjson_inline simdjson_result<bool> value::is_scalar() noexcept {
|
||||||
json_type this_type;
|
json_type this_type;
|
||||||
auto error = type().get(this_type);
|
auto error = type().get(this_type);
|
||||||
if(error) { return error; }
|
if(error) { return error; }
|
||||||
return ! ((this_type == json_type::array) || (this_type == json_type::object));
|
return ! ((this_type == json_type::array) || (this_type == json_type::object));
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline bool value::is_negative() noexcept {
|
simdjson_inline bool value::is_negative() noexcept {
|
||||||
return iter.is_negative();
|
return iter.is_negative();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<bool> value::is_integer() noexcept {
|
simdjson_inline simdjson_result<bool> value::is_integer() noexcept {
|
||||||
return iter.is_integer();
|
return iter.is_integer();
|
||||||
}
|
}
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<number_type> value::get_number_type() noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<number_type> value::get_number_type() noexcept {
|
||||||
return iter.get_number_type();
|
return iter.get_number_type();
|
||||||
}
|
}
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<number> value::get_number() noexcept {
|
simdjson_warn_unused simdjson_inline simdjson_result<number> value::get_number() noexcept {
|
||||||
return iter.get_number();
|
return iter.get_number();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline std::string_view value::raw_json_token() noexcept {
|
simdjson_inline std::string_view value::raw_json_token() noexcept {
|
||||||
return std::string_view(reinterpret_cast<const char*>(iter.peek_start()), iter.peek_start_length());
|
return std::string_view(reinterpret_cast<const char*>(iter.peek_start()), iter.peek_start_length());
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> value::current_location() noexcept {
|
simdjson_inline simdjson_result<const char *> value::current_location() noexcept {
|
||||||
return iter.json_iter().current_location();
|
return iter.json_iter().current_location();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline int32_t value::current_depth() const noexcept{
|
simdjson_inline int32_t value::current_depth() const noexcept{
|
||||||
return iter.json_iter().depth();
|
return iter.json_iter().depth();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<value> value::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<value> value::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
json_type t;
|
json_type t;
|
||||||
SIMDJSON_TRY(type().get(t));
|
SIMDJSON_TRY(type().get(t));
|
||||||
switch (t)
|
switch (t)
|
||||||
@@ -205,7 +205,7 @@ simdjson_really_inline simdjson_result<value> value::at_pointer(std::string_view
|
|||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson {
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::simdjson_result(
|
||||||
SIMDJSON_IMPLEMENTATION::ondemand::value &&value
|
SIMDJSON_IMPLEMENTATION::ondemand::value &&value
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value>(
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value>(
|
||||||
@@ -213,203 +213,203 @@ simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::simdjson_result(
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::simdjson_result(
|
||||||
error_code error
|
error_code error
|
||||||
) noexcept :
|
) noexcept :
|
||||||
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value>(error)
|
implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value>(error)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::count_elements() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::count_elements() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_elements();
|
return first.count_elements();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::count_fields() & noexcept {
|
simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::count_fields() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.count_fields();
|
return first.count_fields();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::at(size_t index) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::at(size_t index) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at(index);
|
return first.at(index);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::begin() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::begin() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.begin();
|
return first.begin();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::end() & noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::end() & noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field(std::string_view key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field(std::string_view key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field(const char *key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field(const char *key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field(key);
|
return first.find_field(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field_unordered(std::string_view key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field_unordered(std::string_view key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field_unordered(const char *key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::find_field_unordered(const char *key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.find_field_unordered(key);
|
return first.find_field_unordered(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](std::string_view key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](std::string_view key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator[](const char *key) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first[key];
|
return first[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_array() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_array();
|
return first.get_array();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_object() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_object();
|
return first.get_object();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() noexcept {
|
simdjson_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_uint64();
|
return first.get_uint64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64_in_string() noexcept {
|
simdjson_inline simdjson_result<uint64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_uint64_in_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_uint64_in_string();
|
return first.get_uint64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() noexcept {
|
simdjson_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_int64();
|
return first.get_int64();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64_in_string() noexcept {
|
simdjson_inline simdjson_result<int64_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_int64_in_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_int64_in_string();
|
return first.get_int64_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() noexcept {
|
simdjson_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_double();
|
return first.get_double();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double_in_string() noexcept {
|
simdjson_inline simdjson_result<double> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_double_in_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_double_in_string();
|
return first.get_double_in_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_string();
|
return first.get_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_raw_json_string() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_raw_json_string();
|
return first.get_raw_json_string();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_bool() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_bool();
|
return first.get_bool();
|
||||||
}
|
}
|
||||||
simdjson_really_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() noexcept {
|
simdjson_inline bool simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_null() noexcept {
|
||||||
if (error()) { return false; }
|
if (error()) { return false; }
|
||||||
return first.is_null();
|
return first.is_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get() noexcept {
|
template<typename T> simdjson_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>();
|
return first.get<T>();
|
||||||
}
|
}
|
||||||
template<typename T> simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get(T &out) noexcept {
|
template<typename T> simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get(T &out) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get<T>(out);
|
return first.get<T>(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get<SIMDJSON_IMPLEMENTATION::ondemand::value>() noexcept {
|
template<> simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get<SIMDJSON_IMPLEMENTATION::ondemand::value>() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return std::move(first);
|
return std::move(first);
|
||||||
}
|
}
|
||||||
template<> simdjson_really_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get<SIMDJSON_IMPLEMENTATION::ondemand::value>(SIMDJSON_IMPLEMENTATION::ondemand::value &out) noexcept {
|
template<> simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get<SIMDJSON_IMPLEMENTATION::ondemand::value>(SIMDJSON_IMPLEMENTATION::ondemand::value &out) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
out = first;
|
out = first;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.type();
|
return first.type();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_scalar() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_scalar() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_scalar();
|
return first.is_scalar();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_negative() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_negative() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_negative();
|
return first.is_negative();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_integer() noexcept {
|
simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::is_integer() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.is_integer();
|
return first.is_integer();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_number_type() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_number_type() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number_type();
|
return first.get_number_type();
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_number() noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::get_number() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.get_number();
|
return first.get_number();
|
||||||
}
|
}
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator uint64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator int64_t() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator double() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator std::string_view() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() noexcept(false) {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::operator bool() noexcept(false) {
|
||||||
if (error()) { throw simdjson_error(error()); }
|
if (error()) { throw simdjson_error(error()); }
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::raw_json_token() noexcept {
|
simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::raw_json_token() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.raw_json_token();
|
return first.raw_json_token();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::current_location() noexcept {
|
simdjson_inline simdjson_result<const char *> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::current_location() noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.current_location();
|
return first.current_location();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline int32_t simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::current_depth() const noexcept {
|
simdjson_inline int32_t simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::current_depth() const noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.current_depth();
|
return first.current_depth();
|
||||||
}
|
}
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::at_pointer(std::string_view json_pointer) noexcept {
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value>::at_pointer(std::string_view json_pointer) noexcept {
|
||||||
if (error()) { return error(); }
|
if (error()) { return error(); }
|
||||||
return first.at_pointer(json_pointer);
|
return first.at_pointer(json_pointer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ class object;
|
|||||||
class raw_json_string;
|
class raw_json_string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An ephemeral JSON value returned during iteration.
|
* An ephemeral JSON value returned during iteration. It is only valid for as long as you do
|
||||||
|
* not access more data in the JSON document.
|
||||||
*/
|
*/
|
||||||
class value {
|
class value {
|
||||||
public:
|
public:
|
||||||
@@ -20,7 +21,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Exists so you can declare a variable and later assign to it before use.
|
* Exists so you can declare a variable and later assign to it before use.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline value() noexcept = default;
|
simdjson_inline value() noexcept = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get this value as the given type.
|
* Get this value as the given type.
|
||||||
@@ -33,7 +34,7 @@ public:
|
|||||||
* @returns A value of the given type, parsed from the JSON.
|
* @returns A value of the given type, parsed from the JSON.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not the given type.
|
* @returns INCORRECT_TYPE If the JSON value is not the given type.
|
||||||
*/
|
*/
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() noexcept {
|
template<typename T> simdjson_inline simdjson_result<T> get() noexcept {
|
||||||
// Unless the simdjson library provides an inline implementation, calling this method should
|
// Unless the simdjson library provides an inline implementation, calling this method should
|
||||||
// immediately fail.
|
// immediately fail.
|
||||||
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library.");
|
||||||
@@ -48,7 +49,7 @@ public:
|
|||||||
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
||||||
* @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
|
* @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
|
||||||
*/
|
*/
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an array.
|
* Cast this JSON value to an array.
|
||||||
@@ -56,7 +57,7 @@ public:
|
|||||||
* @returns An object that can be used to iterate the array.
|
* @returns An object that can be used to iterate the array.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array> get_array() noexcept;
|
simdjson_inline simdjson_result<array> get_array() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an object.
|
* Cast this JSON value to an object.
|
||||||
@@ -64,7 +65,7 @@ public:
|
|||||||
* @returns An object that can be used to look up or iterate fields.
|
* @returns An object that can be used to look up or iterate fields.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
* @returns INCORRECT_TYPE If the JSON value is not an object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<object> get_object() noexcept;
|
simdjson_inline simdjson_result<object> get_object() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an unsigned integer.
|
* Cast this JSON value to an unsigned integer.
|
||||||
@@ -72,7 +73,7 @@ public:
|
|||||||
* @returns A unsigned 64-bit integer.
|
* @returns A unsigned 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to a unsigned integer.
|
* Cast this JSON value (inside string) to a unsigned integer.
|
||||||
@@ -80,7 +81,7 @@ public:
|
|||||||
* @returns A unsigned 64-bit integer.
|
* @returns A unsigned 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a signed integer.
|
* Cast this JSON value to a signed integer.
|
||||||
@@ -88,7 +89,7 @@ public:
|
|||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to a signed integer.
|
* Cast this JSON value (inside string) to a signed integer.
|
||||||
@@ -96,7 +97,7 @@ public:
|
|||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
* @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a double.
|
* Cast this JSON value to a double.
|
||||||
@@ -104,7 +105,7 @@ public:
|
|||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value (inside string) to a double
|
* Cast this JSON value (inside string) to a double
|
||||||
@@ -112,7 +113,7 @@ public:
|
|||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
* @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<double> get_double_in_string() noexcept;
|
simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a string.
|
* Cast this JSON value to a string.
|
||||||
@@ -128,7 +129,7 @@ public:
|
|||||||
* time it parses a document or when it is destroyed.
|
* time it parses a document or when it is destroyed.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a raw_json_string.
|
* Cast this JSON value to a raw_json_string.
|
||||||
@@ -138,7 +139,7 @@ public:
|
|||||||
* @returns A pointer to the raw JSON for the given string.
|
* @returns A pointer to the raw JSON for the given string.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
* @returns INCORRECT_TYPE if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a bool.
|
* Cast this JSON value to a bool.
|
||||||
@@ -146,14 +147,14 @@ public:
|
|||||||
* @returns A bool value.
|
* @returns A bool value.
|
||||||
* @returns INCORRECT_TYPE if the JSON value is not true or false.
|
* @returns INCORRECT_TYPE if the JSON value is not true or false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this JSON value is null.
|
* Checks if this JSON value is null.
|
||||||
*
|
*
|
||||||
* @returns Whether the value is null.
|
* @returns Whether the value is null.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
/**
|
/**
|
||||||
@@ -162,35 +163,35 @@ public:
|
|||||||
* @returns An object that can be used to iterate the array.
|
* @returns An object that can be used to iterate the array.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator array() noexcept(false);
|
simdjson_inline operator array() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an object.
|
* Cast this JSON value to an object.
|
||||||
*
|
*
|
||||||
* @returns An object that can be used to look up or iterate fields.
|
* @returns An object that can be used to look up or iterate fields.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator object() noexcept(false);
|
simdjson_inline operator object() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to an unsigned integer.
|
* Cast this JSON value to an unsigned integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a signed integer.
|
* Cast this JSON value to a signed integer.
|
||||||
*
|
*
|
||||||
* @returns A signed 64-bit integer.
|
* @returns A signed 64-bit integer.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a double.
|
* Cast this JSON value to a double.
|
||||||
*
|
*
|
||||||
* @returns A double.
|
* @returns A double.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
|
* @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a string.
|
* Cast this JSON value to a string.
|
||||||
*
|
*
|
||||||
@@ -202,7 +203,7 @@ public:
|
|||||||
* time it parses a document or when it is destroyed.
|
* time it parses a document or when it is destroyed.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a raw_json_string.
|
* Cast this JSON value to a raw_json_string.
|
||||||
*
|
*
|
||||||
@@ -211,14 +212,14 @@ public:
|
|||||||
* @returns A pointer to the raw JSON for the given string.
|
* @returns A pointer to the raw JSON for the given string.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator raw_json_string() noexcept(false);
|
simdjson_inline operator raw_json_string() noexcept(false);
|
||||||
/**
|
/**
|
||||||
* Cast this JSON value to a bool.
|
* Cast this JSON value to a bool.
|
||||||
*
|
*
|
||||||
* @returns A bool value.
|
* @returns A bool value.
|
||||||
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
|
* @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -228,13 +229,13 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
* @returns INCORRECT_TYPE If the JSON value is not an array.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> begin() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Sentinel representing the end of the array.
|
* Sentinel representing the end of the array.
|
||||||
*
|
*
|
||||||
* Part of the std::iterable interface.
|
* Part of the std::iterable interface.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<array_iterator> end() & noexcept;
|
||||||
/**
|
/**
|
||||||
* This method scans the array and counts the number of elements.
|
* This method scans the array and counts the number of elements.
|
||||||
* The count_elements method should always be called before you have begun
|
* The count_elements method should always be called before you have begun
|
||||||
@@ -246,7 +247,7 @@ public:
|
|||||||
* there is a missing comma), then an error is returned and it is no longer
|
* there is a missing comma), then an error is returned and it is no longer
|
||||||
* safe to continue.
|
* safe to continue.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
/**
|
/**
|
||||||
* This method scans the object and counts the number of key-value pairs.
|
* This method scans the object and counts the number of key-value pairs.
|
||||||
* The count_fields method should always be called before you have begun
|
* The count_fields method should always be called before you have begun
|
||||||
@@ -261,7 +262,7 @@ public:
|
|||||||
* To check that an object is empty, it is more performant to use
|
* To check that an object is empty, it is more performant to use
|
||||||
* the is_empty() method on the object instance.
|
* the is_empty() method on the object instance.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
/**
|
/**
|
||||||
* Get the value at the given index in the array. This function has linear-time complexity.
|
* Get the value at the given index in the array. This function has linear-time complexity.
|
||||||
* This function should only be called once on an array instance since the array iterator is not reset between each call.
|
* This function should only be called once on an array instance since the array iterator is not reset between each call.
|
||||||
@@ -269,7 +270,7 @@ public:
|
|||||||
* @return The value at the given index, or:
|
* @return The value at the given index, or:
|
||||||
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
* - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> at(size_t index) noexcept;
|
simdjson_inline simdjson_result<value> at(size_t index) noexcept;
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object (order-sensitive).
|
* Look up a field by name on an object (order-sensitive).
|
||||||
*
|
*
|
||||||
@@ -292,9 +293,9 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field(std::string_view key) noexcept;
|
simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field(const char *key) noexcept;
|
simdjson_inline simdjson_result<value> find_field(const char *key) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object, without regard to key order.
|
* Look up a field by name on an object, without regard to key order.
|
||||||
@@ -318,13 +319,13 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> find_field_unordered(const char *key) noexcept;
|
simdjson_inline simdjson_result<value> find_field_unordered(const char *key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](std::string_view key) noexcept;
|
simdjson_inline simdjson_result<value> operator[](std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<value> operator[](const char *key) noexcept;
|
simdjson_inline simdjson_result<value> operator[](const char *key) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of this JSON value.
|
* Get the type of this JSON value.
|
||||||
@@ -337,7 +338,7 @@ public:
|
|||||||
* json_type::number, json_type::boolean, or json_type::null).
|
* json_type::number, json_type::boolean, or json_type::null).
|
||||||
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<json_type> type() noexcept;
|
simdjson_inline simdjson_result<json_type> type() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the value is a scalar (string, number, null, Boolean).
|
* Checks whether the value is a scalar (string, number, null, Boolean).
|
||||||
@@ -346,14 +347,14 @@ public:
|
|||||||
* @returns true if the type is string, number, null, Boolean
|
* @returns true if the type is string, number, null, Boolean
|
||||||
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
* @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the value is a negative number.
|
* Checks whether the value is a negative number.
|
||||||
*
|
*
|
||||||
* @returns true if the number if negative.
|
* @returns true if the number if negative.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline bool is_negative() noexcept;
|
simdjson_inline bool is_negative() noexcept;
|
||||||
/**
|
/**
|
||||||
* Checks whether the value is an integer number. Note that
|
* Checks whether the value is an integer number. Note that
|
||||||
* this requires to partially parse the number string. If
|
* this requires to partially parse the number string. If
|
||||||
@@ -367,7 +368,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns true if the number if negative.
|
* @returns true if the number if negative.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
/**
|
/**
|
||||||
* Determine the number type (integer or floating-point number) as quickly
|
* Determine the number type (integer or floating-point number) as quickly
|
||||||
* as possible. This function does not fully validate the input. It is
|
* as possible. This function does not fully validate the input. It is
|
||||||
@@ -390,7 +391,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns the type of the number
|
* @returns the type of the number
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to parse an ondemand::number. An ondemand::number may
|
* Attempt to parse an ondemand::number. An ondemand::number may
|
||||||
@@ -422,7 +423,7 @@ public:
|
|||||||
* calling 'get_number()', you scan the number string only once, determining
|
* calling 'get_number()', you scan the number string only once, determining
|
||||||
* efficiently the type and storing it in an efficient manner.
|
* efficiently the type and storing it in an efficient manner.
|
||||||
*/
|
*/
|
||||||
simdjson_warn_unused simdjson_really_inline simdjson_result<number> get_number() noexcept;
|
simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -448,12 +449,12 @@ public:
|
|||||||
* - false
|
* - false
|
||||||
* - null
|
* - null
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline std::string_view raw_json_token() noexcept;
|
simdjson_inline std::string_view raw_json_token() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current location in the document if in bounds.
|
* Returns the current location in the document if in bounds.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<const char *> current_location() noexcept;
|
simdjson_inline simdjson_result<const char *> current_location() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current depth in the document if in bounds.
|
* Returns the current depth in the document if in bounds.
|
||||||
@@ -464,7 +465,7 @@ public:
|
|||||||
* 2 = , or } inside root array/object
|
* 2 = , or } inside root array/object
|
||||||
* 3 = key or value inside root array/object.
|
* 3 = key or value inside root array/object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
* Get the value associated with the given JSON pointer. We use the RFC 6901
|
||||||
@@ -508,38 +509,38 @@ public:
|
|||||||
* - INCORRECT_TYPE if a non-integer is used to access an array
|
* - INCORRECT_TYPE if a non-integer is used to access an array
|
||||||
* - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
|
* - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Create a value.
|
* Create a value.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline value(const value_iterator &iter) noexcept;
|
simdjson_inline value(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Skip this value, allowing iteration to continue.
|
* Skip this value, allowing iteration to continue.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline void skip() noexcept;
|
simdjson_inline void skip() noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a value at the current position.
|
* Start a value at the current position.
|
||||||
*
|
*
|
||||||
* (It should already be started; this is just a self-documentation method.)
|
* (It should already be started; this is just a self-documentation method.)
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline value start(const value_iterator &iter) noexcept;
|
static simdjson_inline value start(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resume a value.
|
* Resume a value.
|
||||||
*/
|
*/
|
||||||
static simdjson_really_inline value resume(const value_iterator &iter) noexcept;
|
static simdjson_inline value resume(const value_iterator &iter) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the object, starting or resuming it as necessary
|
* Get the object, starting or resuming it as necessary
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<object> start_or_resume_object() noexcept;
|
simdjson_inline simdjson_result<object> start_or_resume_object() noexcept;
|
||||||
|
|
||||||
// simdjson_really_inline void log_value(const char *type) const noexcept;
|
// simdjson_inline void log_value(const char *type) const noexcept;
|
||||||
// simdjson_really_inline void log_error(const char *message) const noexcept;
|
// simdjson_inline void log_error(const char *message) const noexcept;
|
||||||
|
|
||||||
value_iterator iter{};
|
value_iterator iter{};
|
||||||
|
|
||||||
@@ -560,43 +561,43 @@ namespace simdjson {
|
|||||||
template<>
|
template<>
|
||||||
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value> {
|
struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value> {
|
||||||
public:
|
public:
|
||||||
simdjson_really_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value &&value) noexcept; ///< @private
|
simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value &&value) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result(error_code error) noexcept; ///< @private
|
simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
|
||||||
simdjson_really_inline simdjson_result() noexcept = default;
|
simdjson_inline simdjson_result() noexcept = default;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() noexcept;
|
||||||
|
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
|
||||||
simdjson_really_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double() noexcept;
|
simdjson_inline simdjson_result<double> get_double() noexcept;
|
||||||
simdjson_really_inline simdjson_result<double> get_double_in_string() noexcept;
|
simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<std::string_view> get_string() noexcept;
|
simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> get_bool() noexcept;
|
simdjson_inline simdjson_result<bool> get_bool() noexcept;
|
||||||
simdjson_really_inline bool is_null() noexcept;
|
simdjson_inline bool is_null() noexcept;
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline simdjson_result<T> get() noexcept;
|
template<typename T> simdjson_inline simdjson_result<T> get() noexcept;
|
||||||
|
|
||||||
template<typename T> simdjson_really_inline error_code get(T &out) noexcept;
|
template<typename T> simdjson_inline error_code get(T &out) noexcept;
|
||||||
|
|
||||||
#if SIMDJSON_EXCEPTIONS
|
#if SIMDJSON_EXCEPTIONS
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false);
|
||||||
simdjson_really_inline operator uint64_t() noexcept(false);
|
simdjson_inline operator uint64_t() noexcept(false);
|
||||||
simdjson_really_inline operator int64_t() noexcept(false);
|
simdjson_inline operator int64_t() noexcept(false);
|
||||||
simdjson_really_inline operator double() noexcept(false);
|
simdjson_inline operator double() noexcept(false);
|
||||||
simdjson_really_inline operator std::string_view() noexcept(false);
|
simdjson_inline operator std::string_view() noexcept(false);
|
||||||
simdjson_really_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
|
||||||
simdjson_really_inline operator bool() noexcept(false);
|
simdjson_inline operator bool() noexcept(false);
|
||||||
#endif
|
#endif
|
||||||
simdjson_really_inline simdjson_result<size_t> count_elements() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<size_t> count_fields() & noexcept;
|
simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() & noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() & noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object (order-sensitive).
|
* Look up a field by name on an object (order-sensitive).
|
||||||
@@ -618,9 +619,9 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look up a field by name on an object, without regard to key order.
|
* Look up a field by name on an object, without regard to key order.
|
||||||
@@ -641,13 +642,13 @@ public:
|
|||||||
* @param key The key to look up.
|
* @param key The key to look up.
|
||||||
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
* @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) noexcept;
|
||||||
/** @overload simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
/** @overload simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept; */
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of this JSON value.
|
* Get the type of this JSON value.
|
||||||
@@ -656,21 +657,21 @@ public:
|
|||||||
* better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
|
* better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
|
||||||
* let it throw an exception).
|
* let it throw an exception).
|
||||||
*/
|
*/
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_scalar() noexcept;
|
simdjson_inline simdjson_result<bool> is_scalar() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_negative() noexcept;
|
simdjson_inline simdjson_result<bool> is_negative() noexcept;
|
||||||
simdjson_really_inline simdjson_result<bool> is_integer() noexcept;
|
simdjson_inline simdjson_result<bool> is_integer() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number_type> get_number_type() noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
|
||||||
|
|
||||||
/** @copydoc simdjson_really_inline std::string_view value::raw_json_token() const noexcept */
|
/** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
|
||||||
simdjson_really_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
|
||||||
|
|
||||||
/** @copydoc simdjson_really_inline simdjson_result<const char *> current_location() noexcept */
|
/** @copydoc simdjson_inline simdjson_result<const char *> current_location() noexcept */
|
||||||
simdjson_really_inline simdjson_result<const char *> current_location() noexcept;
|
simdjson_inline simdjson_result<const char *> current_location() noexcept;
|
||||||
/** @copydoc simdjson_really_inline int32_t current_depth() const noexcept */
|
/** @copydoc simdjson_inline int32_t current_depth() const noexcept */
|
||||||
simdjson_really_inline int32_t current_depth() const noexcept;
|
simdjson_inline int32_t current_depth() const noexcept;
|
||||||
simdjson_really_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace simdjson
|
} // namespace simdjson
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user