Skip to content

Instantly share code, notes, and snippets.

@swr1bm86
Last active November 2, 2017 10:50
Show Gist options
  • Save swr1bm86/481785e148198f363d64f470edcb7399 to your computer and use it in GitHub Desktop.
Save swr1bm86/481785e148198f363d64f470edcb7399 to your computer and use it in GitHub Desktop.
auto generate serializers and deserializers
//https://stackoverflow.com/questions/24309309/how-to-use-boost-preprocessor-to-generate-accessors
#include <boost/preprocessor.hpp>
#define CREATE_MY_MACRO_PLACEHOLDER_FILLER_0(X, Y, Z) \
((X, Y, Z)) CREATE_MY_MACRO_PLACEHOLDER_FILLER_1
#define CREATE_MY_MACRO_PLACEHOLDER_FILLER_1(X, Y, Z) \
((X, Y, Z)) CREATE_MY_MACRO_PLACEHOLDER_FILLER_0
#define CREATE_MY_MACRO_PLACEHOLDER_FILLER_0_END
#define CREATE_MY_MACRO_PLACEHOLDER_FILLER_1_END
#define DECLARE_DATA_MEMBER(R, _, TYPE_AND_NAME) \
BOOST_PP_TUPLE_ELEM(3, 0, TYPE_AND_NAME) BOOST_PP_TUPLE_ELEM(3, 1, TYPE_AND_NAME);
#define DEFINE_SERIALIZATION_ELEMENT(R, _, TYPE_AND_NAME) \
{ BOOST_PP_TUPLE_ELEM(3, 2, TYPE_AND_NAME), o.BOOST_PP_TUPLE_ELEM(3, 1, TYPE_AND_NAME) },
#define DEFINE_DESERIALIZATION_ELEMENT(R, _, TYPE_AND_NAME) \
o.BOOST_PP_TUPLE_ELEM(3, 1, TYPE_AND_NAME) = j.at(BOOST_PP_TUPLE_ELEM(3, 2, TYPE_AND_NAME)).get<BOOST_PP_TUPLE_ELEM(3, 0, TYPE_AND_NAME)>();
#define DEFINE_EQUAL_OPERATOR_ELEM(R, _, TYPE_AND_NAME) \
lhs.BOOST_PP_TUPLE_ELEM(3, 1, TYPE_AND_NAME) == rhs.BOOST_PP_TUPLE_ELEM(3, 1, TYPE_AND_NAME) &&
#define DEFINE_MODEL(NAME, TYPES_AND_NAMES) \
struct NAME { \
BOOST_PP_SEQ_FOR_EACH(DECLARE_DATA_MEMBER, _, BOOST_PP_CAT(CREATE_MY_MACRO_PLACEHOLDER_FILLER_0 TYPES_AND_NAMES,_END)) \
}; \
void to_json(json& j, const NAME& o) { \
j = json{BOOST_PP_SEQ_FOR_EACH(DEFINE_SERIALIZATION_ELEMENT, _, BOOST_PP_CAT(CREATE_MY_MACRO_PLACEHOLDER_FILLER_0 TYPES_AND_NAMES,_END))}; \
} \
void from_json(const json& j, NAME& o) { \
BOOST_PP_SEQ_FOR_EACH(DEFINE_DESERIALIZATION_ELEMENT, _, BOOST_PP_CAT(CREATE_MY_MACRO_PLACEHOLDER_FILLER_0 TYPES_AND_NAMES,_END)) \
} \
bool operator ==(const NAME& lhs, const NAME& rhs) { \
return BOOST_PP_SEQ_FOR_EACH(DEFINE_EQUAL_OPERATOR_ELEM, _, BOOST_PP_CAT(CREATE_MY_MACRO_PLACEHOLDER_FILLER_0 TYPES_AND_NAMES,_END)) true; \
}
DEFINE_MODEL(Vin, (string, transaction_id, "txid")(int, vout, "vout"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment