Last active
November 2, 2017 10:50
-
-
Save swr1bm86/481785e148198f363d64f470edcb7399 to your computer and use it in GitHub Desktop.
auto generate serializers and deserializers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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