mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-17 13:07:54 +02:00
Add a generic approach for (de)serialization of objects using code in other classes
This adds the (internal) Wrapper class, and the Using function that uses it. Given a class F that implements Ser(stream, const object&) and Unser(stream, object&) functions, this permits writing e.g. READWRITE(Using<F>(object)).
This commit is contained in:
parent
e8e79958a7
commit
ca62563df3
1 changed files with 26 additions and 0 deletions
|
|
@ -442,6 +442,32 @@ I ReadVarInt(Stream& is)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Simple wrapper class to serialize objects using a formatter; used by Using(). */
|
||||||
|
template<typename Formatter, typename T>
|
||||||
|
class Wrapper
|
||||||
|
{
|
||||||
|
static_assert(std::is_lvalue_reference<T>::value, "Wrapper needs an lvalue reference type T");
|
||||||
|
protected:
|
||||||
|
T m_object;
|
||||||
|
public:
|
||||||
|
explicit Wrapper(T obj) : m_object(obj) {}
|
||||||
|
template<typename Stream> void Serialize(Stream &s) const { Formatter().Ser(s, m_object); }
|
||||||
|
template<typename Stream> void Unserialize(Stream &s) { Formatter().Unser(s, m_object); }
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Cause serialization/deserialization of an object to be done using a specified formatter class.
|
||||||
|
*
|
||||||
|
* To use this, you need a class Formatter that has public functions Ser(stream, const object&) for
|
||||||
|
* serialization, and Unser(stream, object&) for deserialization. Serialization routines (inside
|
||||||
|
* READWRITE, or directly with << and >> operators), can then use Using<Formatter>(object).
|
||||||
|
*
|
||||||
|
* This works by constructing a Wrapper<Formatter, T>-wrapped version of object, where T is
|
||||||
|
* const during serialization, and non-const during deserialization, which maintains const
|
||||||
|
* correctness.
|
||||||
|
*/
|
||||||
|
template<typename Formatter, typename T>
|
||||||
|
static inline Wrapper<Formatter, T&> Using(T&& t) { return Wrapper<Formatter, T&>(t); }
|
||||||
|
|
||||||
#define VARINT(obj, ...) WrapVarInt<__VA_ARGS__>(REF(obj))
|
#define VARINT(obj, ...) WrapVarInt<__VA_ARGS__>(REF(obj))
|
||||||
#define COMPACTSIZE(obj) CCompactSize(REF(obj))
|
#define COMPACTSIZE(obj) CCompactSize(REF(obj))
|
||||||
#define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj))
|
#define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue