|
|
|
@ -190,6 +190,8 @@ template<typename X> 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<type>(obj)))
|
|
|
|
|
#define SER_READ(obj, code) ::SerRead(s, ser_action, obj, [&](Stream& s, typename std::remove_const<Type>::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<typename Stream, typename Type, typename Fn>
|
|
|
|
|
inline void SerRead(Stream& s, CSerActionSerialize ser_action, Type&&, Fn&&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename Stream, typename Type, typename Fn>
|
|
|
|
|
inline void SerRead(Stream& s, CSerActionUnserialize ser_action, Type&& obj, Fn&& fn)
|
|
|
|
|
{
|
|
|
|
|
fn(s, std::forward<Type>(obj));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename Stream, typename Type, typename Fn>
|
|
|
|
|
inline void SerWrite(Stream& s, CSerActionSerialize ser_action, Type&& obj, Fn&& fn)
|
|
|
|
|
{
|
|
|
|
|
fn(s, std::forward<Type>(obj));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename Stream, typename Type, typename Fn>
|
|
|
|
|
inline void SerWrite(Stream& s, CSerActionUnserialize ser_action, Type&&, Fn&&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename I>
|
|
|
|
|
inline void WriteVarInt(CSizeComputer &s, I n)
|
|
|
|
|
{
|
|
|
|
|