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,
float value);
154 [[nodiscard]]
bool serialize(uint32_t index,
double value);
155 [[nodiscard]]
bool serialize(uint32_t index,
int value);
158 [[nodiscard]]
bool serializeStringView(uint32_t index, StringView text);
160 bool eventuallyAddComma(uint32_t index);
162 char floatFormatStorage[5];
163 StringSpan floatFormat;
169 struct SC_SERIALIZATION_TEXT_EXPORT Reader
171 Reader(StringView text) : iteratorText(text), iterator(text.getIterator<StringIteratorASCII>()) {}
173 [[nodiscard]]
bool onSerializationStart() {
return true; }
174 [[nodiscard]]
bool onSerializationEnd() {
return true; }
176 [[nodiscard]]
bool startObject(uint32_t index);
177 [[nodiscard]]
bool endObject();
179 [[nodiscard]]
bool startArray(uint32_t index);
180 [[nodiscard]]
bool endArray();
182 template <
typename Container>
183 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
185 if (not tokenizeArrayStart(index))
187 return endArrayItem(container, size);
190 template <
typename Container>
191 [[nodiscard]]
bool endArrayItem(Container& container, uint32_t& size)
194 if (not tokenizeArrayEnd(size))
197 return Reflection::ExtendedTypeInfo<Container>::resize(container, size);
201 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
202 [[nodiscard]]
bool getNextField(uint32_t index, StringSpan& text,
bool& hasMore);
204 [[nodiscard]]
bool serialize(uint32_t index,
bool& value);
205 [[nodiscard]]
bool serialize(uint32_t index,
float& value);
206 [[nodiscard]]
bool serialize(uint32_t index, int32_t& value);
208 template <
typename T>
209 [[nodiscard]]
bool serialize(uint32_t index, T& text)
212 auto result = serializeInternal(index, succeeded);
213 return succeeded and text.assign(result);
217 [[nodiscard]] StringView serializeInternal(uint32_t index,
bool& succeeded);
219 [[nodiscard]]
bool tokenizeArrayStart(uint32_t index);
220 [[nodiscard]]
bool tokenizeArrayEnd(uint32_t& size);
221 [[nodiscard]]
bool eventuallyExpectComma(uint32_t index);
223 StringView iteratorText;
224 StringIteratorASCII iterator;