forked from mia/Aegisub
Clean up factory_manager a bit
This commit is contained in:
parent
7bd1da7d45
commit
4116f030af
6 changed files with 29 additions and 38 deletions
|
@ -27,11 +27,10 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
template <class func>
|
template <typename func>
|
||||||
class FactoryBase {
|
class FactoryBase {
|
||||||
protected:
|
protected:
|
||||||
typedef std::map<std::string, std::pair<bool, func>> map;
|
typedef std::map<std::string, std::pair<bool, func>> map;
|
||||||
typedef typename map::iterator iterator;
|
|
||||||
|
|
||||||
static map& classes() {
|
static map& classes() {
|
||||||
static map classes;
|
static map classes;
|
||||||
|
@ -48,7 +47,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
static func Find(std::string const& name) {
|
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;
|
return factory != classes().end() ? factory->second.second : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,42 +68,34 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class Base>
|
template<typename Base, typename Arg1=void>
|
||||||
class Factory0 : public FactoryBase<std::unique_ptr<Base>(*)()> {
|
class Factory : public FactoryBase<Base *(*)(Arg1)> {
|
||||||
typedef std::unique_ptr<Base>(*func)();
|
typedef Base *(*func)(Arg1);
|
||||||
template<class T>
|
|
||||||
static std::unique_ptr<Base> create() {
|
|
||||||
return std::unique_ptr<Base>(new T);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
static std::unique_ptr<Base> Create(std::string const& name) {
|
|
||||||
func factory = FactoryBase<func>::Find(name);
|
|
||||||
return factory ? factory() : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
static void Register(std::string name, bool hide = false, std::vector<std::string> subTypes = std::vector<std::string>()) {
|
|
||||||
FactoryBase<func>::DoRegister(&Factory0<Base>::template create<T>, name, hide, subTypes);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class Base, class Arg1>
|
|
||||||
class Factory1 : public FactoryBase<std::unique_ptr<Base>(*)(Arg1)> {
|
|
||||||
typedef std::unique_ptr<Base>(*func)(Arg1);
|
|
||||||
template<class T>
|
|
||||||
static std::unique_ptr<Base> create(Arg1 a1) {
|
|
||||||
return std::unique_ptr<Base>(new T(a1));
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<Base> Create(std::string const& name, Arg1 a1) {
|
static std::unique_ptr<Base> Create(std::string const& name, Arg1 a1) {
|
||||||
func factory = FactoryBase<func>::Find(name);
|
auto factory = FactoryBase<func>::Find(name);
|
||||||
return factory ? factory(a1) : nullptr;
|
return factory ? std::unique_ptr<Base>(factory(a1)) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static void Register(std::string name, bool hide = false, std::vector<std::string> subTypes = std::vector<std::string>()) {
|
static void Register(std::string name, bool hide = false, std::vector<std::string> subTypes = std::vector<std::string>()) {
|
||||||
FactoryBase<func>::DoRegister(&Factory1<Base, Arg1>::template create<T>, name, hide, subTypes);
|
FactoryBase<func>::DoRegister([](Arg1 a1) -> Base * { return new T(a1); }, name, hide, subTypes);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Base>
|
||||||
|
class Factory<Base, void> : public FactoryBase<Base *(*)()> {
|
||||||
|
typedef Base *(*func)();
|
||||||
|
|
||||||
|
public:
|
||||||
|
static std::unique_ptr<Base> Create(std::string const& name) {
|
||||||
|
auto factory = FactoryBase<func>::Find(name);
|
||||||
|
return factory ? std::unique_ptr<Base>(factory()) : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
static void Register(std::string name, bool hide = false, std::vector<std::string> subTypes = std::vector<std::string>()) {
|
||||||
|
FactoryBase<func>::DoRegister([]() -> Base * { return new T; }, name, hide, subTypes);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -57,7 +57,7 @@ public:
|
||||||
virtual void SetEndPosition(int64_t pos)=0;
|
virtual void SetEndPosition(int64_t pos)=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AudioPlayerFactory : public Factory1<AudioPlayer, AudioProvider*> {
|
class AudioPlayerFactory : public Factory<AudioPlayer, AudioProvider*> {
|
||||||
public:
|
public:
|
||||||
static void RegisterProviders();
|
static void RegisterProviders();
|
||||||
static std::unique_ptr<AudioPlayer> GetAudioPlayer(AudioProvider *provider);
|
static std::unique_ptr<AudioPlayer> GetAudioPlayer(AudioProvider *provider);
|
||||||
|
|
|
@ -90,7 +90,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class AudioProviderFactory : public Factory1<AudioProvider, agi::fs::path> {
|
class AudioProviderFactory : public Factory<AudioProvider, agi::fs::path> {
|
||||||
public:
|
public:
|
||||||
static void RegisterProviders();
|
static void RegisterProviders();
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
namespace agi { class SpellChecker; }
|
namespace agi { class SpellChecker; }
|
||||||
|
|
||||||
class SpellCheckerFactory : public Factory0<agi::SpellChecker> {
|
class SpellCheckerFactory : public Factory<agi::SpellChecker> {
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<agi::SpellChecker> GetSpellChecker();
|
static std::unique_ptr<agi::SpellChecker> GetSpellChecker();
|
||||||
static void RegisterProviders();
|
static void RegisterProviders();
|
||||||
|
|
|
@ -47,7 +47,7 @@ public:
|
||||||
virtual void DrawSubtitles(VideoFrame &dst,double time)=0;
|
virtual void DrawSubtitles(VideoFrame &dst,double time)=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SubtitlesProviderFactory : public Factory1<SubtitlesProvider, std::string> {
|
class SubtitlesProviderFactory : public Factory<SubtitlesProvider, std::string> {
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<SubtitlesProvider> GetProvider();
|
static std::unique_ptr<SubtitlesProvider> GetProvider();
|
||||||
static void RegisterProviders();
|
static void RegisterProviders();
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include <libaegisub/fs_fwd.h>
|
#include <libaegisub/fs_fwd.h>
|
||||||
|
|
||||||
class VideoProviderFactory : public Factory1<VideoProvider, agi::fs::path> {
|
class VideoProviderFactory : public Factory<VideoProvider, agi::fs::path> {
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<VideoProvider> GetProvider(agi::fs::path const& video_file);
|
static std::unique_ptr<VideoProvider> GetProvider(agi::fs::path const& video_file);
|
||||||
static void RegisterProviders();
|
static void RegisterProviders();
|
||||||
|
|
Loading…
Reference in a new issue