6#include <unordered_map>
15 static void expose(ssq::Table& table); \
16 static void expose(ssq::Class& vm);
18#define Module_REG(ModuleName) \
20 virtual std::string getName() const { return name; } \
21 static ModuleName* create(); \
22 static const char* name
24#define Module_IMPL(ModuleName, newExpr) \
25 ModuleRegister ModuleName##_register(ModuleName::name, \
26 (ModuleManager::creator_t)(ModuleName::create), ModuleName::expose); \
27 ModuleName* ModuleName::create() { \
28 auto* p = ModuleManager::find(name); \
29 if (p) return static_cast<ModuleName*>(p); \
30 ModuleName* n = newExpr; \
31 ModuleManager::insert(name, n); \
34 const char* ModuleName::name = #ModuleName
36#define getModInst(N,T) eve::ModuleManager::getInstance<N::T>(#T)
37#define requireModInst(N,T) eve::ModuleManager::requireInstance<N::T>(#T)
52 typedef void (*exposer_t)(ssq::Table&);
60 static void insert(
const char*
name,
Module* inst);
63 static void register_module(
const char*
name, creator_t
c, exposer_t e);
65 static void expose(
Runtime& runtime);
67 static void expose(ssq::VM&
vm);
69 static int expose_pending();
75 static void detach(
Runtime* runtime);
80 return static_cast<T*
>(inst().registered_modules[
name].instance);
86 auto& D = inst().registered_modules[
name];
87 if (D.instance)
return static_cast<T*
>(D.instance);
88 return static_cast<T*
>(D.creator());
92 static void exposeVM(ssq::VM&
vm);
95 creator_t creator =
nullptr;
96 exposer_t exposer =
nullptr;
#define EVENGINE_API
宿主(eve / libmain)导出宏;插件从进程导入同一批符号。
std::unordered_map< std::string, ModuleInfo > registered_modules
static T * getInstance(const char *name)
Casts the registered instance of a module to T (may be null).
static T * requireInstance(const char *name)
Returns the live instance, creating it lazily through the registered factory.
virtual std::string getName() const =0
@ Table
OT_TABLE (not yet editable).
EVEngine ECS 集成层:底层实现使用 sunxfancy/ECS.hpp https://github.com/sunxfancy/ECS.hpp