diff options
author | luigi1111 <luigi1111w@gmail.com> | 2024-03-07 21:37:05 -0500 |
---|---|---|
committer | luigi1111 <luigi1111w@gmail.com> | 2024-03-07 21:37:05 -0500 |
commit | 6ade592adf49dbf30d5809e67d3f33fbba299ffa (patch) | |
tree | 16616fef9c6b5c26ce13b3ee7dbd88a786b8ea65 | |
parent | Merge pull request #9187 (diff) | |
parent | free function serialization DSL (diff) | |
download | monero-6ade592adf49dbf30d5809e67d3f33fbba299ffa.tar.xz |
Merge pull request #9195
2a2da79 free function serialization DSL (jeffro256)
-rw-r--r-- | src/serialization/serialization.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/serialization/serialization.h b/src/serialization/serialization.h index 2911aecb5..d1f97e324 100644 --- a/src/serialization/serialization.h +++ b/src/serialization/serialization.h @@ -123,6 +123,17 @@ inline bool do_serialize(Archive &ar, bool &v) template <bool W, template <bool> class Archive> \ bool member_do_serialize(Archive<W> &ar) { +/*! \macro BEGIN_SERIALIZE_FN + * + * \brief Begins the environment of the DSL as a free function + * + * Inside, instead of FIELD() and VARINT_FIELD(), use FIELD_F() and + * VARINT_FIELD_F(). Otherwise, this macro is similar to BEGIN_SERIALIZE(). + */ +#define BEGIN_SERIALIZE_FN(stype) \ + template <bool W, template <bool> class Archive> \ + bool do_serialize(Archive<W> &ar, stype &v) { + /*! \macro BEGIN_SERIALIZE_OBJECT * * \brief begins the environment of the DSL @@ -139,6 +150,27 @@ inline bool do_serialize(Archive &ar, bool &v) template <bool W, template <bool> class Archive> \ bool do_serialize_object(Archive<W> &ar){ +/*! \macro BEGIN_SERIALIZE_OBJECT_FN + * + * \brief Begins the environment of the DSL as a free function in object-style + * + * Inside, instead of FIELD() and VARINT_FIELD(), use FIELD_F() and + * VARINT_FIELD_F(). Otherwise, this macro is similar to + * BEGIN_SERIALIZE_OBJECT(), as you should list only field serializations. + */ +#define BEGIN_SERIALIZE_OBJECT_FN(stype) \ + template <bool W, template <bool> class Archive> \ + bool do_serialize_object(Archive<W> &ar, stype &v); \ + template <bool W, template <bool> class Archive> \ + bool do_serialize(Archive<W> &ar, stype &v) { \ + ar.begin_object(); \ + bool r = do_serialize_object(ar, v); \ + ar.end_object(); \ + return r; \ + } \ + template <bool W, template <bool> class Archive> \ + bool do_serialize_object(Archive<W> &ar, stype &v) { \ + /*! \macro PREPARE_CUSTOM_VECTOR_SERIALIZATION */ #define PREPARE_CUSTOM_VECTOR_SERIALIZATION(size, vec) \ @@ -173,6 +205,12 @@ inline bool do_serialize(Archive &ar, bool &v) if (!r || !ar.good()) return false; \ } while(0); +/*! \macro FIELD_F(f) + * + * \brief tags the field with the variable name and then serializes it (for use in a free function) + */ +#define FIELD_F(f) FIELD_N(#f, v.f) + /*! \macro FIELDS(f) * * \brief does not add a tag to the serialized value @@ -204,6 +242,12 @@ inline bool do_serialize(Archive &ar, bool &v) if (!ar.good()) return false; \ } while(0); +/*! \macro VARINT_FIELD_F(f) + * + * \brief tags and serializes the varint \a f (for use in a free function) + */ +#define VARINT_FIELD_F(f) VARINT_FIELD_N(#f, v.f) + /*! \macro MAGIC_FIELD(m) */ #define MAGIC_FIELD(m) \ |