simdjson 4.0.7
Ridiculously Fast JSON
Loading...
Searching...
No Matches
serialization-inl.h
1#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
2
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
5#include "simdjson/generic/ondemand/base.h"
6#include "simdjson/generic/ondemand/array.h"
7#include "simdjson/generic/ondemand/document-inl.h"
8#include "simdjson/generic/ondemand/json_type.h"
9#include "simdjson/generic/ondemand/object.h"
10#include "simdjson/generic/ondemand/serialization.h"
11#include "simdjson/generic/ondemand/value.h"
12#if SIMDJSON_STATIC_REFLECTION
13#include "simdjson/generic/ondemand/json_builder.h"
14#endif
15#endif // SIMDJSON_CONDITIONAL_INCLUDE
16
17namespace simdjson {
18
19inline std::string_view trim(const std::string_view str) noexcept {
20 // We can almost surely do better by rolling our own find_first_not_of function.
21 size_t first = str.find_first_not_of(" \t\n\r");
22 // If we have the empty string (just white space), then no trimming is possible, and
23 // we return the empty string_view.
24 if (std::string_view::npos == first) { return std::string_view(); }
25 size_t last = str.find_last_not_of(" \t\n\r");
26 return str.substr(first, (last - first + 1));
27}
28
29
31 std::string_view v;
32 auto error = x.raw_json().get(v);
33 if(error) {return error; }
34 return trim(v);
35}
36
37inline simdjson_result<std::string_view> to_json_string(SIMDJSON_IMPLEMENTATION::ondemand::document_reference& x) noexcept {
38 std::string_view v;
39 auto error = x.raw_json().get(v);
40 if(error) {return error; }
41 return trim(v);
42}
43
51 using namespace SIMDJSON_IMPLEMENTATION::ondemand;
53 auto error = x.type().get(t);
54 if(error != SUCCESS) { return error; }
55 switch (t)
56 {
57 case json_type::array:
58 {
60 error = x.get_array().get(array);
61 if(error) { return error; }
62 return to_json_string(array);
63 }
64 case json_type::object:
65 {
67 error = x.get_object().get(object);
68 if(error) { return error; }
69 return to_json_string(object);
70 }
71 default:
72 return trim(x.raw_json_token());
73 }
74}
75
77 std::string_view v;
78 auto error = x.raw_json().get(v);
79 if(error) {return error; }
80 return trim(v);
81}
82
84 std::string_view v;
85 auto error = x.raw_json().get(v);
86 if(error) {return error; }
87 return trim(v);
88}
89
90inline simdjson_result<std::string_view> to_json_string(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> x) {
91 if (x.error()) { return x.error(); }
92 return to_json_string(x.value_unsafe());
93}
94
95inline simdjson_result<std::string_view> to_json_string(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_reference> x) {
96 if (x.error()) { return x.error(); }
97 return to_json_string(x.value_unsafe());
98}
99
100inline simdjson_result<std::string_view> to_json_string(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> x) {
101 if (x.error()) { return x.error(); }
102 return to_json_string(x.value_unsafe());
103}
104
105inline simdjson_result<std::string_view> to_json_string(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> x) {
106 if (x.error()) { return x.error(); }
107 return to_json_string(x.value_unsafe());
108}
109
110inline simdjson_result<std::string_view> to_json_string(simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> x) {
111 if (x.error()) { return x.error(); }
112 return to_json_string(x.value_unsafe());
113}
114} // namespace simdjson
115
116namespace simdjson { namespace SIMDJSON_IMPLEMENTATION { namespace ondemand {
117
118#if SIMDJSON_EXCEPTIONS
120 std::string_view v;
121 auto error = simdjson::to_json_string(x).get(v);
122 if(error == simdjson::SUCCESS) {
123 return (out << v);
124 } else {
125 throw simdjson::simdjson_error(error);
126 }
127}
128inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::value> x) {
129 if (x.error()) { throw simdjson::simdjson_error(x.error()); }
130 return (out << x.value());
131}
132#else
133inline std::ostream& operator<<(std::ostream& out, simdjson::SIMDJSON_IMPLEMENTATION::ondemand::value x) {
134 std::string_view v;
135 auto error = simdjson::to_json_string(x).get(v);
136 if(error == simdjson::SUCCESS) {
137 return (out << v);
138 } else {
139 return (out << error);
140 }
141}
142#endif
143
144#if SIMDJSON_EXCEPTIONS
146 std::string_view v;
147 auto error = simdjson::to_json_string(value).get(v);
148 if(error == simdjson::SUCCESS) {
149 return (out << v);
150 } else {
151 throw simdjson::simdjson_error(error);
152 }
153}
154inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::array> x) {
155 if (x.error()) { throw simdjson::simdjson_error(x.error()); }
156 return (out << x.value());
157}
158#else
159inline std::ostream& operator<<(std::ostream& out, simdjson::SIMDJSON_IMPLEMENTATION::ondemand::array value) {
160 std::string_view v;
161 auto error = simdjson::to_json_string(value).get(v);
162 if(error == simdjson::SUCCESS) {
163 return (out << v);
164 } else {
165 return (out << error);
166 }
167}
168#endif
169
170#if SIMDJSON_EXCEPTIONS
172 std::string_view v;
173 auto error = simdjson::to_json_string(value).get(v);
174 if(error == simdjson::SUCCESS) {
175 return (out << v);
176 } else {
177 throw simdjson::simdjson_error(error);
178 }
179}
180inline std::ostream& operator<<(std::ostream& out, simdjson::SIMDJSON_IMPLEMENTATION::ondemand::document_reference& value) {
181 std::string_view v;
182 auto error = simdjson::to_json_string(value).get(v);
183 if(error == simdjson::SUCCESS) {
184 return (out << v);
185 } else {
186 throw simdjson::simdjson_error(error);
187 }
188}
189inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::document>&& x) {
190 if (x.error()) { throw simdjson::simdjson_error(x.error()); }
191 return (out << x.value());
192}
193inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::document_reference>&& x) {
194 if (x.error()) { throw simdjson::simdjson_error(x.error()); }
195 return (out << x.value());
196}
197#else
198inline std::ostream& operator<<(std::ostream& out, simdjson::SIMDJSON_IMPLEMENTATION::ondemand::document& value) {
199 std::string_view v;
200 auto error = simdjson::to_json_string(value).get(v);
201 if(error == simdjson::SUCCESS) {
202 return (out << v);
203 } else {
204 return (out << error);
205 }
206}
207#endif
208
209#if SIMDJSON_EXCEPTIONS
211 std::string_view v;
212 auto error = simdjson::to_json_string(value).get(v);
213 if(error == simdjson::SUCCESS) {
214 return (out << v);
215 } else {
216 throw simdjson::simdjson_error(error);
217 }
218}
219inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result<simdjson::SIMDJSON_IMPLEMENTATION::ondemand::object> x) {
220 if (x.error()) { throw simdjson::simdjson_error(x.error()); }
221 return (out << x.value());
222}
223#else
224inline std::ostream& operator<<(std::ostream& out, simdjson::SIMDJSON_IMPLEMENTATION::ondemand::object value) {
225 std::string_view v;
226 auto error = simdjson::to_json_string(value).get(v);
227 if(error == simdjson::SUCCESS) {
228 return (out << v);
229 } else {
230 return (out << error);
231 }
232}
233#endif
234}}} // namespace simdjson::SIMDJSON_IMPLEMENTATION::ondemand
235
236#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
A document_reference is a thin wrapper around a document reference instance.
Definition document.h:798
A forward-only JSON object field iterator.
Definition object.h:20
An ephemeral JSON value returned during iteration.
Definition value.h:21
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
simdjson_result< std::string_view > to_json_string(SIMDJSON_IMPLEMENTATION::ondemand::document &x) noexcept
Create a string-view instance out of a document instance.
@ SUCCESS
No error.
Definition error.h:20
Exception thrown when an exception-supporting simdjson method is called.
Definition error.h:91
The result of a simdjson operation that could fail.
Definition error.h:278
simdjson_inline error_code error() const noexcept
The error.
Definition error-inl.h:168
simdjson_inline T & value() &noexcept(false)
Get the result value.
Definition error-inl.h:175