Aurora Interfaces. Abstract API generation model for generating interfaces across language boundaries. Based on Aurora ForEach.
Go to file
Reece Wilson 86f31234c1 Update 'Include/AuroraInterfaces.hpp'
[*] Typo in  public version
[+] Added AUI_PIN_ODR
2021-10-21 17:49:17 +00:00
Include Update 'Include/AuroraInterfaces.hpp' 2021-10-21 17:49:17 +00:00
LICENSE.txt Initial Commit 2021-10-05 22:01:39 +01:00
README.md Update 'README.md' 2021-10-10 18:49:09 +00:00

Aurora Interfaces

This library implements the macros required to define Aurora style interfaces. Defines two classes implementable by SWIG, CppSharp, and classical event interface inheritance; and implementable by std::function for modern C++ and runtime language bindings respectively. The former is simply defined as a structure containing virtual methods as laid out by AUI_METHODs. Latterly, the base interface is extended and implemented by an array of overloaded method defintions and std::function member fields. The latter type variant includes type defintions of each functional type, where each method type is defined as IMyInterfaceFunctional::methodName_t; and includes a copy and a move constructor for when the implementation is available at time of construction.

Example usage:

In your common header:

#if defined(MY_LIB_GEN_BINDINGS)
    #define LIB_INTERFACE(name, list) AUI_INTERFACE_IMPL(name, list)
#define 
    #define LIB_INTERFACE(name, list) AUI_INTERFACE_FWD(name, list)
#endif 

In your public API:

LIB_INTERFACE(IInputMouseSubscriber, 
    AUI_METHOD(void, onButtonPress, (AuUInt8, mb)),
    AUI_METHOD(void, onButtonTick, (AuUInt8, mb)),
    AUI_METHOD(void, onButtonUp, (AuUInt8, mb))
);

In a dedicated translation unit:

#define MY_LIB_GEN_BINDINGS
#include <...> 

Usage Runtime Binding and Modern C++

// My language binding
IInputMouseSubscriberFunctional test;
test.onButtonPress = [](AuUInt8 btn)
{

};

AuSPtr<IInputMouseSubscriber> handle = AuUnsafeRaiiToShared(&test);
// use handle with an Aurora API 

Usage C++ Native, SWIG, and CppSharp

struct MyEventHandler : public IInputMouseSubscriber
{
    void onButtonPress(AuUInt8 mb) override;
    void onButtonTick(AuUInt8 mb) override;
    void onButtonUp(AuUInt8 mb) override;
};

auto handle = AuMakeShared<MyEventHandler>();
Possibly useful for API developers