From 818dc74ba2745872fd68d2158380fc8bd331210e Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Fri, 7 Jul 2017 16:06:56 -0700 Subject: Support serialization as another type without casting This adds a READWRITEAS(type, obj) macro which serializes obj as if it were casted to (const type&) when const, and to (type&) when non-const. This makes it usable in serialization code that uses a single implementation for both serialization and deserializing, which doesn't know the constness of the object involved. --- src/serialize.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/serialize.h') diff --git a/src/serialize.h b/src/serialize.h index 91da6b0f80..341a138e8b 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -148,7 +148,12 @@ enum SER_GETHASH = (1 << 2), }; -#define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) +//! Convert the reference base type to X, without changing constness or reference type. +template X& ReadWriteAsHelper(X& x) { return x; } +template const X& ReadWriteAsHelper(const X& x) { return x; } + +#define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) +#define READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper(obj))) /** * Implement three methods for serializable objects. These are actually wrappers over -- cgit v1.2.3