diff --git a/Include/AuroraInterfaces.hpp b/Include/AuroraInterfaces.hpp index 8001e98..d15ea9f 100644 --- a/Include/AuroraInterfaces.hpp +++ b/Include/AuroraInterfaces.hpp @@ -26,47 +26,67 @@ #define AUI_METHOD_IMPL(ret, name, params) virtual ret name(AUI_EXPAND_PARAMS params) = 0; -#define AUI_METHOD_FUNCTIONAL_IMPL(ret, name, params) \ - AuFunction name ## Functional; \ - virtual ret name (AUI_EXPAND_PARAMS params) override \ - { \ - return name ## Functional(AUI_EXPAND_PARAMS_PARAMS params); \ +#define AUI_METHOD_FUNCTIONAL_IMPL(ret, name, params) \ + AuFunction name ## Functional; \ + virtual ret name (AUI_EXPAND_PARAMS params) override \ + { \ + return name ## Functional(AUI_EXPAND_PARAMS_PARAMS params); \ } - -#define AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params) \ - AuFunction name ## Functional +#define AUI_METHOD_FUNCTIONAL_TYPEDEF(ret, name, params) \ + using name ## _t = AuFunction; -#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_A(ret, name, params) AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params) -#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_B(ret, name, params) , AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params) +#define AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params) \ + name ## _t name ## Functional +#define AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_CREF(ret, name, params) \ + const name ## _t &name ## Functional -#define AUI_METHOD_PROTOTYPE_ASSIGN(ret, name, params) \ +#define AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_REF(ret, name, params) \ + AuFunction && name ## Functional + +#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_A(ret, name, params) AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_CREF(ret, name, params) +#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_B(ret, name, params) , AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_CREF(ret, name, params) +#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_REF_A(ret, name, params) AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_REF(ret, name, params) +#define AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_REF_B(ret, name, params) , AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL_REF(ret, name, params) + +#define AUI_METHOD_PROTOTYPE_ASSIGN(ret, name, params) \ name ## Functional(name ## Functional) #define AUI_METHOD_FUNCTIONAL_ASSIGN_A(ret, name, params) AUI_METHOD_PROTOTYPE_ASSIGN(ret, name, params) #define AUI_METHOD_FUNCTIONAL_ASSIGN_B(ret, name, params) , AUI_METHOD_PROTOTYPE_ASSIGN(ret, name, params) -#define AUI_METHOD_FUNCTIONAL_FWD(ret, name, params) \ - AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params); \ +#define AUI_METHOD_FUNCTIONAL_FWD(ret, name, params) \ + AUI_METHOD_PROTOTYPE_TO_FUNCTIONAL(ret, name, params); \ virtual ret name (AUI_EXPAND_PARAMS params) override; -#define AUI_DEFINE_INTERFACE_START_STRUCT(name, ...) struct name { AU_FOR_EACH_3(AUI_METHOD_IMPL, __VA_ARGS__) }; -#define AUI_DEFINE_INTERFACE_START_FUNCTIONAL_BASE(tmpl, name, ...) struct name ## Functional : name \ +#define AUI_DEFINE_INTERFACE_START_STRUCT(name, ...) struct name \ { \ + AU_FOR_EACH_3(AUI_METHOD_IMPL, __VA_ARGS__) \ + }; + +#define AUI_DEFINE_INTERFACE_START_FUNCTIONAL_BASE(tmpl, name, ...) struct name ## Functional : name \ + { \ + AU_FOR_EACH_3(AUI_METHOD_FUNCTIONAL_TYPEDEF, __VA_ARGS__) \ inline name ## Functional () {} \ inline ~name ## Functional () {} \ inline name ## Functional (AU_FOR_EACH_FIRST_3(AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_A, AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_BASE_B, __VA_ARGS__)) : \ AU_FOR_EACH_FIRST_3(AUI_METHOD_FUNCTIONAL_ASSIGN_A, AUI_METHOD_FUNCTIONAL_ASSIGN_B, __VA_ARGS__) \ {} \ - AU_FOR_EACH_3(tmpl, __VA_ARGS__) \ + inline name ## Functional (AU_FOR_EACH_FIRST_3(AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_REF_A, AUI_METHOD_FUNCTIONAL_CTOR_PARAMS_REF_B, __VA_ARGS__)) : \ + AU_FOR_EACH_FIRST_3(AUI_METHOD_FUNCTIONAL_ASSIGN_A, AUI_METHOD_FUNCTIONAL_ASSIGN_B, __VA_ARGS__) \ + {} \ + AU_FOR_EACH_3(tmpl, __VA_ARGS__) \ }; -#define AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_FWD(name, ...) AUI_DEFINE_INTERFACE_START_FUNCTIONAL_BASE(AUI_METHOD_FUNCTIONAL_FWD, name, __VA_ARGS__) +#define AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_FWD(name, ...) AUI_DEFINE_INTERFACE_START_FUNCTIONAL_BASE(AUI_METHOD_FUNCTIONAL_FWD, name, __VA_ARGS__) #define AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_IMPL(name, ...) AUI_DEFINE_INTERFACE_START_FUNCTIONAL_BASE(AUI_METHOD_FUNCTIONAL_IMPL, name, __VA_ARGS__) -#define AUI_PARAMS(...) AUI_BRACKET_SCOPE(__VA_ARGS__) -#define AUI_METHODS(...) AUI_BRACKET_SCOPE(__VA_ARGS__) -#define AUI_METHOD(...) AUI_BRACKET_SCOPE(__VA_ARGS__) +#define AUI_METHOD(...) AUI_BRACKET_SCOPE(__VA_ARGS__) +#define AUI_PARAMS(...) (__VA_ARGS__) + +/// @deprecated +#define AUI_METHODS(...) AUI_BRACKET_SCOPE(__VA_ARGS__) + #define AUI_INTERFACE_FWD(name, ...) AUI_DEFINE_INTERFACE_START_STRUCT(name, __VA_ARGS__) AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_FWD(name, __VA_ARGS__) #define AUI_INTERFACE_IMPL(name, ...) AUI_DEFINE_INTERFACE_START_STRUCT(name, __VA_ARGS__) AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_IMPL(name, __VA_ARGS__) \ No newline at end of file