13 #include <type_traits>
23 template<
typename T>
class MemBuffer;
24 template<
typename T>
struct SerializeClassVersion;
74 template<
typename Base,
typename T>
78 self().
serialize(tag, static_cast<Base&>(t));
97 template<
typename Base,
typename T>
206 template<
typename T>
void attribute(
const char* name, T& t)
210 void attribute(
const char* name,
const char* value);
316 inline Derived&
self()
318 return static_cast<Derived&
>(*this);
374 if (std::is_polymorphic<T>::value) {
375 return generateID1(p);
377 return generateID2(p,
typeid(T));
381 template<
typename T>
unsigned getId(
const T* p)
383 if (std::is_polymorphic<T>::value) {
386 return getID2(p,
typeid(T));
394 unsigned generateID1(
const void* p);
395 unsigned generateID2(
const void* p,
const std::type_info& typeInfo);
396 unsigned getID1(
const void* p);
397 unsigned getID2(
const void* p,
const std::type_info& typeInfo);
399 std::map<std::pair<const void*, TypeInfo>,
unsigned> idMap;
400 std::map<const void*, unsigned> polyIdMap;
404 template<
typename Derived>
408 template<
typename Base,
typename T>
414 "base and derived must have same version when "
415 "using serializeInlinedBase()");
423 saver(this->
self(), t,
true);
430 template<
typename T,
typename T1>
435 template<
typename T,
typename T1,
typename T2>
440 template<
typename T,
typename T1,
typename T2,
typename T3>
448 void serialize_blob(
const char* tag,
const void* data,
size_t len);
450 template<
typename T>
void serialize(
const char* tag,
const T& t)
454 saver(this->
self(), t,
false);
461 saver(this->
self(), t);
467 "must be a polymorphic type");
475 this->
self().saveChar(c);
509 auto it = sharedPtrMap.find(r);
510 if (it == sharedPtrMap.end()) {
514 s = std::static_pointer_cast<T>(it->second);
522 std::map<unsigned, void*> idMap;
523 std::map<void*, std::shared_ptr<void>> sharedPtrMap;
526 template<
typename Derived>
535 template<
typename T,
typename T1>
540 template<
typename T,
typename T1,
typename T2>
545 template<
typename T,
typename T1,
typename T2,
typename T3>
548 doSerialize(tag, t, std::tuple<T1, T2, T3>(t1, t2, t3));
556 typedef typename std::remove_const<T>::type TNC;
557 auto& tnc =
const_cast<TNC&
>(t);
559 loader(this->
self(), tnc, std::make_tuple(), -1);
565 typedef typename std::remove_const<T>::type TNC;
566 auto& tnc =
const_cast<TNC&
>(t);
568 loader(this->
self(), tnc);
574 "must be a polymorphic type");
582 this->
self().loadChar(c);
588 template<
typename T,
typename TUPLE>
592 typedef typename std::remove_const<T>::type TNC;
593 auto& tnc =
const_cast<TNC&
>(t);
595 loader(this->
self(), tnc, args,
id);
613 assert(openSections.empty());
618 template <
typename T>
void save(
const T& t)
626 void save(
const std::string& s);
634 openSections.push_back(beginPos);
638 assert(!openSections.empty());
640 size_t beginPos = openSections.back();
641 openSections.pop_back();
642 size_t skip = endPos - beginPos;
643 buffer.
insertAt(beginPos -
sizeof(skip),
644 &skip,
sizeof(skip));
650 void put(
const void* data,
size_t len)
658 std::vector<size_t> openSections;
679 template<
typename T>
void load(T& t)
687 void load(std::string& s);
700 void get(
void* data,
size_t len)
703 buffer.
read(data, len);
724 template <
typename T>
void save(
const T& t)
729 void save(
const std::string& str);
731 void save(
unsigned char b);
732 void save(
signed char c);
735 void save(
unsigned u);
736 void save(
unsigned long long ull);
747 void endTag(
const char* tag);
753 template<
typename T>
void attribute(
const char* name,
const T& t)
757 void attribute(
const char* name,
const std::string& str);
759 void attribute(
const char* name,
unsigned u);
764 std::vector<XMLElement*> current;
774 return actual >= required;
778 return actual < required;
781 template<
typename T>
void load(T& t)
785 std::istringstream is(str);
789 void load(std::string& t);
791 void load(
unsigned char& b);
792 void load(
signed char& c);
795 void load(
unsigned& u);
796 void load(
unsigned long long& ull);
806 void endTag(
const char* tag);
812 std::istringstream is(str);
815 template<
typename T>
void attribute(
const char* name, T& t)
819 void attribute(
const char* name, std::string& t);
820 void attribute(
const char* name,
int& i);
821 void attribute(
const char* name,
unsigned& u);
829 std::vector<std::pair<const XMLElement*, size_t>> elems;
832 #define INSTANTIATE_SERIALIZE_METHODS(CLASS) \
833 template void CLASS::serialize(MemInputArchive&, unsigned); \
834 template void CLASS::serialize(MemOutputArchive&, unsigned); \
835 template void CLASS::serialize(XmlInputArchive&, unsigned); \
836 template void CLASS::serialize(XmlOutputArchive&, unsigned);