52 struct SC_SERIALIZATION_TEXT_EXPORT
Options
67 template <
typename T,
typename B>
70 GrowableBuffer<B> gb = {buffer};
73 Writer stream(output, options);
74 if (not stream.onSerializationStart())
76 if (not Serialization::SerializationTextReadWriteExact<Writer, T>::serialize(0,
object, stream))
78 return stream.onSerializationEnd();
94 return Serialization::SerializationTextReadWriteExact<Reader, T>::serialize(0,
object, stream);
103 template <
typename T>
107 return Serialization::SerializationTextReadVersioned<Reader, T, void>::loadVersioned(0,
object, stream);
113 struct SC_SERIALIZATION_TEXT_EXPORT Writer
117 Writer(
StringFormatOutput& output, Options options) : output(output), options(options) {}
119 [[nodiscard]]
bool onSerializationStart();
120 [[nodiscard]]
bool onSerializationEnd();
122 [[nodiscard]]
bool setOptions(Options opt);
124 [[nodiscard]]
bool startObject(uint32_t index);
125 [[nodiscard]]
bool endObject();
127 [[nodiscard]]
bool startArray(uint32_t index);
128 [[nodiscard]]
bool endArray();
130 template <
typename Container>
131 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
133 if (not eventuallyAddComma(index))
135 size =
static_cast<uint32_t
>(container.size());
136 return output.append(
"["_a8);
139 template <
typename Container>
140 [[nodiscard]]
bool endArrayItem(Container&, uint32_t&)
145 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
147 template <
typename T>
148 [[nodiscard]]
bool serialize(uint32_t index, T& text)
150 return serializeStringView(index, text.view());
153 [[nodiscard]]
bool serialize(uint32_t index, StringSpan text);
154 [[nodiscard]]
bool serialize(uint32_t index, StringView text);
155 [[nodiscard]]
bool serialize(uint32_t index,
float value);
156 [[nodiscard]]
bool serialize(uint32_t index,
double value);
157 [[nodiscard]]
bool serialize(uint32_t index,
int value);
160 [[nodiscard]]
bool serializeStringView(uint32_t index, StringView text);
162 bool eventuallyAddComma(uint32_t index);
164 char floatFormatStorage[5];
165 StringSpan floatFormat;
171 struct SC_SERIALIZATION_TEXT_EXPORT Reader
173 Reader(StringView text) : iteratorText(text), iterator(text.getIterator<StringIteratorASCII>()) {}
175 [[nodiscard]]
bool onSerializationStart() {
return true; }
176 [[nodiscard]]
bool onSerializationEnd() {
return true; }
178 [[nodiscard]]
bool startObject(uint32_t index);
179 [[nodiscard]]
bool endObject();
181 [[nodiscard]]
bool startArray(uint32_t index);
182 [[nodiscard]]
bool endArray();
184 template <
typename Container>
185 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
187 if (not tokenizeArrayStart(index))
189 return endArrayItem(container, size);
192 template <
typename Container>
193 [[nodiscard]]
bool endArrayItem(Container& container, uint32_t& size)
196 if (not tokenizeArrayEnd(size))
199 return Reflection::ExtendedTypeInfo<Container>::resize(container, size);
203 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
204 [[nodiscard]]
bool getNextField(uint32_t index, StringSpan& text,
bool& hasMore);
206 [[nodiscard]]
bool serialize(uint32_t index,
bool& value);
207 [[nodiscard]]
bool serialize(uint32_t index,
float& value);
208 [[nodiscard]]
bool serialize(uint32_t index, int32_t& value);
209 [[nodiscard]]
bool serialize(uint32_t index, StringSpan& value);
210 [[nodiscard]]
bool serialize(uint32_t index, StringView& value);
212 template <
typename T>
213 [[nodiscard]]
bool serialize(uint32_t index, T& text)
216 auto escaped = serializeInternal(index, succeeded);
220 GrowableBuffer<T> gb = {text};
221 StringFormatOutput output(StringEncoding::Utf8, gb);
223 output.onFormatBegin();
224 if (not appendJSONStringUnescaped(escaped, output))
226 output.onFormatFailed();
229 return output.onFormatSucceeded();
233 [[nodiscard]]
static bool appendJSONStringUnescaped(StringView escaped, StringFormatOutput& output);
234 [[nodiscard]] StringView serializeInternal(uint32_t index,
bool& succeeded);
236 [[nodiscard]]
bool tokenizeArrayStart(uint32_t index);
237 [[nodiscard]]
bool tokenizeArrayEnd(uint32_t& size);
238 [[nodiscard]]
bool eventuallyExpectComma(uint32_t index);
240 StringView iteratorText;
241 StringIteratorASCII iterator;