aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/netaddress.h4
-rw-r--r--src/primitives/transaction.h6
-rw-r--r--src/protocol.h3
-rw-r--r--src/serialize.h39
-rw-r--r--src/test/serialize_tests.cpp7
5 files changed, 28 insertions, 31 deletions
diff --git a/src/netaddress.h b/src/netaddress.h
index 08dd77c0ff..5e5c412586 100644
--- a/src/netaddress.h
+++ b/src/netaddress.h
@@ -241,7 +241,7 @@ public:
template <typename Stream>
void Serialize(Stream& s) const
{
- if (s.GetParams().enc == Encoding::V2) {
+ if (s.template GetParams<SerParams>().enc == Encoding::V2) {
SerializeV2Stream(s);
} else {
SerializeV1Stream(s);
@@ -254,7 +254,7 @@ public:
template <typename Stream>
void Unserialize(Stream& s)
{
- if (s.GetParams().enc == Encoding::V2) {
+ if (s.template GetParams<SerParams>().enc == Encoding::V2) {
UnserializeV2Stream(s);
} else {
UnserializeV1Stream(s);
diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h
index ccbeb3ec49..d15b8005f9 100644
--- a/src/primitives/transaction.h
+++ b/src/primitives/transaction.h
@@ -326,7 +326,7 @@ public:
template <typename Stream>
inline void Serialize(Stream& s) const {
- SerializeTransaction(*this, s, s.GetParams());
+ SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
}
/** This deserializing constructor is provided instead of an Unserialize method.
@@ -386,12 +386,12 @@ struct CMutableTransaction
template <typename Stream>
inline void Serialize(Stream& s) const {
- SerializeTransaction(*this, s, s.GetParams());
+ SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
}
template <typename Stream>
inline void Unserialize(Stream& s) {
- UnserializeTransaction(*this, s, s.GetParams());
+ UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
}
template <typename Stream>
diff --git a/src/protocol.h b/src/protocol.h
index e405253632..58a7287d03 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -406,9 +406,10 @@ public:
static constexpr SerParams V1_DISK{{CNetAddr::Encoding::V1}, Format::Disk};
static constexpr SerParams V2_DISK{{CNetAddr::Encoding::V2}, Format::Disk};
- SERIALIZE_METHODS_PARAMS(CAddress, obj, SerParams, params)
+ SERIALIZE_METHODS(CAddress, obj)
{
bool use_v2;
+ auto& params = SER_PARAMS(SerParams);
if (params.fmt == Format::Disk) {
// In the disk serialization format, the encoding (v1 or v2) is determined by a flag version
// that's part of the serialization itself. ADDRV2_FORMAT in the stream version only determines
diff --git a/src/serialize.h b/src/serialize.h
index 19585c630a..44e2db7ac7 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -181,9 +181,8 @@ const Out& AsBase(const In& x)
static void SerializationOps(Type& obj, Stream& s, Operation ser_action)
/**
- * Variant of FORMATTER_METHODS that supports a declared parameter type.
- *
- * If a formatter has a declared parameter type, it must be invoked directly or
+ * Formatter methods can retrieve parameters attached to a stream using the
+ * SER_PARAMS(type) macro as long as the stream is created directly or
* indirectly with a parameter of that type. This permits making serialization
* depend on run-time context in a type-safe way.
*
@@ -191,7 +190,8 @@ const Out& AsBase(const In& x)
* struct BarParameter { bool fancy; ... };
* struct Bar { ... };
* struct FooFormatter {
- * FORMATTER_METHODS(Bar, obj, BarParameter, param) {
+ * FORMATTER_METHODS(Bar, obj) {
+ * auto& param = SER_PARAMS(BarParameter);
* if (param.fancy) {
* READWRITE(VARINT(obj.value));
* } else {
@@ -213,13 +213,7 @@ const Out& AsBase(const In& x)
* Compilation will fail in any context where serialization is invoked but
* no parameter of a type convertible to BarParameter is provided.
*/
-#define FORMATTER_METHODS_PARAMS(cls, obj, paramcls, paramobj) \
- template <typename Stream> \
- static void Ser(Stream& s, const cls& obj) { SerializationOps(obj, s, ActionSerialize{}, s.GetParams()); } \
- template <typename Stream> \
- static void Unser(Stream& s, cls& obj) { SerializationOps(obj, s, ActionUnserialize{}, s.GetParams()); } \
- template <typename Stream, typename Type, typename Operation> \
- static void SerializationOps(Type& obj, Stream& s, Operation ser_action, const paramcls& paramobj)
+#define SER_PARAMS(type) (s.template GetParams<type>())
#define BASE_SERIALIZE_METHODS(cls) \
template <typename Stream> \
@@ -246,15 +240,6 @@ const Out& AsBase(const In& x)
BASE_SERIALIZE_METHODS(cls) \
FORMATTER_METHODS(cls, obj)
-/**
- * Variant of SERIALIZE_METHODS that supports a declared parameter type.
- *
- * See FORMATTER_METHODS_PARAMS for more information on parameters.
- */
-#define SERIALIZE_METHODS_PARAMS(cls, obj, paramcls, paramobj) \
- BASE_SERIALIZE_METHODS(cls) \
- FORMATTER_METHODS_PARAMS(cls, obj, paramcls, paramobj)
-
// Templates for serializing to anything that looks like a stream,
// i.e. anything that supports .read(Span<std::byte>) and .write(Span<const std::byte>)
//
@@ -1134,9 +1119,19 @@ public:
void ignore(size_t num) { m_substream.ignore(num); }
bool eof() const { return m_substream.eof(); }
size_t size() const { return m_substream.size(); }
- const Params& GetParams() const { return m_params; }
int GetVersion() = delete; // Deprecated with Params usage
int GetType() = delete; // Deprecated with Params usage
+
+ //! Get reference to stream parameters.
+ template <typename P>
+ const auto& GetParams() const
+ {
+ if constexpr (std::is_convertible_v<Params, P>) {
+ return m_params;
+ } else {
+ return m_substream.template GetParams<P>();
+ }
+ }
};
/** Wrapper that serializes objects with the specified parameters. */
@@ -1176,7 +1171,7 @@ public:
/** \
* Return a wrapper around t that (de)serializes it with specified parameter params. \
* \
- * See FORMATTER_METHODS_PARAMS for more information on serialization parameters. \
+ * See SER_PARAMS for more information on serialization parameters. \
*/ \
template <typename T> \
auto operator()(T&& t) const \
diff --git a/src/test/serialize_tests.cpp b/src/test/serialize_tests.cpp
index d75eb499b4..18356f2df0 100644
--- a/src/test/serialize_tests.cpp
+++ b/src/test/serialize_tests.cpp
@@ -289,7 +289,7 @@ public:
template <typename Stream>
void Serialize(Stream& s) const
{
- if (s.GetParams().m_base_format == BaseFormat::RAW) {
+ if (s.template GetParams<BaseFormat>().m_base_format == BaseFormat::RAW) {
s << m_base_data;
} else {
s << Span{HexStr(Span{&m_base_data, 1})};
@@ -299,7 +299,7 @@ public:
template <typename Stream>
void Unserialize(Stream& s)
{
- if (s.GetParams().m_base_format == BaseFormat::RAW) {
+ if (s.template GetParams<BaseFormat>().m_base_format == BaseFormat::RAW) {
s >> m_base_data;
} else {
std::string hex{"aa"};
@@ -327,8 +327,9 @@ class Derived : public Base
public:
std::string m_derived_data;
- SERIALIZE_METHODS_PARAMS(Derived, obj, DerivedAndBaseFormat, fmt)
+ SERIALIZE_METHODS(Derived, obj)
{
+ auto& fmt = SER_PARAMS(DerivedAndBaseFormat);
READWRITE(fmt.m_base_format(AsBase<Base>(obj)));
if (ser_action.ForRead()) {