From d06fedd1bc26bf5bf2b203d4445aeaebccca780e Mon Sep 17 00:00:00 2001 From: Russell Yanofsky Date: Mon, 30 Mar 2020 15:22:07 -0700 Subject: Add SER_READ and SER_WRITE for read/write-dependent statements Extracted and extended by Pieter Wuille from a comment by Russ Yanofsky (see https://github.com/bitcoin/bitcoin/pull/18317#discussion_r398625457). --- src/serialize.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/serialize.h b/src/serialize.h index a44cc2c001..82c332f92f 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -190,6 +190,8 @@ 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))) +#define SER_READ(obj, code) ::SerRead(s, ser_action, obj, [&](Stream& s, typename std::remove_const::type& obj) { code; }) +#define SER_WRITE(obj, code) ::SerWrite(s, ser_action, obj, [&](Stream& s, const Type& obj) { code; }) /** * Implement three methods for serializable objects. These are actually wrappers over @@ -1100,6 +1102,28 @@ inline void SerReadWriteMany(Stream& s, CSerActionUnserialize ser_action, Args&& ::UnserializeMany(s, args...); } +template +inline void SerRead(Stream& s, CSerActionSerialize ser_action, Type&&, Fn&&) +{ +} + +template +inline void SerRead(Stream& s, CSerActionUnserialize ser_action, Type&& obj, Fn&& fn) +{ + fn(s, std::forward(obj)); +} + +template +inline void SerWrite(Stream& s, CSerActionSerialize ser_action, Type&& obj, Fn&& fn) +{ + fn(s, std::forward(obj)); +} + +template +inline void SerWrite(Stream& s, CSerActionUnserialize ser_action, Type&&, Fn&&) +{ +} + template inline void WriteVarInt(CSizeComputer &s, I n) { -- cgit v1.2.3