reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 48650a8a5172cd6b79cdcfecaf7e87bfeded3e62
parent 952d08b299f5630443b60a9b22338f36a7e8d7c7
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sun,  4 Jun 2017 16:36:04 -0400

api: enhance code generation of parameter casts

Diffstat:
Msrc/api.cpp | 24+++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/api.cpp b/src/api.cpp @@ -70,27 +70,37 @@ void APIDef::unregister(const char *key, void *ptr) } #define BOOST_MPL_PP_TOKEN_EQUAL_void(x) x +#define BOOST_MPL_PP_TOKEN_EQUAL_bool(x) x +#define BOOST_MPL_PP_TOKEN_EQUAL_int(x) x #define IS_VOID(type) BOOST_MPL_PP_TOKEN_EQUAL(type, void) +#define IS_BOOL(type) BOOST_MPL_PP_TOKEN_EQUAL(type, bool) +#define IS_INT(type) BOOST_MPL_PP_TOKEN_EQUAL(type, int) #define ARG_TYPE(arg) BOOST_PP_TUPLE_ELEM(2, 0, arg) #define ARG_NAME(arg) BOOST_PP_TUPLE_ELEM(2, 1, arg) -#define ARGS(r, data, i, arg) BOOST_PP_COMMA_IF(i) ARG_TYPE(arg) ARG_NAME(arg) -#define PARAMS(r, data, i, arg) BOOST_PP_COMMA_IF(i) (ARG_TYPE(arg))(intptr_t)argv[i] -#define DEFARGS(r, macro, i, arg) \ +// produce an appropriate conversion from void* to any type +#define VOIDP_TO(type, val) \ + BOOST_PP_IF(IS_BOOL(type), val != 0, \ + (type) BOOST_PP_EXPR_IF(IS_INT(type), (intptr_t)) val) + +#define DEFARGS(r, data, i, arg) BOOST_PP_COMMA_IF(i) ARG_TYPE(arg) ARG_NAME(arg) +#define CALLARGS(r, data, i, arg) \ + BOOST_PP_COMMA_IF(i) VOIDP_TO(ARG_TYPE(arg), argv[i]) +#define DOCARGS(r, macro, i, arg) \ BOOST_PP_EXPR_IF(i, ",") BOOST_PP_STRINGIZE(macro(arg)) #define DEFINE_API(type, name, args, help, ...) \ namespace API_##name { \ - static type cImpl(BOOST_PP_SEQ_FOR_EACH_I(ARGS, _, args)) __VA_ARGS__ \ + static type cImpl(BOOST_PP_SEQ_FOR_EACH_I(DEFARGS, _, args)) __VA_ARGS__ \ static void *reascriptImpl(void **argv, int argc) { \ BOOST_PP_EXPR_IF(BOOST_PP_NOT(IS_VOID(type)), return (void *)(intptr_t)) \ - cImpl(BOOST_PP_SEQ_FOR_EACH_I(PARAMS, _, args)); \ + cImpl(BOOST_PP_SEQ_FOR_EACH_I(CALLARGS, _, args)); \ BOOST_PP_EXPR_IF(IS_VOID(type), return nullptr;) \ } \ static const char *definition = #type "\0" \ - BOOST_PP_SEQ_FOR_EACH_I(DEFARGS, ARG_TYPE, args) "\0" \ - BOOST_PP_SEQ_FOR_EACH_I(DEFARGS, ARG_NAME, args) "\0" help; \ + BOOST_PP_SEQ_FOR_EACH_I(DOCARGS, ARG_TYPE, args) "\0" \ + BOOST_PP_SEQ_FOR_EACH_I(DOCARGS, ARG_NAME, args) "\0" help; \ }; \ APIFunc API::name = {\ "API_" API_PREFIX #name, (void *)&API_##name::cImpl, \