Skip to content

Commit

Permalink
refactoring C++03 macros
Browse files Browse the repository at this point in the history
  • Loading branch information
satoren committed Aug 5, 2016
1 parent 35f8e9d commit a9b7950
Show file tree
Hide file tree
Showing 12 changed files with 153 additions and 263 deletions.
9 changes: 3 additions & 6 deletions include/kaguya/another_binding_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,13 @@ namespace kaguya
template<typename... Args>
class_& constructor() { this->template setConstructors<ClassType(Args...)>(); return *this; }
#else
#define KAGUYA_TEMPLATE_PARAMETER(N)
class_& constructor() { this->template setConstructors<ClassType()>(); return *this; }

#define KAGUYA_ADD_CON_FN_DEF(N) \
KAGUYA_TEMPLATE_PARAMETER(N)\
template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>\
class_& constructor() { this->template setConstructors<ClassType(KAGUYA_PP_TEMPLATE_ARG_REPEAT(N))>(); return *this; }

KAGUYA_ADD_CON_FN_DEF(0)
#undef KAGUYA_TEMPLATE_PARAMETER
#define KAGUYA_TEMPLATE_PARAMETER(N) template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_ADD_CON_FN_DEF)
#undef KAGUYA_TEMPLATE_PARAMETER
#undef KAGUYA_ADD_CON_FN_DEF
#endif

Expand Down
173 changes: 62 additions & 111 deletions include/kaguya/detail/lua_function_def.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,68 +97,49 @@ namespace kaguya
template<class...Args> FunctionResults operator()(Args&&... args);
#else

#define KAGUYA_PP_TEMPLATE(N) ,KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PP_FARG(N) const KAGUYA_PP_CAT(A,N)& KAGUYA_PP_CAT(a,N)
#define KAGUYA_PUSH_ARG_DEF(N) ,KAGUYA_PP_CAT(a,N)
#define KAGUYA_CALL_DEF(N) \
template<class Result KAGUYA_PP_REPEAT(N,KAGUYA_PP_TEMPLATE)>\
Result call(KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_FARG))\
{\
lua_State* state = state_();\
if (!state)\
template<class Result KAGUYA_PP_TEMPLATE_DEF_REPEAT_CONCAT(N)>\
Result call(KAGUYA_PP_ARG_CR_DEF_REPEAT(N))\
{\
except::typeMismatchError(state, "is nil");\
return Result();\
}\
int argstart = lua_gettop(state) + 1;\
push_(state);\
int argnum = util::push_args(state KAGUYA_PP_REPEAT(N,KAGUYA_PUSH_ARG_DEF));\
int result = lua_pcall_wrap(state, argnum, LUA_MULTRET);\
except::checkErrorAndThrow(result, state);\
return detail::FunctionResultProxy::ReturnValue(state,result, argstart, types::typetag<Result>());\
}
lua_State* state = state_();\
if (!state)\
{\
except::typeMismatchError(state, "is nil");\
return Result();\
}\
int argstart = lua_gettop(state) + 1;\
push_(state);\
int argnum = util::push_args(state KAGUYA_PP_ARG_REPEAT_CONCAT(N));\
int result = lua_pcall_wrap(state, argnum, LUA_MULTRET);\
except::checkErrorAndThrow(result, state);\
return detail::FunctionResultProxy::ReturnValue(state,result, argstart, types::typetag<Result>());\
}


KAGUYA_CALL_DEF(0)
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_CALL_DEF)
KAGUYA_CALL_DEF(0);
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_CALL_DEF);


#undef KAGUYA_PUSH_DEF
#undef KAGUYA_PUSH_ARG_DEF
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_RESUME_DEF

#define KAGUYA_TEMPLATE_PARAMETER(N)
#define KAGUYA_FUNCTION_ARGS_DEF(N)
#define KAGUYA_CALL_ARGS(N)

#define KAGUYA_OP_FN_DEF(N) \
KAGUYA_TEMPLATE_PARAMETER(N)\
inline FunctionResults operator()(KAGUYA_FUNCTION_ARGS_DEF(N));
inline FunctionResults operator()();

KAGUYA_OP_FN_DEF(0)

#undef KAGUYA_TEMPLATE_PARAMETER
#undef KAGUYA_FUNCTION_ARGS_DEF
#undef KAGUYA_CALL_ARGS
#define KAGUYA_TEMPLATE_PARAMETER(N) template<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TEMPLATE)>
#define KAGUYA_FUNCTION_ARGS_DEF(N) KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_FARG)
#define KAGUYA_CALL_ARGS(N) KAGUYA_PP_REPEAT_ARG(N, KAGUYA_PUSH_ARG_DEF)
#define KAGUYA_OP_FN_DEF(N) \
template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>\
inline FunctionResults operator()(KAGUYA_PP_ARG_CR_DEF_REPEAT(N));


