Skip to content

Commit d06fedd

Browse files
ryanofskysipa
authored andcommitted
Add SER_READ and SER_WRITE for read/write-dependent statements
Extracted and extended by Pieter Wuille from a comment by Russ Yanofsky (see bitcoin/bitcoin#18317 (comment)).
1 parent 6f9a1e5 commit d06fedd

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

src/serialize.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ template<typename X> const X& ReadWriteAsHelper(const X& x) { return x; }
190190

191191
#define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__))
192192
#define READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj)))
193+
#define SER_READ(obj, code) ::SerRead(s, ser_action, obj, [&](Stream& s, typename std::remove_const<Type>::type& obj) { code; })
194+
#define SER_WRITE(obj, code) ::SerWrite(s, ser_action, obj, [&](Stream& s, const Type& obj) { code; })
193195

194196
/**
195197
* Implement three methods for serializable objects. These are actually wrappers over
@@ -1100,6 +1102,28 @@ inline void SerReadWriteMany(Stream& s, CSerActionUnserialize ser_action, Args&&
11001102
::UnserializeMany(s, args...);
11011103
}
11021104

1105+
template<typename Stream, typename Type, typename Fn>
1106+
inline void SerRead(Stream& s, CSerActionSerialize ser_action, Type&&, Fn&&)
1107+
{
1108+
}
1109+
1110+
template<typename Stream, typename Type, typename Fn>
1111+
inline void SerRead(Stream& s, CSerActionUnserialize ser_action, Type&& obj, Fn&& fn)
1112+
{
1113+
fn(s, std::forward<Type>(obj));
1114+
}
1115+
1116+
template<typename Stream, typename Type, typename Fn>
1117+
inline void SerWrite(Stream& s, CSerActionSerialize ser_action, Type&& obj, Fn&& fn)
1118+
{
1119+
fn(s, std::forward<Type>(obj));
1120+
}
1121+
1122+
template<typename Stream, typename Type, typename Fn>
1123+
inline void SerWrite(Stream& s, CSerActionUnserialize ser_action, Type&&, Fn&&)
1124+
{
1125+
}
1126+
11031127
template<typename I>
11041128
inline void WriteVarInt(CSizeComputer &s, I n)
11051129
{

0 commit comments

Comments
 (0)