61 template <
typename T,
typename B>
64 GrowableBuffer<B> gb = {buffer};
67 Writer stream(output, options);
68 if (not stream.onSerializationStart())
70 if (not Serialization::SerializationTextReadWriteExact<Writer, T>::serialize(0,
object, stream))
72 return stream.onSerializationEnd();
88 return Serialization::SerializationTextReadWriteExact<Reader, T>::serialize(0,
object, stream);
101 return Serialization::SerializationTextReadVersioned<Reader, T>::loadVersioned(0,
object, stream);
107 struct SC_COMPILER_EXPORT Writer
111 Writer(
StringFormatOutput& output, Options options) : output(output), options(options) {}
113 [[nodiscard]]
bool onSerializationStart();
114 [[nodiscard]]
bool onSerializationEnd();
116 [[nodiscard]]
bool setOptions(Options opt);
118 [[nodiscard]]
bool startObject(uint32_t index);
119 [[nodiscard]]
bool endObject();
121 [[nodiscard]]
bool startArray(uint32_t index);
122 [[nodiscard]]
bool endArray();
124 template <
typename Container>
125 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
127 if (not eventuallyAddComma(index))
129 size =
static_cast<uint32_t
>(container.size());
130 return output.append(
"["_a8);
133 template <
typename Container>
134 [[nodiscard]]
bool endArrayItem(Container&, uint32_t&)
139 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
141 template <
typename T>
142 [[nodiscard]]
bool serialize(uint32_t index, T& text)
144 return serializeStringView(index, text.view());
147 [[nodiscard]]
bool serialize(uint32_t index,
float value);
148 [[nodiscard]]
bool serialize(uint32_t index,
double value);
149 [[nodiscard]]
bool serialize(uint32_t index,
int value);
152 [[nodiscard]]
bool serializeStringView(uint32_t index, StringView text);
154 bool eventuallyAddComma(uint32_t index);
156 char floatFormatStorage[5];
157 StringSpan floatFormat;
163 struct SC_COMPILER_EXPORT Reader
165 Reader(StringView text) : iteratorText(text), iterator(text.getIterator<StringIteratorASCII>()) {}
167 [[nodiscard]]
bool onSerializationStart() {
return true; }
168 [[nodiscard]]
bool onSerializationEnd() {
return true; }
170 [[nodiscard]]
bool startObject(uint32_t index);
171 [[nodiscard]]
bool endObject();
173 [[nodiscard]]
bool startArray(uint32_t index);
174 [[nodiscard]]
bool endArray();
176 template <
typename Container>
177 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
179 if (not tokenizeArrayStart(index))
181 return endArrayItem(container, size);
184 template <
typename Container>
185 [[nodiscard]]
bool endArrayItem(Container& container, uint32_t& size)
188 if (not tokenizeArrayEnd(size))
191 return Reflection::ExtendedTypeInfo<Container>::resize(container, size);
195 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
196 [[nodiscard]]
bool getNextField(uint32_t index, StringSpan& text,
bool& hasMore);
198 [[nodiscard]]
bool serialize(uint32_t index,
bool& value);
199 [[nodiscard]]
bool serialize(uint32_t index,
float& value);
200 [[nodiscard]]
bool serialize(uint32_t index, int32_t& value);
202 template <
typename T>
203 [[nodiscard]]
bool serialize(uint32_t index, T& text)
206 auto result = serializeInternal(index, succeeded);
207 return succeeded and text.assign(result);
211 [[nodiscard]] StringView serializeInternal(uint32_t index,
bool& succeeded);
213 [[nodiscard]]
bool tokenizeArrayStart(uint32_t index);
214 [[nodiscard]]
bool tokenizeArrayEnd(uint32_t& size);
215 [[nodiscard]]
bool eventuallyExpectComma(uint32_t index);
217 StringView iteratorText;
218 StringIteratorASCII iterator;