#define KAGUYA_PP_TEMPLATE(N) KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PUSH_ARG_DEF(N) KAGUYA_PP_CAT(a,N)
#define KAGUYA_FUNCTION_ARGS_DEF(N)
#define KAGUYA_CALL_ARGS(N) KAGUYA_PP_ARG_REPEAT(N)

KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF)
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF);
#undef KAGUYA_OP_FN_DEF
#undef KAGUYA_TEMPLATE_PARAMETER

#undef KAGUYA_CALL_ARGS
#undef KAGUYA_FUNCTION_ARGS_DEF
#undef KAGUYA_PUSH_ARG_DEF
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_PP_FARG
#undef KAGUYA_CALL_DEF
#undef KAGUYA_OP_FN_DEF
#endif


Expand Down Expand Up @@ -211,80 +192,50 @@ namespace kaguya
template<class...Args> FunctionResults operator()(Args&&... args);
#else


#define KAGUYA_PP_TEMPLATE(N) ,KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PP_FARG(N) const KAGUYA_PP_CAT(A,N)& KAGUYA_PP_CAT(a,N)
#define KAGUYA_PUSH_ARG_DEF(N) ,KAGUYA_PP_CAT(a,N)

#define KAGUYA_RESUME_DEF(N) \
template<class Result KAGUYA_PP_REPEAT(N,KAGUYA_PP_TEMPLATE)>\
Result resume(KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_FARG))\
{\
lua_State* state = state_();\
if (!state)\
template<class Result KAGUYA_PP_TEMPLATE_DEF_REPEAT_CONCAT(N)>\
Result resume(KAGUYA_PP_ARG_CR_DEF_REPEAT(N))\
{\
except::typeMismatchError(state, "is nil");\
return Result();\
}\
util::ScopedSavedStack save(state);\
int corStackIndex = pushStackIndex_(state);\
lua_State* thread = lua_tothread(state, corStackIndex);\
if (!thread)\
{\
except::typeMismatchError(state, "not thread");\
return Result();\
}\
int argstart = 1;\
if (lua_status(thread) == LUA_YIELD)\
{\
argstart = 0;\
}\
util::push_args(thread KAGUYA_PP_REPEAT(N, KAGUYA_PUSH_ARG_DEF));\
int argnum = lua_gettop(thread) - argstart;\
if (argnum < 0) { argnum = 0; }\
int result = lua_resume(thread, state, argnum);\
except::checkErrorAndThrow(result, thread);\
return detail::FunctionResultProxy::ReturnValue(thread,result, 1, types::typetag<Result>());\
}

KAGUYA_RESUME_DEF(0)
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_RESUME_DEF)

#undef KAGUYA_PUSH_DEF
#undef KAGUYA_PUSH_ARG_DEF
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_RESUME_DEF

#define KAGUYA_TEMPLATE_PARAMETER(N)
#define KAGUYA_FUNCTION_ARGS_DEF(N)
#define KAGUYA_CALL_ARGS(N)

#define KAGUYA_OP_FN_DEF(N) \
KAGUYA_TEMPLATE_PARAMETER(N)\
inline FunctionResults operator()(KAGUYA_FUNCTION_ARGS_DEF(N));
lua_State* state = state_();\
if (!state)\
{\
except::typeMismatchError(state, "is nil");\
return Result();\
}\
util::ScopedSavedStack save(state);\
int corStackIndex = pushStackIndex_(state);\
lua_State* thread = lua_tothread(state, corStackIndex);\
if (!thread)\
{\
except::typeMismatchError(state, "not thread");\
return Result();\
}\
int argstart = 1;\
if (lua_status(thread) == LUA_YIELD)\
{\
argstart = 0;\
}\
util::push_args(thread KAGUYA_PP_ARG_REPEAT_CONCAT(N));\
int argnum = lua_gettop(thread) - argstart;\
if (argnum < 0) { argnum = 0; }\
int result = lua_resume(thread, state, argnum);\
except::checkErrorAndThrow(result, thread);\
return detail::FunctionResultProxy::ReturnValue(thread,result, 1, types::typetag<Result>());\
}

KAGUYA_OP_FN_DEF(0)
KAGUYA_RESUME_DEF(0);
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_RESUME_DEF);

#undef KAGUYA_TEMPLATE_PARAMETER
#undef KAGUYA_FUNCTION_ARGS_DEF
#undef KAGUYA_CALL_ARGS
#define KAGUYA_TEMPLATE_PARAMETER(N) template<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TEMPLATE)>
#define KAGUYA_FUNCTION_ARGS_DEF(N) KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_FARG)
#define KAGUYA_CALL_ARGS(N) KAGUYA_PP_REPEAT_ARG(N, KAGUYA_PUSH_ARG_DEF)
#undef KAGUYA_RESUME_DEF

