diff --git a/aegisub/src/factory_manager.h b/aegisub/src/factory_manager.h index 912fc70ee..cc80e3b76 100644 --- a/aegisub/src/factory_manager.h +++ b/aegisub/src/factory_manager.h @@ -27,11 +27,10 @@ #include #include -template +template class FactoryBase { protected: typedef std::map> map; - typedef typename map::iterator iterator; static map& classes() { static map classes; @@ -48,7 +47,7 @@ protected: } static func Find(std::string const& name) { - iterator factory = classes().find(name); + auto factory = classes().find(name); return factory != classes().end() ? factory->second.second : nullptr; } @@ -69,42 +68,34 @@ public: } }; -template -class Factory0 : public FactoryBase(*)()> { - typedef std::unique_ptr(*func)(); - template - static std::unique_ptr create() { - return std::unique_ptr(new T); - } - -public: - static std::unique_ptr Create(std::string const& name) { - func factory = FactoryBase::Find(name); - return factory ? factory() : nullptr; - } - - template - static void Register(std::string name, bool hide = false, std::vector subTypes = std::vector()) { - FactoryBase::DoRegister(&Factory0::template create, name, hide, subTypes); - } -}; - -template -class Factory1 : public FactoryBase(*)(Arg1)> { - typedef std::unique_ptr(*func)(Arg1); - template - static std::unique_ptr create(Arg1 a1) { - return std::unique_ptr(new T(a1)); - } +template +class Factory : public FactoryBase { + typedef Base *(*func)(Arg1); public: static std::unique_ptr Create(std::string const& name, Arg1 a1) { - func factory = FactoryBase::Find(name); - return factory ? factory(a1) : nullptr; + auto factory = FactoryBase::Find(name); + return factory ? std::unique_ptr(factory(a1)) : nullptr; } template static void Register(std::string name, bool hide = false, std::vector subTypes = std::vector()) { - FactoryBase::DoRegister(&Factory1::template create, name, hide, subTypes); + FactoryBase::DoRegister([](Arg1 a1) -> Base * { return new T(a1); }, name, hide, subTypes); + } +}; + +template +class Factory : public FactoryBase { + typedef Base *(*func)(); + +public: + static std::unique_ptr Create(std::string const& name) { + auto factory = FactoryBase::Find(name); + return factory ? std::unique_ptr(factory()) : nullptr; + } + + template + static void Register(std::string name, bool hide = false, std::vector subTypes = std::vector()) { + FactoryBase::DoRegister([]() -> Base * { return new T; }, name, hide, subTypes); } }; diff --git a/aegisub/src/include/aegisub/audio_player.h b/aegisub/src/include/aegisub/audio_player.h index 32cd4cd9e..01c9075d3 100644 --- a/aegisub/src/include/aegisub/audio_player.h +++ b/aegisub/src/include/aegisub/audio_player.h @@ -57,7 +57,7 @@ public: virtual void SetEndPosition(int64_t pos)=0; }; -class AudioPlayerFactory : public Factory1 { +class AudioPlayerFactory : public Factory { public: static void RegisterProviders(); static std::unique_ptr GetAudioPlayer(AudioProvider *provider); diff --git a/aegisub/src/include/aegisub/audio_provider.h b/aegisub/src/include/aegisub/audio_provider.h index ba91933e3..9de5f377d 100644 --- a/aegisub/src/include/aegisub/audio_provider.h +++ b/aegisub/src/include/aegisub/audio_provider.h @@ -90,7 +90,7 @@ public: } }; -class AudioProviderFactory : public Factory1 { +class AudioProviderFactory : public Factory { public: static void RegisterProviders(); diff --git a/aegisub/src/include/aegisub/spellchecker.h b/aegisub/src/include/aegisub/spellchecker.h index 61638dfa3..953a40667 100644 --- a/aegisub/src/include/aegisub/spellchecker.h +++ b/aegisub/src/include/aegisub/spellchecker.h @@ -23,7 +23,7 @@ namespace agi { class SpellChecker; } -class SpellCheckerFactory : public Factory0 { +class SpellCheckerFactory : public Factory { public: static std::unique_ptr GetSpellChecker(); static void RegisterProviders(); diff --git a/aegisub/src/include/aegisub/subtitles_provider.h b/aegisub/src/include/aegisub/subtitles_provider.h index be2bc9459..34d8d300b 100644 --- a/aegisub/src/include/aegisub/subtitles_provider.h +++ b/aegisub/src/include/aegisub/subtitles_provider.h @@ -47,7 +47,7 @@ public: virtual void DrawSubtitles(VideoFrame &dst,double time)=0; }; -class SubtitlesProviderFactory : public Factory1 { +class SubtitlesProviderFactory : public Factory { public: static std::unique_ptr GetProvider(); static void RegisterProviders(); diff --git a/aegisub/src/video_provider_manager.h b/aegisub/src/video_provider_manager.h index 5123ed580..5b022818a 100644 --- a/aegisub/src/video_provider_manager.h +++ b/aegisub/src/video_provider_manager.h @@ -19,7 +19,7 @@ #include -class VideoProviderFactory : public Factory1 { +class VideoProviderFactory : public Factory { public: static std::unique_ptr GetProvider(agi::fs::path const& video_file); static void RegisterProviders();