12 #ifndef __UT_SERIALIZATION_H_INCLUDED__
13 #define __UT_SERIALIZATION_H_INCLUDED__
104 #include <type_traits>
115 template <
typename ARCHIVER_T,
typename OBJ_T>
119 return obj.serialize(archiver);
126 template <
typename ARCHIVER_T,
typename OBJ_T>
134 template <
typename ARCHIVER_T,
typename OBJ_T>
148 template <
typename OBJ_T>
151 template <
typename ARCHIVER_T>
152 static bool invoke(ARCHIVER_T &archiver, OBJ_T &obj)
157 template <
typename OBJ_T>
160 template <
typename ARCHIVER_T>
161 static bool invoke(ARCHIVER_T &archiver, OBJ_T &obj)
169 #define UT_DECLARE_SERIALIZABLE(OBJ_T) \
170 template <typename ARCHIVER_T> \
171 bool UTserialize(ARCHIVER_T &archiver, OBJ_T &obj) \
173 return archiver.serializeValue(obj); \
184 #undef UT_DECLARE_SERIALIZABLE
187 template <
typename ARCHIVER_T>
191 return archiver.serializeStringValue(str);
193 template <
typename ARCHIVER_T>
198 if (!archiver.serializeStringValue(buf))
203 template <
typename ARCHIVER_T>
207 return archiver.serializeStringValue(str.
buffer());
209 template <
typename ARCHIVER_T>
213 return archiver.serializeStringValue(str);
215 template <
typename ARCHIVER_T>
219 return archiver.serializeStringValue(str.
c_str());
221 template <
typename ARCHIVER_T>
226 if (!archiver.serializeStringValue(buf))
237 template <
typename T,
template <
typename>
class ARRAY>
240 template <
typename ARCHIVER_T>
241 static bool invoke(ARCHIVER_T &archiver, ARRAY<T> &vec)
243 if (!archiver.serializeArrayBegin(vec.entries()))
245 if (!archiver.serializeArray(vec.array(), vec.entries()))
247 if (!archiver.serializeArrayEnd())
252 template <
typename T,
template <
typename>
class ARRAY>
255 template <
typename ARCHIVER_T>
256 static bool invoke(ARCHIVER_T &archiver, ARRAY<T> &vec)
259 if (!archiver.serializeArrayBegin(count))
262 if (!archiver.serializeArray(vec.array(), vec.entries()))
264 if (!archiver.serializeArrayEnd())
269 #define UT_DECLARE_ARRAY_SERIALIZABLE(ARRAY_T) \
270 template <typename T> \
271 struct UT_SaveSerializable< ARRAY_T<T> > \
272 : public UT_ArraySaveSerializable<T, ARRAY_T> { }; \
273 template <typename T> \
274 struct UT_LoadSerializable< ARRAY_T<T> > \
275 : public UT_ArrayLoadSerializable<T, ARRAY_T> { }; \
279 #undef UT_DECLARE_ARRAY_SERIALIZABLE
285 template <
typename V1,
typename V2,
template <
typename,
typename>
class PairT>
288 template <
typename ARCHIVER_T>
289 static bool invoke(ARCHIVER_T &archiver, PairT<V1,V2> &
val)
291 if (!archiver.serializeListBegin())
293 if (!archiver.serializeValue(val.first))
295 if (!archiver.serializeValue(val.second))
297 if (!archiver.serializeListEnd())
302 #define UT_DECLARE_PAIR_SERIALIZABLE(PAIR_T) \
303 template <typename V1, typename V2> \
304 struct UT_SaveSerializable< PAIR_T<V1,V2> > \
305 : public UT_PairSerializable<V1, V2, PAIR_T> { }; \
306 template <typename V1, typename V2> \
307 struct UT_LoadSerializable< PAIR_T<V1,V2> > \
308 : public UT_PairSerializable<V1, V2, PAIR_T> { }; \
311 #undef UT_DECLARE_PAIR_SERIALIZABLE
319 template <
typename>
class StringMapT
323 template <
typename ARCHIVER_T>
324 static bool invoke(ARCHIVER_T &archiver, StringMapT<V> &map)
326 if (!archiver.serializeMapBegin())
328 for (
auto &[key,
val] : map)
330 if (!archiver.serializeKey(key))
335 if (!archiver.serializeMapEnd())
343 template <
typename>
class StringMapT
347 template <
typename ARCHIVER_T>
348 static bool invoke(ARCHIVER_T &archiver, StringMapT<V> &map)
352 if (!archiver.serializeMapBegin())
355 while (!archiver.serializeMapEnd())
357 if (!archiver.serializeKey(key))
367 #define UT_DECLARE_STRINGMAP_SERIALIZABLE(MAP_T) \
368 template <typename V> \
369 struct UT_SaveSerializable< MAP_T<V> > \
370 : public UT_StringMapSaveSerializable<V, MAP_T> { }; \
371 template <typename V> \
372 struct UT_LoadSerializable< MAP_T<V> > \
373 : public UT_StringMapLoadSerializable<V, MAP_T> { }; \
379 #undef UT_DECLARE_ARRAY_SERIALIZABLE
385 template <
typename ARCHIVER_T>
392 SaveKeyValue(ARCHIVER_T &archiver)
393 : myArchiver(archiver)
397 template <
typename PAIR_T>
404 if (!myArchiver.serializeKey(get<0>(p)))
413 ARCHIVER_T & myArchiver;
420 template <
typename T>
423 ARCHIVER_T *subclass =
static_cast<ARCHIVER_T *
>(
this);
436 template <
typename SEQ_T>
439 ARCHIVER_T *subclass =
static_cast<ARCHIVER_T *
>(
this);
440 if (!subclass->serializeMapBegin())
442 SaveKeyValue saver(*subclass);
445 if (!subclass->serializeMapEnd())
452 template <
typename ARCHIVER_T>
459 LoadKeyValue(ARCHIVER_T &archiver,
const char *key,
bool &ok)
460 : myArchiver(archiver)
467 template <
typename PAIR_T>
474 if (::strcmp(myKey, get<0>(p)) != 0)
486 ARCHIVER_T & myArchiver;
496 template <
typename T>
499 ARCHIVER_T *subclass =
static_cast<ARCHIVER_T *
>(
this);
514 template <
typename SEQ_T>
515 bool operator()(
const SEQ_T &pair_seq,
bool case_sensitive=
false)
518 ARCHIVER_T * subclass =
static_cast<ARCHIVER_T *
>(
this);
521 if (!subclass->serializeMapBegin())
524 while (!subclass->serializeMapEnd())
526 if (!subclass->serializeKey(key))
530 LoadKeyValue loader(*subclass, key.
buffer(), ok);
545 template <
typename OBJ_T,
typename ARCHIVER_T>
563 template <
typename OBJ_T,
typename ARCHIVER_T>
573 typename ARCHIVER_T::Input archiver(in);
584 template <
typename OBJ_T,
typename ARCHIVER_T>
586 operator<<(UT_OStream &out, UT_SaveArchiverManip<OBJ_T,ARCHIVER_T> manip)
591 template <
typename OBJ_T,
typename ARCHIVER_T>
598 #endif // __UT_SERIALIZATION_H_INCLUDED__
GLenum GLuint GLenum GLsizei const GLchar * buf
static bool invoke(ARCHIVER_T &archiver, OBJ_T &obj)
bool operator()(const SEQ_T &pair_seq, bool=false)
constexpr bool isLoading() const
SYS_FORCE_INLINE const char * buffer() const
bool serializeArray(T *vec, int64 count)
bool serializeArray(T *vec, int64 count)
constexpr auto in(type t, int set) -> bool
UT_IStream & operator>>(UT_IStream &in, UT_LoadArchiverManip< OBJ_T, ARCHIVER_T > manip)
UT_IStream manipulator >> overload.
bool UTtupleAnyOf(T &&tuple, F &&f)
static bool invoke(ARCHIVER_T &archiver, StringMapT< V > &map)
Base class for archivers.
constexpr bool isSaving() const
static bool invoke(ARCHIVER_T &archiver, StringMapT< V > &map)
static bool invoke(ARCHIVER_T &archiver, ARRAY< T > &vec)
void harden()
Take shallow copy and make it deep.
#define UT_DECLARE_ARRAY_SERIALIZABLE(ARRAY_T)
SYS_FORCE_INLINE const char * c_str() const
#define UT_DECLARE_SERIALIZABLE(OBJ_T)
UT_LoadArchiverManip(OBJ_T &obj)
UT_OStream & operator()(UT_OStream &out)
void setError(bool is_error)
constexpr bool isLoading() const
static bool invoke(ARCHIVER_T &archiver, ARRAY< T > &vec)
constexpr bool isSaving() const
bool UTserializeSave(ARCHIVER_T &archiver, OBJ_T &obj)
bool UTserialize(ARCHIVER_T &archiver, OBJ_T &obj)
UT_SaveArchiverManip(OBJ_T &obj)
static bool invoke(ARCHIVER_T &archiver, OBJ_T &obj)
static bool invoke(ARCHIVER_T &archiver, PairT< V1, V2 > &val)
#define UT_DECLARE_PAIR_SERIALIZABLE(PAIR_T)
#define UT_DECLARE_STRINGMAP_SERIALIZABLE(MAP_T)
Manipulators for streaming archivers.
UT_IStream & operator()(UT_IStream &in)
bool UTserializeLoad(ARCHIVER_T &archiver, OBJ_T &obj)
bool operator()(const SEQ_T &pair_seq, bool case_sensitive=false)
void lower()
Convert string to lower case.
void setstate(std::ios::iostate state)