#define KAGUYA_PP_TEMPLATE(N) KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PUSH_ARG_DEF(N) KAGUYA_PP_CAT(a,N)
inline FunctionResults operator()();

KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF)
#undef KAGUYA_OP_FN_DEF
#undef KAGUYA_TEMPLATE_PARAMETER
#define KAGUYA_OP_FN_DEF(N) \
template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>\
inline FunctionResults operator()(KAGUYA_PP_ARG_CR_DEF_REPEAT(N));

KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF);

#undef KAGUYA_CALL_ARGS
#undef KAGUYA_FUNCTION_ARGS_DEF
#undef KAGUYA_PUSH_ARG_DEF
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_PP_FARG
#undef KAGUYA_CALL_DEF
#undef KAGUYA_OP_FN_DEF
#endif

Expand Down
29 changes: 5 additions & 24 deletions include/kaguya/detail/lua_variant_def.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,33 +76,14 @@ namespace kaguya
#if KAGUYA_USE_CPP11
template<class...Args> FunctionResults operator()(Args&&... args);
#else
#define KAGUYA_TEMPLATE_PARAMETER(N)
#define KAGUYA_FUNCTION_ARGS_DEF(N)
#define KAGUYA_PP_FARG(N) const KAGUYA_PP_CAT(A,N)& KAGUYA_PP_CAT(a,N)
inline FunctionResults operator()();

#define KAGUYA_OP_FN_DEF(N) \
KAGUYA_TEMPLATE_PARAMETER(N)\
inline FunctionResults operator()(KAGUYA_FUNCTION_ARGS_DEF(N));
template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>\
inline FunctionResults operator()(KAGUYA_PP_ARG_CR_DEF_REPEAT(N));

KAGUYA_OP_FN_DEF(0)

#undef KAGUYA_TEMPLATE_PARAMETER
#undef KAGUYA_FUNCTION_ARGS_DEF
#define KAGUYA_TEMPLATE_PARAMETER(N) template<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TEMPLATE)>
#define KAGUYA_FUNCTION_ARGS_DEF(N) KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_FARG)

#define KAGUYA_PP_TEMPLATE(N) KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PUSH_ARG_DEF(N) KAGUYA_PP_CAT(a,N)

KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF)
#undef KAGUYA_OP_FN_DEF
#undef KAGUYA_TEMPLATE_PARAMETER

#undef KAGUYA_FUNCTION_ARGS_DEF
#undef KAGUYA_PUSH_ARG_DEF
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_PP_FARG
#undef KAGUYA_CALL_DEF

KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_ARGS, KAGUYA_OP_FN_DEF);
#undef KAGUYA_OP_FN_DEF
#endif
};
Expand Down
12 changes: 4 additions & 8 deletions include/kaguya/lua_ref.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,14 @@ namespace kaguya
{
return standard::tuple<>();
}

#define KAGUYA_PP_TEMPLATE(N) KAGUYA_PP_CAT(typename A,N)
#define KAGUYA_PP_TARG(N) KAGUYA_PP_CAT(A,N)

#define KAGUYA_GET_DEF(N) lua_type_traits<KAGUYA_PP_CAT(A,N)>::get(l, N + startindex - 1)
#define KAGUYA_GET_TUPLE_DEF(N) template<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TEMPLATE)>\
inline standard::tuple<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TARG)> get_result_impl(lua_State *l,int startindex,types::typetag<standard::tuple<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TARG)> >)\
#define KAGUYA_GET_TUPLE_DEF(N) template<KAGUYA_PP_TEMPLATE_DEF_REPEAT(N)>\
inline standard::tuple<KAGUYA_PP_TEMPLATE_ARG_REPEAT(N)> get_result_impl(lua_State *l,int startindex,types::typetag<standard::tuple<KAGUYA_PP_TEMPLATE_ARG_REPEAT(N)> >)\
{\
return standard::tuple<KAGUYA_PP_REPEAT_ARG(N,KAGUYA_PP_TARG) >(KAGUYA_PP_REPEAT_ARG(N,KAGUYA_GET_DEF));\
return standard::tuple<KAGUYA_PP_TEMPLATE_ARG_REPEAT(N) >(KAGUYA_PP_REPEAT_ARG(N,KAGUYA_GET_DEF));\
}
KAGUYA_PP_REPEAT_DEF(KAGUYA_FUNCTION_MAX_TUPLE_SIZE, KAGUYA_GET_TUPLE_DEF)
#undef KAGUYA_PP_TEMPLATE
#undef KAGUYA_PP_TARG
#undef KAGUYA_GET_DEF
#undef KAGUYA_GET_TUPLE_DEF
#endif
Expand Down
Loading

0 comments on commit a9b7950

Please sign in to comment.