about summary refs log tree commit diff
path: root/src/engine/kernel.h
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2010-05-29 07:25:38 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2010-05-29 07:25:38 +0000
commit72c06a258940696093f255fb1061beb58e1cdd0b (patch)
tree36b9a7712eec2d4f07837eab9c38ef1c5af85319 /src/engine/kernel.h
parente56feb597bc743677633432f77513b02907fd169 (diff)
downloadzcatch-72c06a258940696093f255fb1061beb58e1cdd0b.tar.gz
zcatch-72c06a258940696093f255fb1061beb58e1cdd0b.zip
copied refactor to trunk
Diffstat (limited to 'src/engine/kernel.h')
-rw-r--r--src/engine/kernel.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/engine/kernel.h b/src/engine/kernel.h
new file mode 100644
index 00000000..6a72690f
--- /dev/null
+++ b/src/engine/kernel.h
@@ -0,0 +1,66 @@
+#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;
+protected:
+	IKernel *Kernel() { return m_pKernel; }
+public:
+	IInterface() : m_pKernel(0) {}
+	virtual ~IInterface() {}
+	
+	//virtual unsigned InterfaceID() = 0;
+	//virtual const char *InterfaceName() = 0;
+};
+
+#define MACRO_INTERFACE(Name, ver) \
+	public: \
+		static const char *InterfaceName() { return Name; } \
+	private:
+	
+		//virtual unsigned InterfaceID() { return INTERFACE_ID; }
+		//virtual const char *InterfaceName() { return name; }
+
+
+// This kernel thingie makes the structure very flat and basiclly singletons.
+// I'm not sure if this is a good idea but it works for now.
+class IKernel
+{
+	// hide the implementation
+	virtual bool RegisterInterfaceImpl(const char *InterfaceName, IInterface *pInterface) = 0;
+	virtual bool ReregisterInterfaceImpl(const char *InterfaceName, IInterface *pInterface) = 0;
+	virtual IInterface *RequestInterfaceImpl(const char *InterfaceName) = 0;
+public:
+	static IKernel *Create();
+	virtual ~IKernel() {}
+
+	// templated access to handle pointer convertions and interface names
+	template<class TINTERFACE>
+	bool RegisterInterface(TINTERFACE *pInterface)
+	{
+		return RegisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface);
+	}
+	template<class TINTERFACE>
+	bool ReregisterInterface(TINTERFACE *pInterface)
+	{
+		return ReregisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface);
+	}
+	
+	// Usage example:
+	//		IMyInterface *pMyHandle = Kernel()->RequestInterface<IMyInterface>()
+	template<class TINTERFACE>
+	TINTERFACE *RequestInterface()
+	{
+		return reinterpret_cast<TINTERFACE *>(RequestInterfaceImpl(TINTERFACE::InterfaceName()));
+	}
+};
+
+#endif