mirror of
https://github.com/monero-project/monero.git
synced 2024-10-30 04:57:36 +00:00
free function serialization DSL
Example usage for Seraphis types (in global or `sp` namespace): ``` BEGIN_SERIALIZE_OBJECT_FN(sp::SpCoinbaseEnoteCore) FIELD_F(onetime_address) VARINT_FIELD_F(amount) END_SERIALIZE() BEGIN_SERIALIZE_OBJECT_FN(sp::SpEnoteCore) FIELD_F(onetime_address) FIELD_F(amount_commitment) END_SERIALIZE() ```
This commit is contained in:
parent
059028a30a
commit
2a2da79943
1 changed files with 44 additions and 0 deletions
|
@ -123,6 +123,17 @@ inline bool do_serialize(Archive &ar, bool &v)
|
||||||
template <bool W, template <bool> class Archive> \
|
template <bool W, template <bool> class Archive> \
|
||||||
bool member_do_serialize(Archive<W> &ar) {
|
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
|
/*! \macro BEGIN_SERIALIZE_OBJECT
|
||||||
*
|
*
|
||||||
* \brief begins the environment of the DSL
|
* \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> \
|
template <bool W, template <bool> class Archive> \
|
||||||
bool do_serialize_object(Archive<W> &ar){
|
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
|
/*! \macro PREPARE_CUSTOM_VECTOR_SERIALIZATION
|
||||||
*/
|
*/
|
||||||
#define PREPARE_CUSTOM_VECTOR_SERIALIZATION(size, vec) \
|
#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; \
|
if (!r || !ar.good()) return false; \
|
||||||
} while(0);
|
} 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)
|
/*! \macro FIELDS(f)
|
||||||
*
|
*
|
||||||
* \brief does not add a tag to the serialized value
|
* \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; \
|
if (!ar.good()) return false; \
|
||||||
} while(0);
|
} 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)
|
/*! \macro MAGIC_FIELD(m)
|
||||||
*/
|
*/
|
||||||
#define MAGIC_FIELD(m) \
|
#define MAGIC_FIELD(m) \
|
||||||
|
|
Loading…
Reference in a new issue