Compare commits

..

24 Commits

Author SHA1 Message Date
Daniel Lemire 677674d54a update 2024-09-20 20:40:23 -04:00
Daniel Lemire 949bc5142c adding benchmark to extractor 2024-09-20 20:32:47 -04:00
M. Bahoosh b4d72ff70a explicitly ignoring to fix clang 2024-09-14 00:56:26 -10:00
M. Bahoosh c8bde7cff0 Propagating errors 2024-09-13 04:45:19 -10:00
M. Bahoosh a4e3e386a0 Fix msvc and clang and gcc error 2024-09-13 02:55:57 -10:00
M. Bahoosh c343f6979c Moving things around to fix msvc error 2024-09-13 02:35:03 -07:00
M. Bahoosh bee5593cb2 Add macro 2024-09-13 01:42:19 -10:00
M. Bahoosh dfde6d5e44 sub 2024-09-13 01:40:16 -10:00
M. Bahoosh 414c5858ae noexcept-friendlification of endpoints 2024-09-12 21:55:13 -10:00
M. Bahoosh 142c9a93f8 Remove unnecessary function call 2024-09-12 09:04:28 -10:00
M. Bahoosh b4e7d717fc Optimize object::extract's performance 2024-09-12 08:52:22 -10:00
M. Bahoosh bba20807be object::extract
This is the bare minimum implementation of this idea.
2024-09-12 08:37:58 -10:00
Daniel Lemire 70a68da941 pedantic viable size 2024-09-06 01:19:47 -04:00
Daniel Lemire e341c8b438 release candidate 2024-08-26 09:37:33 -04:00
Daniel Lemire 0ac0a80e28 Merge branch 'master' of github.com:simdjson/simdjson 2024-08-26 09:37:03 -04:00
Daniel Lemire 6b9117c029 adding warning regarding SIMDJSON_BUILD_STATIC_LIB 2024-08-26 09:36:44 -04:00
Daniel Lemire dd92151971 adding a warning 2024-08-26 09:34:39 -04:00
Tan Li Boon 0679c247f4 Add missing include directives to static build targets of simdjson. (#2240) 2024-08-26 09:24:01 -04:00
John Keiser 615218a3ad Merge pull request #2237 from simdjson/jkeiser/simdjson-vscode
Reduce errors in vscode
2024-08-18 22:04:20 -07:00
John Keiser 4c1b0a41d8 Enable SIMDJSON_SINGLEHEADER=OFF in VS Code
With singleheader on, clangd can't find the right
include files.
2024-08-18 14:21:00 -07:00
John Keiser ef563a4b09 Make simdjson compile again 2024-08-18 11:21:26 -07:00
Daniel Lemire 7a9ff93388 [no-ci] Update README.md 2024-08-15 12:52:47 -04:00
Sasha Lopoukhine fc61d7c7ba Fix ndjson spec link (#2234)
* fix ndjson spec link

The link in the readme of parse_many links to a casino spam site

* fix link
2024-08-10 10:11:05 -04:00
Daniel Lemire d506af0a79 fix: add tests related to issue 2227 (#2229)
* fix: add tests related to issue 2227

* avoiding name clash

* pedantic fix

* deprecate rvalue get on document

* selectively deprecating
2024-08-07 20:15:06 -04:00
30 changed files with 721 additions and 337 deletions
+1
View File
@@ -25,6 +25,7 @@ CompileFlags:
Diagnostics: Diagnostics:
Suppress: Suppress:
- pp_including_mainfile_in_preamble - pp_including_mainfile_in_preamble
- unused-includes
--- ---
# Amalgamated files that require or partly define an implementation # Amalgamated files that require or partly define an implementation
If: If:
+5
View File
@@ -110,5 +110,10 @@
"semaphore": "cpp", "semaphore": "cpp",
"stop_token": "cpp", "stop_token": "cpp",
"cfenv": "cpp" "cfenv": "cpp"
},
"cmake.configureSettings": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "YES",
"SIMDJSON_DEVELOPER_MODE": "ON",
"SIMDJSON_SINGLEHEADER": "OFF"
} }
} }
+17 -8
View File
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.14)
project( project(
simdjson simdjson
# The version number is modified by tools/release.py # The version number is modified by tools/release.py
VERSION 3.10.0 VERSION 3.10.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
@@ -23,7 +23,11 @@ string(
set(SIMDJSON_LIB_VERSION "23.0.0" CACHE STRING "simdjson library version") set(SIMDJSON_LIB_VERSION "23.0.0" CACHE STRING "simdjson library version")
set(SIMDJSON_LIB_SOVERSION "23" CACHE STRING "simdjson library soversion") set(SIMDJSON_LIB_SOVERSION "23" CACHE STRING "simdjson library soversion")
option(SIMDJSON_BUILD_STATIC_LIB "Build simdjson_static library along with simdjson" OFF) option(SIMDJSON_BUILD_STATIC_LIB "Build simdjson_static library along with simdjson (only makes sense if BUILD_SHARED_LIBS=ON)" OFF)
if(SIMDJSON_BUILD_STATIC_LIB AND NOT BUILD_SHARED_LIBS)
message(WARNING "SIMDJSON_BUILD_STATIC_LIB only makes sense if BUILD_SHARED_LIBS is set to ON")
message(WARNING "You might be building and installing a two identical static libraries.")
endif()
option(SIMDJSON_ENABLE_THREADS "Link with thread support" ON) option(SIMDJSON_ENABLE_THREADS "Link with thread support" ON)
@@ -51,6 +55,7 @@ endif()
if(is_top_project) if(is_top_project)
option(SIMDJSON_DEVELOPER_MODE "Enable targets for developing simdjson" OFF) option(SIMDJSON_DEVELOPER_MODE "Enable targets for developing simdjson" OFF)
option(BUILD_SHARED_LIBS "Build simdjson as a shared library" OFF) option(BUILD_SHARED_LIBS "Build simdjson as a shared library" OFF)
option(SIMDJSON_SINGLEHEADER "Disable singleheader generation" ON)
endif() endif()
include(cmake/handle-deprecations.cmake) include(cmake/handle-deprecations.cmake)
@@ -155,11 +160,13 @@ endif()
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(GNUInstallDirs) include(GNUInstallDirs)
install( if(SIMDJSON_SINGLEHEADER)
FILES singleheader/simdjson.h install(
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" FILES singleheader/simdjson.h
COMPONENT simdjson_Development DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
) COMPONENT simdjson_Development
)
endif()
install( install(
TARGETS simdjson TARGETS simdjson
@@ -203,6 +210,7 @@ if(SIMDJSON_BUILD_STATIC_LIB)
TARGETS simdjson_static TARGETS simdjson_static
EXPORT simdjson_staticTargets EXPORT simdjson_staticTargets
ARCHIVE COMPONENT simdjson_Development ARCHIVE COMPONENT simdjson_Development
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
) )
install( install(
EXPORT simdjson_staticTargets EXPORT simdjson_staticTargets
@@ -286,8 +294,9 @@ add_subdirectory(tools) ## This needs to be before tests because of cxxopts
# most of the data has been moved to https://github.com/simdjson/simdjson-data # most of the data has been moved to https://github.com/simdjson/simdjson-data
add_subdirectory(jsonexamples) add_subdirectory(jsonexamples)
if(SIMDJSON_SINGLEHEADER)
add_subdirectory(singleheader) add_subdirectory(singleheader)
endif()
+1 -1
View File
@@ -38,7 +38,7 @@ PROJECT_NAME = simdjson
# could be handy for archiving the generated documentation or if some version # could be handy for archiving the generated documentation or if some version
# control system is used. # control system is used.
PROJECT_NUMBER = "3.10.0" PROJECT_NUMBER = "3.10.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
+2 -2
View File
@@ -201,8 +201,8 @@ For the video inclined, <br />
Funding Funding
------- -------
The work is supported by the Natural Sciences and Engineering Research Council of Canada under grant The work is supported by the Natural Sciences and Engineering Research Council of Canada under grants
number RGPIN-2017-03910. RGPIN-2017-03910 and RGPIN-2024-03787.
[license]: LICENSE [license]: LICENSE
[license img]: https://img.shields.io/badge/License-Apache%202-blue.svg [license img]: https://img.shields.io/badge/License-Apache%202-blue.svg
+29
View File
@@ -24,6 +24,35 @@ struct simdjson_ondemand {
BENCHMARK_TEMPLATE(kostya, simdjson_ondemand)->UseManualTime(); BENCHMARK_TEMPLATE(kostya, simdjson_ondemand)->UseManualTime();
#if SIMDJSON_SUPPORTS_EXTRACT
using namespace simdjson::ondemand;
struct simdjson_ondemand_extract {
static constexpr diff_flags DiffFlags = diff_flags::NONE;
ondemand::parser parser{};
bool run(simdjson::padded_string &json, std::vector<point> &result) {
auto doc = parser.iterate(json);
for (ondemand::object object_point : doc.find_field("coordinates")) {
point p;
auto error = object_point.extract(
to{"x", p.x},
to{"y", p.y},
to{"z", p.z}
);
if(error) { return false; }
result.push_back(p);
}
return true;
}
};
BENCHMARK_TEMPLATE(kostya, simdjson_ondemand_extract)->UseManualTime();
#endif // SIMDJSON_SUPPORTS_EXTRACT
} // namespace kostya } // namespace kostya
#endif // SIMDJSON_EXCEPTIONS #endif // SIMDJSON_EXCEPTIONS
+43 -1
View File
@@ -9,7 +9,7 @@ namespace partial_tweets {
using namespace simdjson; using namespace simdjson;
struct simdjson_ondemand { struct simdjson_ondemand {
using StringType=std::string_view; using StringType = std::string_view;
ondemand::parser parser{}; ondemand::parser parser{};
@@ -43,6 +43,48 @@ struct simdjson_ondemand {
BENCHMARK_TEMPLATE(partial_tweets, simdjson_ondemand)->UseManualTime(); BENCHMARK_TEMPLATE(partial_tweets, simdjson_ondemand)->UseManualTime();
#if SIMDJSON_SUPPORTS_EXTRACT
using namespace simdjson::ondemand;
struct simdjson_ondemand_extract {
using StringType = std::string_view;
ondemand::parser parser{};
bool run(simdjson::padded_string &json, std::vector<tweet<std::string_view>> &result) {
// Walk the document, parsing the tweets as we go
auto doc = parser.iterate(json);
for (ondemand::object tweet_object : doc.find_field("statuses")) {
tweet<std::string_view> t;
auto error = tweet_object.extract(
to{"created_at", t.created_at},
to{"id", t.id},
to{"text", t.result},
to{"in_reply_to_status_id", [&t](auto val) {
if(val.is_null()) {
t.in_reply_to_status_id = 0;
} else {
t.in_reply_to_status_id = val;
}
}},
to{"user", sub{
to{"id", t.user.id},
to{"screen_name", t.user.screen_name},
}},
to{"retweet_count", t.retweet_count},
to{"favorite_count", t.favorite_count});
if(error) { return false; }
result.push_back(t);
}
return true;
}
};
BENCHMARK_TEMPLATE(partial_tweets, simdjson_ondemand_extract)->UseManualTime();
#endif
} // namespace partial_tweets } // namespace partial_tweets
#endif // SIMDJSON_EXCEPTIONS #endif // SIMDJSON_EXCEPTIONS
+1 -1
View File
@@ -125,7 +125,7 @@ Whitespace Characters:
- **Nothing** - **Nothing**
Some official formats **(non-exhaustive list)**: Some official formats **(non-exhaustive list)**:
- [Newline-Delimited JSON (NDJSON)](http://ndjson.org/) - [Newline-Delimited JSON (NDJSON)](https://github.com/ndjson/ndjson-spec)
- [JSON lines (JSONL)](http://jsonlines.org/) - [JSON lines (JSONL)](http://jsonlines.org/)
- [Record separator-delimited JSON (RFC 7464)](https://tools.ietf.org/html/rfc7464) <- Not supported by JsonStream! - [Record separator-delimited JSON (RFC 7464)](https://tools.ietf.org/html/rfc7464) <- Not supported by JsonStream!
- [More on Wikipedia...](https://en.wikipedia.org/wiki/JSON_streaming) - [More on Wikipedia...](https://en.wikipedia.org/wiki/JSON_streaming)
+4
View File
@@ -50,6 +50,8 @@ double from_chars(const char *first, const char* end) noexcept;
#define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) #define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0)
#if SIMDJSON_REGULAR_VISUAL_STUDIO #if SIMDJSON_REGULAR_VISUAL_STUDIO
// We could use [[deprecated]] but it requires C++14
#define simdjson_deprecated __declspec(deprecated)
#define simdjson_really_inline __forceinline #define simdjson_really_inline __forceinline
#define simdjson_never_inline __declspec(noinline) #define simdjson_never_inline __declspec(noinline)
@@ -88,6 +90,8 @@ double from_chars(const char *first, const char* end) noexcept;
#define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
#else // SIMDJSON_REGULAR_VISUAL_STUDIO #else // SIMDJSON_REGULAR_VISUAL_STUDIO
// We could use [[deprecated]] but it requires C++14
#define simdjson_deprecated __attribute__((deprecated))
#define simdjson_really_inline inline __attribute__((always_inline)) #define simdjson_really_inline inline __attribute__((always_inline))
#define simdjson_never_inline inline __attribute__((noinline)) #define simdjson_never_inline inline __attribute__((noinline))
@@ -3,16 +3,14 @@
#ifndef SIMDJSON_CONDITIONAL_INCLUDE #ifndef SIMDJSON_CONDITIONAL_INCLUDE
#define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
#include "simdjson/generic/ondemand/base.h" #include "simdjson/generic/ondemand/base.h"
#include "simdjson/generic/ondemand/array-inl.h"
#include "simdjson/generic/ondemand/array_iterator.h" #include "simdjson/generic/ondemand/array_iterator.h"
#include "simdjson/generic/ondemand/document.h" #include "simdjson/generic/ondemand/document.h"
#include "simdjson/generic/ondemand/json_iterator-inl.h"
#include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h"
#include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h"
#include "simdjson/generic/ondemand/json_type.h" #include "simdjson/generic/ondemand/json_type.h"
#include "simdjson/generic/ondemand/object-inl.h"
#include "simdjson/generic/ondemand/raw_json_string.h" #include "simdjson/generic/ondemand/raw_json_string.h"
#include "simdjson/generic/ondemand/value.h" #include "simdjson/generic/ondemand/value.h"
#include "simdjson/generic/ondemand/array-inl.h"
#include "simdjson/generic/ondemand/json_iterator-inl.h"
#include "simdjson/generic/ondemand/object-inl.h"
#include "simdjson/generic/ondemand/value_iterator-inl.h" #include "simdjson/generic/ondemand/value_iterator-inl.h"
#endif // SIMDJSON_CONDITIONAL_INCLUDE #endif // SIMDJSON_CONDITIONAL_INCLUDE
@@ -167,24 +165,26 @@ template<> simdjson_inline simdjson_result<int64_t> document::get() & noexcept {
template<> simdjson_inline simdjson_result<bool> document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result<bool> document::get() & noexcept { return get_bool(); }
template<> simdjson_inline simdjson_result<value> document::get() & noexcept { return get_value(); } template<> simdjson_inline simdjson_result<value> document::get() & noexcept { return get_value(); }
template<> simdjson_inline simdjson_result<raw_json_string> document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result<raw_json_string> document::get() && noexcept { return get_raw_json_string(); }
template<> simdjson_inline simdjson_result<std::string_view> document::get() && noexcept { return get_string(false); } template<> simdjson_deprecated simdjson_inline simdjson_result<std::string_view> document::get() && noexcept { return get_string(false); }
template<> simdjson_inline simdjson_result<double> document::get() && noexcept { return std::forward<document>(*this).get_double(); } template<> simdjson_deprecated simdjson_inline simdjson_result<double> document::get() && noexcept { return std::forward<document>(*this).get_double(); }
template<> simdjson_inline simdjson_result<uint64_t> document::get() && noexcept { return std::forward<document>(*this).get_uint64(); } template<> simdjson_deprecated simdjson_inline simdjson_result<uint64_t> document::get() && noexcept { return std::forward<document>(*this).get_uint64(); }
template<> simdjson_inline simdjson_result<int64_t> document::get() && noexcept { return std::forward<document>(*this).get_int64(); } template<> simdjson_deprecated simdjson_inline simdjson_result<int64_t> document::get() && noexcept { return std::forward<document>(*this).get_int64(); }
template<> simdjson_inline simdjson_result<bool> document::get() && noexcept { return std::forward<document>(*this).get_bool(); } template<> simdjson_deprecated simdjson_inline simdjson_result<bool> document::get() && noexcept { return std::forward<document>(*this).get_bool(); }
template<> simdjson_inline simdjson_result<value> document::get() && noexcept { return get_value(); } template<> simdjson_deprecated simdjson_inline simdjson_result<value> document::get() && noexcept { return get_value(); }
template<typename T> simdjson_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_inline error_code document::get(T &out) && noexcept { template<typename T> simdjson_deprecated 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
template <class T> template <class T>
simdjson_inline document::operator T() noexcept(false) { return get<T>(); } simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get<T>(); }
template <class T>
simdjson_inline document::operator T() & noexcept(false) { return get<T>(); }
simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
@@ -471,7 +471,7 @@ simdjson_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::onde
return first.get<T>(); return first.get<T>();
} }
template<typename T> template<typename T>
simdjson_inline simdjson_result<T> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get() && noexcept { simdjson_deprecated 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>();
} }
@@ -487,7 +487,7 @@ simdjson_inline error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::do
} }
template<> simdjson_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_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document>::get<SIMDJSON_IMPLEMENTATION::ondemand::document>() && noexcept { template<> simdjson_deprecated 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);
} }
+7 -4
View File
@@ -188,7 +188,7 @@ public:
" You may also add support for custom types, see our documentation."); " You may also add support for custom types, see our documentation.");
} }
/** @overload template<typename T> simdjson_result<T> get() & noexcept */ /** @overload template<typename T> simdjson_result<T> get() & noexcept */
template<typename T> simdjson_inline simdjson_result<T> get() && noexcept { template<typename T> simdjson_deprecated simdjson_inline simdjson_result<T> get() && noexcept {
// Unless the simdjson library or the user provides an inline implementation, calling this method should // Unless the simdjson library or the user 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. "
@@ -211,7 +211,7 @@ public:
*/ */
template<typename T> simdjson_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_inline error_code get(T &out) && noexcept; template<typename T> simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept;
#if SIMDJSON_EXCEPTIONS #if SIMDJSON_EXCEPTIONS
/** /**
@@ -224,7 +224,10 @@ public:
* @returns An instance of type T * @returns An instance of type T
*/ */
template <class T> template <class T>
explicit simdjson_inline operator T() noexcept(false); explicit simdjson_inline operator T() & noexcept(false);
template <class T>
explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false);
/** /**
* Cast this JSON value to an array. * Cast this JSON value to an array.
* *
@@ -790,7 +793,7 @@ public:
simdjson_inline simdjson_result<bool> is_null() noexcept; simdjson_inline simdjson_result<bool> is_null() noexcept;
template<typename T> simdjson_inline simdjson_result<T> get() & noexcept; template<typename T> simdjson_inline simdjson_result<T> get() & noexcept;
template<typename T> simdjson_inline simdjson_result<T> get() && noexcept; template<typename T> simdjson_deprecated simdjson_inline simdjson_result<T> get() && noexcept;
template<typename T> simdjson_inline error_code get(T &out) & noexcept; template<typename T> simdjson_inline error_code get(T &out) & noexcept;
template<typename T> simdjson_inline error_code get(T &out) && noexcept; template<typename T> simdjson_inline error_code get(T &out) && noexcept;
@@ -316,7 +316,7 @@ private:
friend class document; friend class document;
friend class json_iterator; friend class json_iterator;
friend struct simdjson_result<ondemand::document_stream>; friend struct simdjson_result<ondemand::document_stream>;
friend struct internal::simdjson_result_base<ondemand::document_stream>; friend struct simdjson::internal::simdjson_result_base<ondemand::document_stream>;
}; // document_stream }; // document_stream
} // namespace ondemand } // namespace ondemand
@@ -1,67 +0,0 @@
#pragma once
#ifndef SIMDJSON_ONDEMAND_GENERIC_JSON_PATH_TO_POINTER_CONVERSION_INL_H
#define SIMDJSON_ONDEMAND_GENERIC_JSON_PATH_TO_POINTER_CONVERSION_INL_H
#ifndef SIMDJSON_CONDITIONAL_INCLUDE
#define SIMDJSON_GENERIC_ONDEMAND_JSON_PATH_TO_POINTER_CONVERSION_INL_H
#include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h"
#endif // SIMDJSON_CONDITIONAL_INCLUDE
namespace simdjson {
namespace SIMDJSON_IMPLEMENTATION {}
namespace ondemand {
simdjson_inline std::string json_path_to_pointer_conversion(std::string_view json_path) {
if (json_path.empty() || (json_path.front() != '.' && json_path.front() != '[') {
return "-1"; // Sentinel value to be handled as an error by the caller.
}
std::string result;
// Reserve space to reduce allocations, adjusting for potential increases due
// to escaping.
result.reserve(json_path.size() * 2);
// Skip the initial '.' as it's assumed every path starts with it.
size_t i = 0;
while (i < json_path.length()) {
if (json_path[i] == '.') {
result += '/';
} else if (json_path[i] == '[') {
result += '/';
++i; // Move past the '['
while (i < json_path.length() && json_path[i] != ']') {
if (json_path[i] == '~') {
result += "~0";
} else if (json_path[i] == '/') {
result += "~1";
} else {
result += json_path[i];
}
++i;
}
if (i == json_path.length() || json_path[i] != ']') {
return "-1"; // Returning sentinel value that will be handled as an error by the caller
}
} else {
if (json_path[i] == '~') {
result += "~0";
} else if (json_path[i] == '/') {
result += "~1";
} else {
result += json_path[i];
}
}
++i;
}
return simdjson_result<std::string>(result);
}
} // namespace ondemand
} // namespace SIMDJSON_IMPLEMENTATION
} // namespace simdjson
#endif // SIMDJSON_ONDEMAND_GENERIC_JSON_PATH_TO_POINTER_CONVERSION_INL_H
@@ -1,22 +0,0 @@
#pragma once
#ifndef SIMDJSON_ONDEMAND_GENERIC_JSON_PATH_TO_POINTER_CONVERSION_H
#define SIMDJSON_ONDEMAND_GENERIC_JSON_PATH_TO_POINTER_CONVERSION_H
namespace simdjson {
namespace SIMDJSON_IMPLEMENTATION {
namespace internal {
/**
* Converts JSONPath to JSON Pointer.
* @param json_path The JSONPath string to be converted.
* @return A string containing the equivalent JSON Pointer.
* @throws simdjson_error If the conversion fails.
*/
simdjson_inline std::string json_path_to_pointer_conversion(std::string_view json_path);
} // namespace internal
} // namespace SIMDJSON_IMPLEMENTATION
} // namespace simdjson
#endif // SIMDJSON_JSON_PATH_TO_POINTER_CONVERSION_H
@@ -15,6 +15,134 @@ namespace simdjson {
namespace SIMDJSON_IMPLEMENTATION { namespace SIMDJSON_IMPLEMENTATION {
namespace ondemand { namespace ondemand {
#ifdef SIMDJSON_SUPPORTS_EXTRACT
template <endpoint ...Funcs>
simdjson_inline error_code object::extract(Funcs&&... endpoints)
#ifndef _MSC_VER // msvc thinks noexcept is not the same in definition
noexcept((nothrow_endpoint<Funcs> && ...))
#endif
{
raw_json_string field_key;
error_code error = SUCCESS;
for(auto pair : *this) {
if (error = pair.key().get(field_key); error) {
break;
}
std::ignore = ((field_key.unsafe_is_equal(endpoints.key()) ? (error = endpoints(pair.value())) == SUCCESS : true) && ...);
if (error) {
break;
}
}
return error;
}
template <typename T>
struct to {
private:
T *pointer;
std::string_view m_key;
public:
constexpr explicit(false)
to(std::string_view const inp_key, T &obj_ref) noexcept
: pointer{std::addressof(obj_ref)}, m_key{inp_key} {}
constexpr to(to const &) = default;
constexpr to(to &&) noexcept = default;
constexpr to &operator=(to const &) = default;
constexpr to &operator=(to &&) noexcept = default;
constexpr ~to() = default;
[[nodiscard]] constexpr std::string_view key() const noexcept {
return m_key;
}
[[nodiscard]] constexpr error_code operator()(simdjson_result<value> val) noexcept(
std::is_nothrow_assignable_v<T, simdjson_result<value>>) {
return val.get<T>(*pointer);
}
};
template <typename Func>
requires(std::is_invocable_v<Func, simdjson_result<value>>)
struct to<Func> {
private:
Func func;
std::string_view m_key;
public:
constexpr explicit(false)
to(std::string_view const inp_key,
Func &&inp_func) noexcept(std::is_nothrow_copy_assignable_v<Func>)
: func{std::forward<Func>(inp_func)}, m_key{inp_key} {}
constexpr to(to const &) = default;
constexpr to(to &&) noexcept = default;
constexpr to& operator=(to const &) = default;
constexpr to& operator=(to &&) noexcept = default;
constexpr ~to() = default;
[[nodiscard]] constexpr std::string_view key() const noexcept {
return m_key;
}
[[nodiscard]] constexpr error_code operator()(simdjson_result<value> val) noexcept(
std::is_nothrow_invocable_v<Func, simdjson_result<value>>) {
if constexpr (std::is_invocable_r_v<error_code, Func, simdjson_result<value>>) {
return func(val);
} else {
static_cast<void>(func(val));
return SUCCESS;
}
}
};
template <typename Func>
requires(std::is_invocable_v<Func, simdjson_result<value>>)
to(std::string_view, Func &&) -> to<Func>;
template <typename T>
to(std::string_view, T&) -> to<T>;
template <endpoint... Tos>
struct sub {
private:
using tuple_type = std::tuple<Tos...>;
tuple_type tos;
public:
// double templating to make perfect forwarding work
template <typename ...T>
requires ((std::same_as<T, Tos> && ...))
explicit constexpr sub(T&&...inp_tos) noexcept(std::is_nothrow_constructible_v<tuple_type, T...>)
: tos{std::forward<T>(inp_tos)...} {}
constexpr sub(sub const &) = default;
constexpr sub(sub &&) noexcept = default;
constexpr sub &operator=(sub const &) = default;
constexpr sub &operator=(sub &&) = default;
constexpr ~sub() = default;
[[nodiscard]] constexpr error_code operator()(simdjson_result<value> val) noexcept((nothrow_endpoint<Tos> && ...)) {
object obj;
if (auto const err = val.get_object().get(obj); err) {
return err;
}
return std::apply([&obj]<typename... T>(T &&...app_tos) {
return obj.extract(std::forward<T>(app_tos)...);
}, tos);
}
};
template <endpoint... Tos>
sub(Tos&&...) -> sub<Tos...>;
#endif
simdjson_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) );
@@ -11,6 +11,20 @@ namespace simdjson {
namespace SIMDJSON_IMPLEMENTATION { namespace SIMDJSON_IMPLEMENTATION {
namespace ondemand { namespace ondemand {
#if defined(__cpp_concepts) && defined(__cpp_consteval)
#define SIMDJSON_SUPPORTS_EXTRACT 1
template <typename T>
concept endpoint = std::is_invocable_r_v<error_code, T, simdjson_result<value>> &&
std::is_copy_constructible_v<T> && requires(T to) {
{ to.key() } noexcept -> std::convertible_to<std::string_view>;
};
template <typename T>
concept nothrow_endpoint = endpoint<T> && std::is_nothrow_invocable_r_v<error_code, T, simdjson_result<value>>;
#endif
/** /**
* A forward-only JSON object field iterator. * A forward-only JSON object field iterator.
*/ */
@@ -65,6 +79,21 @@ public:
/** @overload simdjson_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_inline simdjson_result<value> find_field(std::string_view key) && noexcept; simdjson_inline simdjson_result<value> find_field(std::string_view key) && noexcept;
#ifdef SIMDJSON_SUPPORTS_EXTRACT
/**
* Extract all the fields in one go
* Funcs are invocables that take a simdjson_result<value> as input.
*/
template <endpoint ...Funcs>
simdjson_inline error_code extract(Funcs&&... endpoints)
#ifndef _MSC_VER // msvc thinks noexcept is not the same in definition
noexcept((nothrow_endpoint<Funcs> && ...))
#endif
;
#endif
/** /**
* 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.
* *
+1 -1
View File
@@ -340,7 +340,7 @@ public:
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<simdjson::internal::dom_parser_implementation> implementation{};
size_t _capacity{0}; size_t _capacity{0};
size_t _max_capacity; size_t _max_capacity;
size_t _max_depth{DEFAULT_MAX_DEPTH}; size_t _max_depth{DEFAULT_MAX_DEPTH};
@@ -6,8 +6,6 @@
#include "simdjson/generic/ondemand/array.h" #include "simdjson/generic/ondemand/array.h"
#include "simdjson/generic/ondemand/array_iterator.h" #include "simdjson/generic/ondemand/array_iterator.h"
#include "simdjson/generic/ondemand/json_iterator.h" #include "simdjson/generic/ondemand/json_iterator.h"
#include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h"
#include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h"
#include "simdjson/generic/ondemand/json_type.h" #include "simdjson/generic/ondemand/json_type.h"
#include "simdjson/generic/ondemand/object.h" #include "simdjson/generic/ondemand/object.h"
#include "simdjson/generic/ondemand/raw_json_string.h" #include "simdjson/generic/ondemand/raw_json_string.h"
@@ -6,9 +6,9 @@
#include "simdjson/generic/atomparsing.h" #include "simdjson/generic/atomparsing.h"
#include "simdjson/generic/numberparsing.h" #include "simdjson/generic/numberparsing.h"
#include "simdjson/generic/ondemand/json_iterator.h" #include "simdjson/generic/ondemand/json_iterator.h"
#include "simdjson/generic/ondemand/value_iterator.h"
#include "simdjson/generic/ondemand/json_type-inl.h" #include "simdjson/generic/ondemand/json_type-inl.h"
#include "simdjson/generic/ondemand/raw_json_string-inl.h" #include "simdjson/generic/ondemand/raw_json_string-inl.h"
#include "simdjson/generic/ondemand/value_iterator.h"
#endif // SIMDJSON_CONDITIONAL_INCLUDE #endif // SIMDJSON_CONDITIONAL_INCLUDE
namespace simdjson { namespace simdjson {
+9 -1
View File
@@ -53,6 +53,9 @@ inline padded_string::padded_string(const char *data, size_t length) noexcept
if ((data != nullptr) && (data_ptr != nullptr)) { if ((data != nullptr) && (data_ptr != nullptr)) {
std::memcpy(data_ptr, data, length); std::memcpy(data_ptr, data, length);
} }
if (data_ptr == nullptr) {
viable_size = 0;
}
} }
#ifdef __cpp_char8_t #ifdef __cpp_char8_t
inline padded_string::padded_string(const char8_t *data, size_t length) noexcept inline padded_string::padded_string(const char8_t *data, size_t length) noexcept
@@ -60,12 +63,17 @@ inline padded_string::padded_string(const char8_t *data, size_t length) noexcept
if ((data != nullptr) && (data_ptr != nullptr)) { if ((data != nullptr) && (data_ptr != nullptr)) {
std::memcpy(data_ptr, reinterpret_cast<const char *>(data), length); std::memcpy(data_ptr, reinterpret_cast<const char *>(data), length);
} }
if (data_ptr == nullptr) {
viable_size = 0;
}
} }
#endif #endif
// note: do not pass std::string arguments by value // note: do not pass std::string arguments by value
inline padded_string::padded_string(const std::string & str_ ) noexcept inline padded_string::padded_string(const std::string & str_ ) noexcept
: viable_size(str_.size()), data_ptr(internal::allocate_padded_buffer(str_.size())) { : viable_size(str_.size()), data_ptr(internal::allocate_padded_buffer(str_.size())) {
if (data_ptr != nullptr) { if (data_ptr == nullptr) {
viable_size = 0;
} else {
std::memcpy(data_ptr, str_.data(), str_.size()); std::memcpy(data_ptr, str_.data(), str_.size());
} }
} }
+2 -2
View File
@@ -4,7 +4,7 @@
#define SIMDJSON_SIMDJSON_VERSION_H #define SIMDJSON_SIMDJSON_VERSION_H
/** The version of simdjson being used (major.minor.revision) */ /** The version of simdjson being used (major.minor.revision) */
#define SIMDJSON_VERSION "3.10.0" #define SIMDJSON_VERSION "3.10.1"
namespace simdjson { namespace simdjson {
enum { enum {
@@ -19,7 +19,7 @@ enum {
/** /**
* The revision (major.minor.REVISION) of simdjson being used. * The revision (major.minor.REVISION) of simdjson being used.
*/ */
SIMDJSON_VERSION_REVISION = 0 SIMDJSON_VERSION_REVISION = 1
}; };
} // namespace simdjson } // namespace simdjson
+5 -1
View File
@@ -1,4 +1,4 @@
/* auto-generated on 2024-08-01 09:31:50 -0400. Do not edit! */ /* auto-generated on 2024-08-26 09:37:03 -0400. Do not edit! */
/* including simdjson.cpp: */ /* including simdjson.cpp: */
/* begin file simdjson.cpp */ /* begin file simdjson.cpp */
#define SIMDJSON_SRC_SIMDJSON_CPP #define SIMDJSON_SRC_SIMDJSON_CPP
@@ -332,6 +332,8 @@ double from_chars(const char *first, const char* end) noexcept;
#define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) #define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0)
#if SIMDJSON_REGULAR_VISUAL_STUDIO #if SIMDJSON_REGULAR_VISUAL_STUDIO
// We could use [[deprecated]] but it requires C++14
#define simdjson_deprecated __declspec(deprecated)
#define simdjson_really_inline __forceinline #define simdjson_really_inline __forceinline
#define simdjson_never_inline __declspec(noinline) #define simdjson_never_inline __declspec(noinline)
@@ -370,6 +372,8 @@ double from_chars(const char *first, const char* end) noexcept;
#define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
#else // SIMDJSON_REGULAR_VISUAL_STUDIO #else // SIMDJSON_REGULAR_VISUAL_STUDIO
// We could use [[deprecated]] but it requires C++14
#define simdjson_deprecated __attribute__((deprecated))
#define simdjson_really_inline inline __attribute__((always_inline)) #define simdjson_really_inline inline __attribute__((always_inline))
#define simdjson_never_inline inline __attribute__((noinline)) #define simdjson_never_inline inline __attribute__((noinline))
+215 -203
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -28,6 +28,7 @@ add_cpp_test(ondemand_to_string LABELS ondemand acceptance per_impl
add_cpp_test(ondemand_twitter_tests LABELS ondemand acceptance per_implementation) add_cpp_test(ondemand_twitter_tests LABELS ondemand acceptance per_implementation)
add_cpp_test(ondemand_wrong_type_error_tests LABELS ondemand acceptance per_implementation) add_cpp_test(ondemand_wrong_type_error_tests LABELS ondemand acceptance per_implementation)
add_cpp_test(ondemand_iterate_many_csv LABELS ondemand acceptance per_implementation) add_cpp_test(ondemand_iterate_many_csv LABELS ondemand acceptance per_implementation)
add_cpp_test(ondemand_extract_tests LABELS ondemand acceptance per_implementation)
if(NOT SIMDJSON_SANITIZE) if(NOT SIMDJSON_SANITIZE)
add_cpp_test(ondemand_cacheline LABELS ondemand acceptance per_implementation) add_cpp_test(ondemand_cacheline LABELS ondemand acceptance per_implementation)
endif() endif()
@@ -13,7 +13,8 @@ function(add_dual_compile_test TEST_NAME)
target_compile_definitions(${TEST_NAME}_should_not_compile PRIVATE COMPILATION_TEST_USE_FAILING_CODE=1) target_compile_definitions(${TEST_NAME}_should_not_compile PRIVATE COMPILATION_TEST_USE_FAILING_CODE=1)
endfunction(add_dual_compile_test) endfunction(add_dual_compile_test)
add_dual_compile_test(iterate_object)
add_dual_compile_test(iterate_array)
add_dual_compile_test(iterate_char_star) add_dual_compile_test(iterate_char_star)
add_dual_compile_test(iterate_string_view) add_dual_compile_test(iterate_string_view)
add_dual_compile_test(iterate_temporary_buffer) add_dual_compile_test(iterate_temporary_buffer)
@@ -0,0 +1,34 @@
#include <iostream>
#include "simdjson.h"
using namespace simdjson;
int main() {
auto json = "[1]"_padded;
ondemand::parser parser;
auto f = [](ondemand::parser& p, simdjson::padded_string& jsons) -> ondemand::document {
ondemand::document doc;
auto error = p.iterate(jsons).get(doc);
if(error) { std::abort(); }
return doc;
};
ondemand::array arrayv;
#if COMPILATION_TEST_USE_FAILING_CODE
// Not allowed as this would be unsafe, the document must remain alive.
auto error = f(parser).get_array().get(arrayv);
#else
ondemand::document doc = f(parser, json);
auto error = doc.get_array().get(arrayv);
#endif
if(error) {
std::cout << "Failure" << std::endl;
}
int64_t a = 0;
error = arrayv.at(0).get_int64().get(a);
if(error) {
std::cout << "failure" << std::endl;
}
printf("a = %d\n", (int)a);
return EXIT_SUCCESS;
}
@@ -0,0 +1,34 @@
#include <iostream>
#include "simdjson.h"
using namespace simdjson;
int main() {
auto json = "{\"a\":1}"_padded;
ondemand::parser parser;
auto f = [](ondemand::parser& p, simdjson::padded_string& jsons) -> ondemand::document {
ondemand::document doc;
auto error = p.iterate(jsons).get(doc);
if(error) { std::abort(); }
return doc;
};
ondemand::object objv;
#if COMPILATION_TEST_USE_FAILING_CODE
// Not allowed as this would be unsafe, the document must remain alive.
auto error = f(parser).get_object().get(objv);
#else
ondemand::document doc = f(parser, json);
auto error = doc.get_object().get(objv);
#endif
if(error) {
std::cout << "Failure" << std::endl;
}
int64_t a = 0;
error = objv["a"].get_int64().get(a);
if(error) {
std::cout << "failure" << std::endl;
}
printf("a = %d\n", (int)a);
return EXIT_SUCCESS;
}
@@ -59,6 +59,22 @@ void compilation_test_3() {
} }
} }
} }
// Do not run this, it is only meant to compile
void compilation_test_4() {
const padded_string bogus = ""_padded;
ondemand::parser parser;
int64_t x1 = (int64_t)parser.iterate(bogus);
double x2 = (double)parser.iterate(bogus);
std::string_view x = (std::string_view)parser.iterate(bogus);
uint64_t x3 = (uint64_t)parser.iterate(bogus);
bool x4 = (bool)parser.iterate(bogus);
(void) x1;
(void) x2;
(void) x3;
(void) x4;
(void) x;
}
#endif // SIMDJSON_EXCEPTIONS #endif // SIMDJSON_EXCEPTIONS
int main(void) { int main(void) {
+116
View File
@@ -0,0 +1,116 @@
#include "simdjson.h"
#include "test_ondemand.h"
using namespace simdjson;
namespace multi_get_tests {
#ifdef __cpp_concepts
struct Car {
std::string_view make;
std::string_view model;
std::int64_t year = 0;
struct wheel_size_type {
std::int64_t front = 0;
std::int64_t back = 0;
} wheels;
static simdjson_result<Car> create(auto& value) {
using ondemand::to;
using ondemand::sub;
simdjson::ondemand::object obj;
auto error = value.get_object().get(obj);
if (error) {
return error;
}
Car car{};
// Instead of this:
// for (auto field : obj) {
// simdjson::ondemand::raw_json_string key;
// error = field.key().get(key);
// if (error) {
// return error;
// }
// if (key == "make") {
// error = field.value().get_string(car.make);
// if (error) {
// return error;
// }
// } else if (key == "model") {
// error = field.value().get_string(car.model);
// if (error) {
// return error;
// }
// } else if (key == "year") {
// error = field.value().get(car.year);
// if (error) {
// return error;
// }
// }
//
// we can do this now:
error = obj.extract(
to{"wheels", sub{
to{"front", car.wheels.front},
to{"back", car.wheels.back},
}},
to{"make", car.make},
to{"model", car.model},
to{"year", [&car](auto val) {
car.year = val;
}});
if (error) {
return error;
}
return car;
}
};
bool car_example() {
TEST_START();
simdjson::padded_string json =
R"( [ { "make": "Toyota", "model": "Camry", "year": 2018,
"tire_pressure": [ 40.1, 39.9 ], "wheels": { "front": 10, "back": 10 } },
{ "make": "Kia", "model": "Soul", "year": 2012,
"tire_pressure": [ 30.1, 31.0 ], "wheels": { "front": 10, "back": 10 } },
{ "make": "Toyota", "model": "Tercel", "year": 1999,
"tire_pressure": [ 29.8, 30.0 ], "wheels": { "front": 10, "back": 10 } }
])"_padded;
simdjson::ondemand::parser parser;
simdjson::ondemand::document doc = parser.iterate(json);
for (auto val : doc) {
auto car = Car::create(val);
ASSERT_EQUAL(car.error(), SUCCESS);
Car const c(car.value());
if (c.make != "Toyota" && c.make != "Kia") {
return false;
}
if (c.model != "Camry" && c.model != "Soul" && c.model != "Tercel") {
return false;
}
if (c.year != 2018 && c.year != 2012 && c.year != 1999) {
return false;
}
if (c.wheels.front != 10 || c.wheels.back != 10) {
return false;
}
}
TEST_SUCCEED();
}
#endif
bool run() {
return
#ifdef __cpp_concepts
car_example() &&
#endif
true;
}
} // namespace multi_get_tests
int main(int argc, char *argv[]) {
return test_main(argc, argv, multi_get_tests::run);
}
@@ -164,8 +164,7 @@ namespace json_pointer_tests {
ASSERT_TRUE(is_scalar); ASSERT_TRUE(is_scalar);
ASSERT_ERROR(doc.at_pointer("").get(val), simdjson::SCALAR_DOCUMENT_AS_VALUE); ASSERT_ERROR(doc.at_pointer("").get(val), simdjson::SCALAR_DOCUMENT_AS_VALUE);
std::cout << " checking true"<< std::endl; std::cout << " checking true"<< std::endl;
ASSERT_SUCCESS(parser.iterate(true_json).get(doc)); ASSERT_SUCCESS(parser.iterate(true_json).is_scalar().get(is_scalar));
ASSERT_SUCCESS(doc.is_scalar().get(is_scalar));
ASSERT_TRUE(is_scalar); ASSERT_TRUE(is_scalar);
ASSERT_ERROR(doc.at_pointer("").get(val), simdjson::SCALAR_DOCUMENT_AS_VALUE); ASSERT_ERROR(doc.at_pointer("").get(val), simdjson::SCALAR_DOCUMENT_AS_VALUE);
std::cout << " checking object"<< std::endl; std::cout << " checking object"<< std::endl;