#ifndef CRYPTOPP_OBJFACT_H #define CRYPTOPP_OBJFACT_H #include "cryptlib.h" #include NAMESPACE_BEGIN(CryptoPP) template class ObjectFactory { public: virtual AbstractClass * CreateObject() const =0; }; template class DefaultObjectFactory : public ObjectFactory { public: AbstractClass * CreateObject() const { return new ConcreteClass; } }; template class ObjectFactoryRegistry { public: ~ObjectFactoryRegistry() { for (CPP_TYPENAME Map::iterator i = m_map.begin(); i != m_map.end(); ++i) { delete i->second; i->second = NULL; } } void RegisterFactory(const char *name, ObjectFactory *factory) { m_map[name] = factory; } const ObjectFactory * GetFactory(const char *name) const { CPP_TYPENAME Map::const_iterator i = m_map.find(name); return i == m_map.end() ? NULL : i->second; } AbstractClass *CreateObject(const char *name) const { const ObjectFactory *factory = GetFactory(name); return factory ? factory->CreateObject() : NULL; } static ObjectFactoryRegistry & Registry() { static ObjectFactoryRegistry s_registry; return s_registry; } private: typedef std::map *> Map; Map m_map; }; template void RegisterDefaultFactoryFor(const char *name, AbstractClass *Dummy1=NULL, ConcreteClass *Dummy2=NULL) { ObjectFactoryRegistry::Registry().RegisterFactory(name, new DefaultObjectFactory); } template void RegisterPublicKeyCryptoSystemDefaultFactories(const char *name, SchemeClass *dummy=NULL) { RegisterDefaultFactoryFor(name); RegisterDefaultFactoryFor(name); } template void RegisterSignatureSchemeDefaultFactories(const char *name, SchemeClass *dummy=NULL) { RegisterDefaultFactoryFor(name); RegisterDefaultFactoryFor(name); } NAMESPACE_END #endif