1#ifndef SIMDJSON_GENERIC_BUILDER_H
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_STRING_BUILDER_H
5#include "simdjson/generic/builder/json_string_builder.h"
6#include "simdjson/concepts.h"
8#if SIMDJSON_STATIC_REFLECTION
21namespace SIMDJSON_IMPLEMENTATION {
25 requires(concepts::container_but_not_string<T> && !require_custom_serialization<T>)
26constexpr void atom(string_builder &b,
const T &t) {
36 for (; it != end; ++it) {
44 requires(std::is_same_v<T, std::string> ||
45 std::is_same_v<T, std::string_view> ||
46 std::is_same_v<T, const char *> ||
47 std::is_same_v<T, char>)
48constexpr void atom(string_builder &b,
const T &t) {
49 b.escape_and_append_with_quotes(t);
52template <concepts::
string_view_keyed_map T>
53 requires(!require_custom_serialization<T>)
54constexpr void atom(string_builder &b,
const T &m) {
61 for (
const auto& [key, value] : m) {
67 b.escape_and_append_with_quotes(key);
75template<
typename number_type,
76 typename =
typename std::enable_if<std::is_arithmetic<number_type>::value && !std::is_same_v<number_type, char>>::type>
77constexpr void atom(string_builder &b,
const number_type t) {
82 requires(std::is_class_v<T> && !concepts::container_but_not_string<T> &&
83 !concepts::string_view_keyed_map<T> &&
84 !concepts::optional_type<T> &&
85 !concepts::smart_pointer<T> &&
86 !concepts::appendable_containers<T> &&
87 !std::is_same_v<T, std::string> &&
88 !std::is_same_v<T, std::string_view> &&
89 !std::is_same_v<T, const char*> &&
90 !std::is_same_v<T, char> && !require_custom_serialization<T>)
91constexpr void atom(string_builder &b,
const T &t) {
94 template for (
constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) {
97 constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm)));
107template <concepts::optional_type T>
108 requires(!require_custom_serialization<T>)
109constexpr void atom(string_builder &b,
const T &opt) {
111 atom(b, opt.value());
113 b.append_raw(
"null");
118template <concepts::smart_po
inter T>
119 requires(!require_custom_serialization<T>)
120constexpr void atom(string_builder &b,
const T &ptr) {
124 b.append_raw(
"null");
130 requires(std::is_enum_v<T> && !require_custom_serialization<T>)
131void atom(string_builder &b,
const T &e) {
132#if SIMDJSON_STATIC_REFLECTION
133 constexpr auto enumerators = std::define_static_array(std::meta::enumerators_of(^^T));
134 template for (
constexpr auto enum_val : enumerators) {
135 constexpr auto enum_str = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(enum_val)));
136 if (e == [:enum_val:]) {
137 b.append_raw(enum_str);
142 atom(b,
static_cast<std::underlying_type_t<T>
>(e));
145 atom(b,
static_cast<std::underlying_type_t<T>
>(e));
150template <concepts::appendable_containers T>
151 requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> &&
152 !concepts::optional_type<T> && !concepts::smart_pointer<T> &&
153 !std::is_same_v<T, std::string> &&
154 !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>)
155constexpr void atom(string_builder &b,
const T &container) {
156 if (container.empty()) {
162 for (
const auto& item : container) {
174 requires(std::is_arithmetic_v<T> && !std::is_same_v<T, char>)
175void append(string_builder &b,
const T &t) {
180 requires(std::is_same_v<T, std::string> ||
181 std::is_same_v<T, std::string_view> ||
182 std::is_same_v<T, const char *> ||
183 std::is_same_v<T, char>)
184void append(string_builder &b,
const T &t) {
188template <concepts::optional_type T>
189 requires(!require_custom_serialization<T>)
190void append(string_builder &b,
const T &t) {
194template <concepts::smart_po
inter T>
195 requires(!require_custom_serialization<T>)
196void append(string_builder &b,
const T &t) {
200template <concepts::appendable_containers T>
201 requires(!concepts::container_but_not_string<T> && !concepts::string_view_keyed_map<T> &&
202 !concepts::optional_type<T> && !concepts::smart_pointer<T> &&
203 !std::is_same_v<T, std::string> &&
204 !std::is_same_v<T, std::string_view> && !std::is_same_v<T, const char*> && !require_custom_serialization<T>)
205void append(string_builder &b,
const T &t) {
209template <concepts::
string_view_keyed_map T>
210 requires(!require_custom_serialization<T>)
211void append(string_builder &b,
const T &t) {
217 requires(std::is_class_v<Z> && !concepts::container_but_not_string<Z> &&
218 !concepts::string_view_keyed_map<Z> &&
219 !concepts::optional_type<Z> &&
220 !concepts::smart_pointer<Z> &&
221 !concepts::appendable_containers<Z> &&
222 !std::is_same_v<Z, std::string> &&
223 !std::is_same_v<Z, std::string_view> &&
224 !std::is_same_v<Z, const char*> &&
225 !std::is_same_v<Z, char> && !require_custom_serialization<Z>)
226void append(string_builder &b,
const Z &z) {
229 template for (
constexpr auto dm : std::define_static_array(std::meta::nonstatic_data_members_of(^^Z, std::meta::access_context::unchecked()))) {
232 constexpr auto key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(dm)));
243 requires(concepts::container_but_not_string<Z> && !require_custom_serialization<Z>)
244void append(string_builder &b,
const Z &z) {
254 for (; it != end; ++it) {
262 requires (require_custom_serialization<Z>)
263void append(string_builder &b,
const Z &z) {
269simdjson_warn_unused simdjson_result<std::string>
to_json_string(
const Z &z,
size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) {
270 string_builder b(initial_capacity);
273 if(
auto e = b.view().get(s); e) {
return e; }
274 return std::string(s);
278simdjson_warn_unused
error_code to_json(
const Z &z, std::string &s,
size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) {
279 string_builder b(initial_capacity);
281 std::string_view view;
282 if(
auto e = b.view().get(view); e) {
return e; }
288string_builder& operator<<(string_builder& b,
const Z& z) {
294template<constevalutil::fixed_string... FieldNames,
typename T>
295 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
296void extract_from(string_builder &b,
const T &obj) {
298 auto should_extract = [](std::string_view field_name)
constexpr ->
bool {
299 return ((FieldNames.view() == field_name) || ...);
306 template for (
constexpr auto mem : std::define_static_array(
307 std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::unchecked()))) {
309 if constexpr (std::meta::is_public(mem)) {
310 constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem));
313 if constexpr (should_extract(key)) {
320 constexpr auto quoted_key = std::define_static_string(constevalutil::consteval_to_quoted_escaped(std::meta::identifier_of(mem)));
321 b.append_raw(quoted_key);
325 atom(b, obj.[:mem:]);
333template<constevalutil::fixed_string... FieldNames,
typename T>
334 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
335simdjson_warn_unused simdjson_result<std::string> extract_from(
const T &obj,
size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) {
336 string_builder b(initial_capacity);
337 extract_from<FieldNames...>(b, obj);
339 if(
auto e = b.view().get(s); e) {
return e; }
340 return std::string(s);
347simdjson_warn_unused simdjson_result<std::string> to_json(
const Z &z,
size_t initial_capacity = SIMDJSON_IMPLEMENTATION::builder::string_builder::DEFAULT_INITIAL_CAPACITY) {
348 SIMDJSON_IMPLEMENTATION::builder::string_builder b(initial_capacity);
349 SIMDJSON_IMPLEMENTATION::builder::append(b, z);
351 if(
auto e = b.view().get(s); e) {
return e; }
352 return std::string(s);
355simdjson_warn_unused
error_code to_json(
const Z &z, std::string &s,
size_t initial_capacity = SIMDJSON_IMPLEMENTATION::builder::string_builder::DEFAULT_INITIAL_CAPACITY) {
356 SIMDJSON_IMPLEMENTATION::builder::string_builder b(initial_capacity);
357 SIMDJSON_IMPLEMENTATION::builder::append(b, z);
358 std::string_view view;
359 if(
auto e = b.view().get(view); e) {
return e; }
364template<constevalutil::fixed_string... FieldNames,
typename T>
365 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
366simdjson_warn_unused simdjson_result<std::string> extract_from(
const T &obj,
size_t initial_capacity = SIMDJSON_IMPLEMENTATION::builder::string_builder::DEFAULT_INITIAL_CAPACITY) {
367 SIMDJSON_IMPLEMENTATION::builder::string_builder b(initial_capacity);
368 SIMDJSON_IMPLEMENTATION::builder::extract_from<FieldNames...>(b, obj);
370 if(
auto e = b.view().get(s); e) {
return e; }
371 return std::string(s);
The top level simdjson namespace, containing everything the library provides.
simdjson_result< std::string_view > to_json_string(SIMDJSON_IMPLEMENTATION::ondemand::document &x) noexcept
Create a string-view instance out of a document instance.
error_code
All possible errors returned by simdjson.