ddnet/src/engine/kernel.h

69 lines
1.8 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#ifndef ENGINE_KERNEL_H
#define ENGINE_KERNEL_H
#include <base/system.h>
class IKernel;
class IInterface;
class IInterface
{
// friend with the kernel implementation
friend class CKernel;
IKernel *m_pKernel;
2010-05-29 07:25:38 +00:00
protected:
IKernel *Kernel() { return m_pKernel; }
2010-05-29 07:25:38 +00:00
public:
IInterface() :
m_pKernel(nullptr) {}
virtual void Shutdown() {}
2010-05-29 07:25:38 +00:00
virtual ~IInterface() {}
};
#define MACRO_INTERFACE(Name) \
public: \
static const char *InterfaceName() { return Name; } \
\
private:
2022-10-25 16:51:56 +00:00
// This kernel thingie makes the structure very flat and basically singletons.
2010-05-29 07:25:38 +00:00
// I'm not sure if this is a good idea but it works for now.
class IKernel
{
// hide the implementation
virtual void RegisterInterfaceImpl(const char *pInterfaceName, IInterface *pInterface, bool Destroy) = 0;
virtual void ReregisterInterfaceImpl(const char *pInterfaceName, IInterface *pInterface) = 0;
virtual IInterface *RequestInterfaceImpl(const char *pInterfaceName) = 0;
2010-05-29 07:25:38 +00:00
public:
static IKernel *Create();
virtual void Shutdown() = 0;
2010-05-29 07:25:38 +00:00
virtual ~IKernel() {}
2018-07-10 09:29:02 +00:00
// templated access to handle pointer conversions and interface names
2010-05-29 07:25:38 +00:00
template<class TINTERFACE>
void RegisterInterface(TINTERFACE *pInterface, bool Destroy = true)
2010-05-29 07:25:38 +00:00
{
RegisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface, Destroy);
2010-05-29 07:25:38 +00:00
}
template<class TINTERFACE>
void ReregisterInterface(TINTERFACE *pInterface)
2010-05-29 07:25:38 +00:00
{
ReregisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface);
2010-05-29 07:25:38 +00:00
}
2010-05-29 07:25:38 +00:00
// Usage example:
// IMyInterface *pMyHandle = Kernel()->RequestInterface<IMyInterface>()
template<class TINTERFACE>
TINTERFACE *RequestInterface()
{
return reinterpret_cast<TINTERFACE *>(RequestInterfaceImpl(TINTERFACE::InterfaceName()));
}
};
#endif