64 Writer stream(output, options);
65 if (not stream.onSerializationStart())
67 if (not Serialization::SerializationTextReadWriteExact<Writer, T>::serialize(0,
object, stream))
69 return stream.onSerializationEnd();
85 return Serialization::SerializationTextReadWriteExact<Reader, T>::serialize(0,
object, stream);
98 return Serialization::SerializationTextReadVersioned<Reader, T>::loadVersioned(0,
object, stream);
104 struct SC_COMPILER_EXPORT Writer
108 Writer(
StringFormatOutput& output, Options options) : output(output), options(options) {}
110 [[nodiscard]]
bool onSerializationStart();
111 [[nodiscard]]
bool onSerializationEnd();
113 [[nodiscard]]
bool setOptions(Options opt);
115 [[nodiscard]]
bool startObject(uint32_t index);
116 [[nodiscard]]
bool endObject();
118 [[nodiscard]]
bool startArray(uint32_t index);
119 [[nodiscard]]
bool endArray();
121 template <
typename Container>
122 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
124 if (not eventuallyAddComma(index))
126 size =
static_cast<uint32_t
>(container.size());
127 return output.append(
"["_a8);
130 template <
typename Container>
131 [[nodiscard]]
bool endArrayItem(Container&, uint32_t&)
136 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
138 template <
typename T>
139 [[nodiscard]]
bool serialize(uint32_t index, T& text)
141 return serializeStringView(index, text.view());
144 [[nodiscard]]
bool serialize(uint32_t index,
float value);
145 [[nodiscard]]
bool serialize(uint32_t index,
double value);
146 [[nodiscard]]
bool serialize(uint32_t index,
int value);
149 [[nodiscard]]
bool serializeStringView(uint32_t index, StringView text);
151 bool eventuallyAddComma(uint32_t index);
153 char floatFormatStorage[5];
154 StringSpan floatFormat;
160 struct SC_COMPILER_EXPORT Reader
162 Reader(StringView text) : iteratorText(text), iterator(text.getIterator<StringIteratorASCII>()) {}
164 [[nodiscard]]
bool onSerializationStart() {
return true; }
165 [[nodiscard]]
bool onSerializationEnd() {
return true; }
167 [[nodiscard]]
bool startObject(uint32_t index);
168 [[nodiscard]]
bool endObject();
170 [[nodiscard]]
bool startArray(uint32_t index);
171 [[nodiscard]]
bool endArray();
173 template <
typename Container>
174 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
176 if (not tokenizeArrayStart(index))
178 return endArrayItem(container, size);
181 template <
typename Container>
182 [[nodiscard]]
bool endArrayItem(Container& container, uint32_t& size)
185 if (not tokenizeArrayEnd(size))
188 return Reflection::ExtendedTypeInfo<Container>::resize(container, size);
192 [[nodiscard]]
bool startObjectField(uint32_t index, StringView text);
193 [[nodiscard]]
bool getNextField(uint32_t index, StringSpan& text,
bool& hasMore);
195 [[nodiscard]]
bool serialize(uint32_t index,
bool& value);
196 [[nodiscard]]
bool serialize(uint32_t index,
float& value);
197 [[nodiscard]]
bool serialize(uint32_t index, int32_t& value);
199 template <
typename T>
200 [[nodiscard]]
bool serialize(uint32_t index, T& text)
203 auto result = serializeInternal(index, succeeded);
204 return succeeded and text.assign(result);
208 [[nodiscard]] StringView serializeInternal(uint32_t index,
bool& succeeded);
210 [[nodiscard]]
bool tokenizeArrayStart(uint32_t index);
211 [[nodiscard]]
bool tokenizeArrayEnd(uint32_t& size);
212 [[nodiscard]]
bool eventuallyExpectComma(uint32_t index);
214 StringView iteratorText;
215 StringIteratorASCII iterator;
static bool write(T &object, StringFormatOutput &output, Options options=Options())
Writes a C++ object to JSON using Reflection.
Definition SerializationJson.h:62