Changeset View
Changeset View
Standalone View
Standalone View
src/serialize.h
| Show First 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | |||||
| enum { | enum { | ||||
| // primary actions | // primary actions | ||||
| SER_NETWORK = (1 << 0), | SER_NETWORK = (1 << 0), | ||||
| SER_DISK = (1 << 1), | SER_DISK = (1 << 1), | ||||
| SER_GETHASH = (1 << 2), | SER_GETHASH = (1 << 2), | ||||
| }; | }; | ||||
| //! Convert the reference base type to X, without changing constness or | /** | ||||
| //! reference type. | * Convert any argument to a reference to X, maintaining constness. | ||||
| template <typename X> X &ReadWriteAsHelper(X &x) { | * | ||||
| * This can be used in serialization code to invoke a base class's | |||||
| * serialization routines. | |||||
| * | |||||
| * Example use: | |||||
| * class Base { ... }; | |||||
| * class Child : public Base { | |||||
| * int m_data; | |||||
| * public: | |||||
| * SERIALIZE_METHODS(Child, obj) { | |||||
| * READWRITE(AsBase<Base>(obj), obj.m_data); | |||||
| * } | |||||
| * }; | |||||
| * | |||||
| * static_cast cannot easily be used here, as the type of Obj will be const | |||||
| * Child& during serialization and Child& during deserialization. AsBase will | |||||
| * convert to const Base& and Base& appropriately. | |||||
| */ | |||||
| template <class Out, class In> Out &AsBase(In &x) { | |||||
| static_assert(std::is_base_of_v<Out, In>); | |||||
| return x; | return x; | ||||
| } | } | ||||
| template <typename X> const X &ReadWriteAsHelper(const X &x) { | template <class Out, class In> const Out &AsBase(const In &x) { | ||||
| static_assert(std::is_base_of_v<Out, In>); | |||||
| return x; | return x; | ||||
| } | } | ||||
| #define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) | #define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) | ||||
| #define READWRITEAS(type, obj) \ | |||||
| (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj))) | |||||
| #define SER_READ(obj, code) \ | #define SER_READ(obj, code) \ | ||||
| ::SerRead( \ | ::SerRead( \ | ||||
| s, ser_action, obj, \ | s, ser_action, obj, \ | ||||
| [&](Stream &s, typename std::remove_const<Type>::type &obj) { code; }) | [&](Stream &s, typename std::remove_const<Type>::type &obj) { code; }) | ||||
| #define SER_WRITE(obj, code) \ | #define SER_WRITE(obj, code) \ | ||||
| ::SerWrite(s, ser_action, obj, [&](Stream &s, const Type &obj) { code; }) | ::SerWrite(s, ser_action, obj, [&](Stream &s, const Type &obj) { code; }) | ||||
| /** | /** | ||||
| ▲ Show 20 Lines • Show All 1,040 Lines • Show Last 20 Lines | |||||