#ifndef BE13A370_B199_43EC_A4E6_E2D4FD197D63 #define BE13A370_B199_43EC_A4E6_E2D4FD197D63 /* ******************************************************************************* * INCLUDE ******************************************************************************* */ #include "ClassAssistant.h" #include #include #include namespace Util { /* ******************************************************************************* * CLASS DECLARE ******************************************************************************* */ template class SimpleSelector { public: static T select(T val) { return val; } }; template class FactoryManager { private: class IFactory { public: using Ptr = Poco::SharedPtr; virtual ~IFactory() { } public: virtual T* create(TArgs... args) = 0; }; template class Factory: public IFactory { public: C* create(TArgs... args) override { return new C(args...); } }; using Factories = std::map; public: static T* create(TArgs... args) { TKey key = TSelector::select(args...); if (_factories.find(key) == _factories.end()) throw Poco::NotFoundException( Poco::format("FactoryManager: Factory '%s' does not exists.", Util::ClassAssistant::demangle()), -EINVAL); return _factories[key]->create(args...); } template static void registerClass(TKey key) { _factories[key] = new Factory(); } private: static Factories _factories; }; template typename FactoryManager::Factories FactoryManager::_factories; } #endif