AuroraInterfaces/Include/AuroraInterfaces.hpp

46 lines
2.6 KiB
C++

/***-
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece").
Licensed under the Unlicense license // Public Domain
File: AuroraInterfaces.hpp
Date: 2021-6-10
Author: Reece
Project: https://git.reece.sx/AuroraSupport/AuroraInterfaces, https://git.reece.sx/AuroraSupport/AuroraRuntime
Note: Aurora Runtime will ship with its own implementation of this
***/
#pragma once
#define AUI_EXPAND_PARAMS_JOINER_A(a, b) a b
#define AUI_EXPAND_PARAMS_JOINER_B(a, b) , a b
#define AUI_EXPAND_PARAMS(...) AU_FOR_EACH_FIRST_2(AUI_EXPAND_PARAMS_JOINER_A, AUI_EXPAND_PARAMS_JOINER_B, __VA_ARGS__)
#define AUI_EXPAND_PARAMS_TYPES_JOINER_A(a, b) a
#define AUI_EXPAND_PARAMS_TYPES_JOINER_B(a, b) , a
#define AUI_EXPAND_PARAMS_TYPES(...) AU_FOR_EACH_FIRST_2(AUI_EXPAND_PARAMS_TYPES_JOINER_A, AUI_EXPAND_PARAMS_TYPES_JOINER_B, __VA_ARGS__)
#define AUI_EXPAND_PARAMS_PARAMS_JOINER_A(a, b) b
#define AUI_EXPAND_PARAMS_PARAMS_JOINER_B(a, b) , b
#define AUI_EXPAND_PARAMS_PARAMS(...) AU_FOR_EACH_FIRST_2(AUI_EXPAND_PARAMS_PARAMS_JOINER_A, AUI_EXPAND_PARAMS_PARAMS_JOINER_B, __VA_ARGS__)
#define AUI_METHOD_IMPL(ret, name, params) virtual ret name(AUI_EXPAND_PARAMS params) = 0;
#define AUI_METHOD_FUNCTIONAL_IMPL(ret, name, params) \
AuFunction<ret(AUI_EXPAND_PARAMS_TYPES params)> name ## Functional; \
virtual ret name (AUI_EXPAND_PARAMS params) override \
{ \
return name ## Functional(AUI_EXPAND_PARAMS_PARAMS params); \
}
#define AUI_METHOD_FUNCTIONAL_FWD(ret, name, params) \
AuFunction<ret(AUI_EXPAND_PARAMS_TYPES params)> name ## Functional; \
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_CPP_WRAPPER_FWD(name, ...) struct name ## Functional : name { AU_FOR_EACH_3(AUI_METHOD_FUNCTIONAL_FWD, __VA_ARGS__) };
#define AUI_DEFINE_INTERFACE_START_CPP_WRAPPER_IMPL(name, ...) struct name ## Functional : name { AU_FOR_EACH_3(AUI_METHOD_FUNCTIONAL_IMPL, __VA_ARGS__) };
#define AUI_PARAMS(...) AU_BRACKET_SCOPE(__VA_ARGS__)
#define AUI_METHODS(...) AU_BRACKET_SCOPE(__VA_ARGS__)
#define AUI_METHOD(...) AU_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__)