#ifndef HX_MACROS_H #define HX_MACROS_H // --- Functions and their parameters ---- ::foreach PARAMS:: #define HX_ARR_LIST::ARG:: ::ARR_LIST::::end:: ::foreach PARAMS:: #define HX_DYNAMIC_ARG_LIST::ARG:: ::DYNAMIC_ARG_LIST::::end:: ::foreach PARAMS:: #define HX_ARG_LIST::ARG:: ::ARG_LIST::::end:: #define HX_DEFINE_DYNAMIC_FUNC0(class,func,ret) \ static ::NS::Dynamic __##class##func(::hxNS::Object *inObj) \ { \ ret reinterpret_cast(inObj)->func(); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateMemberFunction0(#func,this,__##class##func); \ } #define HX_DEFINE_DYNAMIC_FUNC(class,N,func,ret,array_list,dynamic_arg_list,arg_list) \ static ::NS::Dynamic __##class##func(::hxNS::Object *inObj, dynamic_arg_list) \ { \ ret reinterpret_cast(inObj)->func(arg_list); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateMemberFunction##N(#func,this,__##class##func); \ } #define HX_DEFINE_DYNAMIC_FUNC_EXTRA(class,N,func,ret,array_list,dynamic_arg_list,arg_list) \ static ::NS::Dynamic __##class##func(::hxNS::Object *inObj, const Array< ::NS::Dynamic> &inArgs) \ { \ ret reinterpret_cast(inObj)->func(array_list); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateMemberFunctionVar(#func,this,__##class##func,N); \ } #define DELEGATE_0(ret,func) ret func() { return mDelegate->func(); } #define CDELEGATE_0(ret,func) ret func() const { return mDelegate->func(); } #define DELEGATE_1(ret,func,arg1) ret func(arg1 _a1) { return mDelegate->func(_a1); } #define CDELEGATE_1(ret,func,arg1) ret func(arg1 _a1) const { return mDelegate->func(_a1); } #define DELEGATE_2(ret,func,arg1,arg2) ret func(arg1 _a1,arg2 _a2) { return mDelegate->func(_a1,_a2); } #define HX_DECLARE_DYNAMIC_FUNC(func,dynamic_arg_list) \ ::NS::Dynamic func##_dyn(dynamic_arg_list); #define STATIC_HX_DECLARE_DYNAMIC_FUNC(func,dynamic_arg_list) \ static ::NS::Dynamic func##_dyn(dynamic_arg_list); ::foreach PARAMS:: ::if (ARG>0)::::if (ARG<6):: #define HX_DEFINE_DYNAMIC_FUNC::ARG::(class,func,ret) \ HX_DEFINE_DYNAMIC_FUNC(class,::ARG::,func,ret,HX_ARR_LIST::ARG::,HX_DYNAMIC_ARG_LIST::ARG::,HX_ARG_LIST::ARG::) ::else:: #define HX_DEFINE_DYNAMIC_FUNC::ARG::(class,func,ret) \ HX_DEFINE_DYNAMIC_FUNC_EXTRA(class,::ARG::,func,ret,HX_ARR_LIST::ARG::,HX_DYNAMIC_ARG_LIST::ARG::,HX_ARG_LIST::ARG::) ::end:: ::end::::end:: #define STATIC_HX_DEFINE_DYNAMIC_FUNC0(class,func,ret) \ static ::NS::Dynamic __##class##func() \ { \ ret class::func(); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateStaticFunction0(#func,__##class##func); \ } #define STATIC_HX_DEFINE_DYNAMIC_FUNC(class,N,func,ret,array_list,dynamic_arg_list,arg_list) \ static ::NS::Dynamic __##class##func(dynamic_arg_list) \ { \ ret class::func(arg_list); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateStaticFunction##N(#func,__##class##func); \ } #define STATIC_HX_DEFINE_DYNAMIC_FUNC_EXTRA(class,N,func,ret,array_list,dynamic_arg_list,arg_list) \ static ::NS::Dynamic __##class##func(const Array< ::NS::Dynamic> &inArgs) \ { \ ret class::func(array_list); return ::NS::Dynamic(); \ }; \ ::NS::Dynamic class::func##_dyn() \ {\ return ::hxNS::CreateStaticFunctionVar(#func,__##class##func,N); \ } ::foreach PARAMS:: ::if (ARG>0)::::if (ARG<6):: #define STATIC_HX_DEFINE_DYNAMIC_FUNC::ARG::(class,func,ret) \ STATIC_HX_DEFINE_DYNAMIC_FUNC(class,::ARG::,func,ret,HX_ARR_LIST::ARG::,HX_DYNAMIC_ARG_LIST::ARG::,HX_ARG_LIST::ARG::) ::else:: #define STATIC_HX_DEFINE_DYNAMIC_FUNC::ARG::(class,func,ret) \ STATIC_HX_DEFINE_DYNAMIC_FUNC_EXTRA(class,::ARG::,func,ret,HX_ARR_LIST::ARG::,HX_DYNAMIC_ARG_LIST::ARG::,HX_ARG_LIST::ARG::) ::end:: ::end::::end:: #define HX_DYNAMIC_CALL(ret,func,array_args,dyn_arg_list,arg_list) \ ::NS::Dynamic __Run(const Array< ::NS::Dynamic> &inArgs) { ret func( array_args ); return null();} \ ::NS::Dynamic __run(dyn_arg_list) { ret func( arg_list ); return null();} ::foreach PARAMS:: #define HX_DYNAMIC_CALL::ARG::(ret,func) HX_DYNAMIC_CALL(ret,func,HX_ARR_LIST::ARG::,HX_DYNAMIC_ARG_LIST::ARG::,HX_ARG_LIST::ARG::)::end:: #define HX_BEGIN_DEFAULT_FUNC(name,t0) \ namespace { \ struct name : public ::hxNS::Object { int __GetType() const { return vtFunction; } \ HX_IS_INSTANCE_OF enum { _hx_ClassId = ::hxNS::clsIdClosure }; \ ::hxNS::ObjectPtr __this; \ name(::hxNS::ObjectPtr __0 = null()) : __this(__0) {} \ void __Mark(::hxNS::MarkContext *__inCtx) { HX_MARK_MEMBER(__this); } \ void __Visit(::hxNS::VisitContext *__inCtx) { HX_VISIT_MEMBER(__this); } #define HX_END_DEFAULT_FUNC \ } #define HXARGC(x) int __ArgCount() const { return x; } #define HX_BEGIN_LOCAL_FUNC_S0(SUPER,name) \ struct name : public SUPER { \ HX_IS_INSTANCE_OF enum { _hx_ClassId = ::hxNS::clsIdClosure }; \ void __Mark(::hxNS::MarkContext *__inCtx) { DoMarkThis(__inCtx); } \ void __Visit(::hxNS::VisitContext *__inCtx) { DoVisitThis(__inCtx); } \ name() {} ::foreach LOCALS:: #define HX_BEGIN_LOCAL_FUNC_S::ARG::(SUPER,name,::TYPE_ARGS::) \ struct name : public SUPER { \ HX_IS_INSTANCE_OF enum { _hx_ClassId = ::hxNS::clsIdClosure }; \ ::TYPE_DECL::; \ void __Mark(::hxNS::MarkContext *__inCtx) { DoMarkThis(__inCtx); ::MARKS:: } \ void __Visit(::hxNS::VisitContext *__inCtx) { DoVisitThis(__inCtx); ::VISITS:: } \ name(::CONSTRUCT_ARGS::) : ::CONSTRUCT_VARS:: {}::end:: #if (HXCPP_API_LEVEL>=330) #define HX_LOCAL_RUN _hx_run #else #define HX_LOCAL_RUN run #endif #define HX_END_LOCAL_FUNC0(ret) HX_DYNAMIC_CALL0(ret, HX_LOCAL_RUN ) }; ::foreach LOCALS:: #define HX_END_LOCAL_FUNC::ARG::(ret) HX_DYNAMIC_CALL::ARG::(ret, HX_LOCAL_RUN ) };::end:: // For compatibility until next version of haxe is released #define HX_BEGIN_LOCAL_FUNC0(name) \ HX_BEGIN_LOCAL_FUNC_S0(::hxNS::LocalFunc,name) ::foreach LOCALS:: #define HX_BEGIN_LOCAL_FUNC::ARG::(name,::TYPE_ARGS::) \ HX_BEGIN_LOCAL_FUNC_S::ARG::(::hxNS::LocalFunc,name,::TYPE_ARGS::)::end:: #define HX_DECLARE_DYNAMIC_FUNCTIONS \ ::foreach PARAMS:: ::if (ARG<6)::::else:: ::NS::Dynamic operator()(::DYNAMIC_ARG_LIST::); \ ::end:: ::end:: #define HX_DECLARE_VARIANT_FUNCTIONS \ ::foreach PARAMS:: ::if (ARG<6):: inline ::NS::Dynamic operator()(::DYNAMIC_ARG_LIST::); \ ::else:: ::NS::Dynamic operator()(::DYNAMIC_ARG_LIST::); \ ::end:: ::end:: #define HX_IMPLEMENT_INLINE_VARIANT_FUNCTIONS \ ::foreach PARAMS:: ::if (ARG<6):: ::NS::Dynamic Variant::NS::operator()(::DYNAMIC_ARG_LIST::) { CheckFPtr(); return valObject->__run(::ARG_LIST::); } \ ::end:: ::end:: #endif