15#define REGISTER_SCRIPT_IMPL2(Type, Name, Line) \
17 struct ScriptReg_##Line { \
18 ScriptReg_##Line() { \
19 ::visutwin::canvas::ScriptFactories::instance().registerFactory( \
20 Name, [] { return std::make_unique<Type>(); } \
24 static ScriptReg_##Line reg_instance_##Line; \
27#define REGISTER_SCRIPT_IMPL(Type, Name, Line) \
28 REGISTER_SCRIPT_IMPL2(Type, Name, Line)
30#define REGISTER_SCRIPT(Type, Name) \
31 REGISTER_SCRIPT_IMPL(Type, Name, __LINE__)
48 _factories[name] = std::move(factory);
52 auto it = _factories.find(name);
53 return (it != _factories.end()) ? it->second :
nullptr;
57 std::unordered_map<std::string, ScriptFactory> _factories;
66 explicit ScriptRegistry(std::shared_ptr<Engine> engine): _engine(std::move(engine)) {}
70 std::unique_ptr<Script>
create(
const std::string& name)
const;
74 registerType(T::scriptName(), [] {
return std::make_unique<T>(); });
78 std::shared_ptr<Engine> _engine;
80 std::unordered_map<std::string, ScriptFactory> _types;
static ScriptFactories & instance()
ScriptFactory getFactory(const std::string &name) const
void registerFactory(const std::string &name, ScriptFactory factory)
ScriptRegistry(std::shared_ptr< Engine > engine)
std::unique_ptr< Script > create(const std::string &name) const
std::function< std::unique_ptr< Script >()> ScriptFactory