mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
3c0d032ded
* tag_invoke based custom types (#2219) * tag_invoke based custom types Now you can use tag_invoke to add a custom type or a group of custom types. * Fixing macro usage + Fixing noexcept * Fixing the usage of #include We don't need <concepts> at all seems like it * Fixing tag_invoke impl for MSVC * Making `tag_invoke` to support `ondemand::document` as well + docs (#2228) * Making `tag_invoke` to support `ondemand::document` as well + docs * Fix typos and doc update by @lemire Co-authored-by: Daniel Lemire <daniel@lemire.me> * Better docs by @lemire Co-authored-by: Daniel Lemire <daniel@lemire.me> * Preserving the old, disallowing in the new I'm disabling `document::get() &&` if the user has provided a `tag_invoke`d version; otherwise, we retain the compatibility. --------- Co-authored-by: Daniel Lemire <daniel@lemire.me> * fix: correct small issues with deserialize (#2232) * Extending the deserialization code with more defaults + docs (#2233) * Make custom types easier with some predefined cases + docs * missing include * adding Ubuntu 24 CXX 20 * using concepts all the way * minor tweak * tiny tweak * tweaks * more tweaking * saving --------- Co-authored-by: Daniel Lemire <dlemire@lemire.me> * Making `tag_invoke` a "put" as opposed to a "get" (#2256) * 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 * 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 * [no-ci] Update README.md * Make simdjson compile again * Enable SIMDJSON_SINGLEHEADER=OFF in VS Code With singleheader on, clangd can't find the right include files. * Add missing include directives to static build targets of simdjson. (#2240) * adding a warning * adding warning regarding SIMDJSON_BUILD_STATIC_LIB * release candidate * pedantic viable size * Making tag_invoke a feeder instead of a producer * adding missing undef silencer (#2253) * Ignore pragma once when amalgamating source files (#2248) With gcc it causes an error in `simdjson.cpp`: ``` simdjson.cpp:548:9: warning: #pragma once in main file 548 | #pragma once | ^~~~ ``` It had previously been commented out in: https://github.com/simdjson/simdjson/commit/6ef555e6fb79363fae057a9a46b52cd208d9e305 However, this was lost in an upgrade: https://github.com/simdjson/simdjson/commit/2a4ff7346813b120f2b5b40e95d69352b593cc9c * Update CI (#2254) * adding missing undef silencer * Updating CI * more fixes * fix * big endian fix * Moving to the new tag_invoke signature * Fix nlohmann ambiguity on C++23-enabled clang * Revert "Merge branch 'master' of https://github.com/simdjson/simdjson into builder_development_branch_extra" This reverts commit3eeecbab34, reversing changes made to6858b208b4. --------- Co-authored-by: Daniel Lemire <daniel@lemire.me> Co-authored-by: Sasha Lopoukhine <superlopuh@gmail.com> Co-authored-by: John Keiser <john@johnkeiser.com> Co-authored-by: Tan Li Boon <undisputed-seraphim@users.noreply.github.com> Co-authored-by: tobil4sk <tobil4sk@outlook.com> * update CI on the builder_development_branch (no code change) (#2262) * typo * General madness simpler, no simpler!!! (#2267) * Minimal tag_invokes for STL types * simpler madness * adding a comment * missing file * minor tweaks to style * fixing incorrect max/min usage * updating single * simplify * validating the idea * putting back the concept * moving the include * guarding * Cheap General Madness (#2268) * Some General Concepts and their deserializations * Resolving ambiguity * Add missing #include * C++20 custom deserializer: better documentation (#2269) * mostly a documentation update. * missing cpp * [no-ci] fix comment * various minor fixes --------- Co-authored-by: Daniel Lemire <dlemire@lemire.me> --------- Co-authored-by: M. Bahoosh <12122474+the-moisrex@users.noreply.github.com> Co-authored-by: Daniel Lemire <dlemire@lemire.me> Co-authored-by: M. Bahoosh <moisrex@gmail.com> * minor update * More documentation regarding builder (#2270) * minor update * more improvment to our documentation (builder branch) * putting back missing functions * merge candidate --------- Co-authored-by: M. Bahoosh <moisrex@gmail.com> Co-authored-by: Daniel Lemire <dlemire@lemire.me> Co-authored-by: Sasha Lopoukhine <superlopuh@gmail.com> Co-authored-by: John Keiser <john@johnkeiser.com> Co-authored-by: Tan Li Boon <undisputed-seraphim@users.noreply.github.com> Co-authored-by: tobil4sk <tobil4sk@outlook.com> Co-authored-by: M. Bahoosh <12122474+the-moisrex@users.noreply.github.com>
124 lines
5.0 KiB
C++
124 lines
5.0 KiB
C++
#if SIMDJSON_SUPPORTS_DESERIALIZATION
|
|
|
|
#ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H
|
|
#ifndef SIMDJSON_CONDITIONAL_INCLUDE
|
|
#define SIMDJSON_ONDEMAND_DESERIALIZE_H
|
|
#include "simdjson/generic/ondemand/base.h"
|
|
#include "simdjson/generic/ondemand/array.h"
|
|
#endif // SIMDJSON_CONDITIONAL_INCLUDE
|
|
|
|
#include <concepts>
|
|
namespace simdjson {
|
|
|
|
namespace tag_invoke_fn_ns {
|
|
void tag_invoke();
|
|
|
|
struct tag_invoke_fn {
|
|
template <typename Tag, typename... Args>
|
|
requires requires(Tag tag, Args &&...args) {
|
|
tag_invoke(std::forward<Tag>(tag), std::forward<Args>(args)...);
|
|
}
|
|
constexpr auto operator()(Tag tag, Args &&...args) const
|
|
noexcept(noexcept(tag_invoke(std::forward<Tag>(tag),
|
|
std::forward<Args>(args)...)))
|
|
-> decltype(tag_invoke(std::forward<Tag>(tag),
|
|
std::forward<Args>(args)...)) {
|
|
return tag_invoke(std::forward<Tag>(tag), std::forward<Args>(args)...);
|
|
}
|
|
};
|
|
} // namespace tag_invoke_fn_ns
|
|
|
|
inline namespace tag_invoke_ns {
|
|
inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {};
|
|
} // namespace tag_invoke_ns
|
|
|
|
template <typename Tag, typename... Args>
|
|
concept tag_invocable = requires(Tag tag, Args... args) {
|
|
tag_invoke(std::forward<Tag>(tag), std::forward<Args>(args)...);
|
|
};
|
|
|
|
template <typename Tag, typename... Args>
|
|
concept nothrow_tag_invocable =
|
|
tag_invocable<Tag, Args...> && requires(Tag tag, Args... args) {
|
|
{
|
|
tag_invoke(std::forward<Tag>(tag), std::forward<Args>(args)...)
|
|
} noexcept;
|
|
};
|
|
|
|
template <typename Tag, typename... Args>
|
|
using tag_invoke_result =
|
|
std::invoke_result<decltype(tag_invoke), Tag, Args...>;
|
|
|
|
template <typename Tag, typename... Args>
|
|
using tag_invoke_result_t =
|
|
std::invoke_result_t<decltype(tag_invoke), Tag, Args...>;
|
|
|
|
template <auto &Tag> using tag_t = std::decay_t<decltype(Tag)>;
|
|
|
|
|
|
struct deserialize_tag;
|
|
|
|
/// These types are deserializable in a built-in way
|
|
template <typename> struct is_builtin_deserializable : std::false_type {};
|
|
template <> struct is_builtin_deserializable<int64_t> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<uint64_t> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<double> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<bool> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<SIMDJSON_IMPLEMENTATION::ondemand::array> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<SIMDJSON_IMPLEMENTATION::ondemand::object> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<SIMDJSON_IMPLEMENTATION::ondemand::value> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> : std::true_type {};
|
|
template <> struct is_builtin_deserializable<std::string_view> : std::true_type {};
|
|
|
|
template <typename T>
|
|
concept is_builtin_deserializable_v = is_builtin_deserializable<T>::value;
|
|
|
|
template <typename T, typename ValT = SIMDJSON_IMPLEMENTATION::ondemand::value>
|
|
concept custom_deserializable = tag_invocable<deserialize_tag, ValT&, T&>;
|
|
|
|
template <typename T, typename ValT = SIMDJSON_IMPLEMENTATION::ondemand::value>
|
|
concept deserializable = custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>;
|
|
|
|
template <typename T, typename ValT = SIMDJSON_IMPLEMENTATION::ondemand::value>
|
|
concept nothrow_custom_deserializable = nothrow_tag_invocable<deserialize_tag, ValT&, T&>;
|
|
|
|
// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned.
|
|
template <typename T, typename ValT = SIMDJSON_IMPLEMENTATION::ondemand::value>
|
|
concept nothrow_deserializable = nothrow_custom_deserializable<T, ValT> || is_builtin_deserializable_v<T>;
|
|
|
|
/// Deserialize Tag
|
|
inline constexpr struct deserialize_tag {
|
|
using value_type = SIMDJSON_IMPLEMENTATION::ondemand::value;
|
|
using document_type = SIMDJSON_IMPLEMENTATION::ondemand::document;
|
|
using document_reference_type = SIMDJSON_IMPLEMENTATION::ondemand::document_reference;
|
|
|
|
// Customization Point for value
|
|
template <typename T>
|
|
requires custom_deserializable<T, value_type>
|
|
[[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, value_type>) {
|
|
return tag_invoke(*this, object, output);
|
|
}
|
|
|
|
// Customization Point for document
|
|
template <typename T>
|
|
requires custom_deserializable<T, document_type>
|
|
[[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_type>) {
|
|
return tag_invoke(*this, object, output);
|
|
}
|
|
|
|
// Customization Point for document reference
|
|
template <typename T>
|
|
requires custom_deserializable<T, document_reference_type>
|
|
[[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable<T, document_reference_type>) {
|
|
return tag_invoke(*this, object, output);
|
|
}
|
|
|
|
|
|
} deserialize{};
|
|
|
|
} // namespace simdjson
|
|
|
|
#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H
|
|
#endif // SIMDJSON_SUPPORTS_DESERIALIZATION
|
|
|