Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

factory.h

00001 #ifndef CRYPTOPP_OBJFACT_H
00002 #define CRYPTOPP_OBJFACT_H
00003 
00004 #include "cryptlib.h"
00005 #include <map>
00006 
00007 NAMESPACE_BEGIN(CryptoPP)
00008 
00009 template <class AbstractClass>
00010 class ObjectFactory
00011 {
00012 public:
00013         virtual AbstractClass * CreateObject() const =0;
00014 };
00015 
00016 template <class AbstractClass, class ConcreteClass>
00017 class DefaultObjectFactory : public ObjectFactory<AbstractClass>
00018 {
00019 public:
00020         AbstractClass * CreateObject() const
00021         {
00022                 return new ConcreteClass;
00023         }
00024         
00025 };
00026 
00027 template <class AbstractClass>
00028 class ObjectFactoryRegistry
00029 {
00030 public:
00031         ~ObjectFactoryRegistry()
00032         {
00033                 for (CPP_TYPENAME Map::iterator i = m_map.begin(); i != m_map.end(); ++i)
00034                 {
00035                         delete i->second;
00036                         i->second = NULL;
00037                 }
00038         }
00039 
00040         void RegisterFactory(const char *name, ObjectFactory<AbstractClass> *factory)
00041         {
00042                 m_map[name] = factory;
00043         }
00044 
00045         const ObjectFactory<AbstractClass> * GetFactory(const char *name) const
00046         {
00047                 CPP_TYPENAME Map::const_iterator i = m_map.find(name);
00048                 return i == m_map.end() ? NULL : i->second;
00049         }
00050 
00051         AbstractClass *CreateObject(const char *name) const
00052         {
00053                 const ObjectFactory<AbstractClass> *factory = GetFactory(name);
00054                 return factory ? factory->CreateObject() : NULL;
00055         }
00056 
00057         // VC60 workaround: use "..." to prevent this function from being inlined
00058         static ObjectFactoryRegistry<AbstractClass> & Registry(...);
00059 
00060 private:
00061         typedef std::map<std::string, ObjectFactory<AbstractClass> *> Map;
00062         Map m_map;
00063 };
00064 
00065 template <class AbstractClass>
00066 ObjectFactoryRegistry<AbstractClass> & ObjectFactoryRegistry<AbstractClass>::Registry(...)
00067 {
00068         static ObjectFactoryRegistry<AbstractClass> s_registry;
00069         return s_registry;
00070 }
00071 
00072 template <class AbstractClass, class ConcreteClass>
00073 void RegisterDefaultFactoryFor(const char *name, AbstractClass *Dummy1=NULL, ConcreteClass *Dummy2=NULL)
00074 {
00075         ObjectFactoryRegistry<AbstractClass>::Registry().RegisterFactory(name, new DefaultObjectFactory<AbstractClass, ConcreteClass>);
00076 }
00077 
00078 template <class SchemeClass>
00079 void RegisterPublicKeyCryptoSystemDefaultFactories(const char *name, SchemeClass *dummy=NULL)
00080 {
00081         RegisterDefaultFactoryFor<PK_Encryptor, CPP_TYPENAME SchemeClass::Encryptor>(name);
00082         RegisterDefaultFactoryFor<PK_Decryptor, CPP_TYPENAME SchemeClass::Decryptor>(name);
00083 }
00084 
00085 template <class SchemeClass>
00086 void RegisterSignatureSchemeDefaultFactories(const char *name, SchemeClass *dummy=NULL)
00087 {
00088         RegisterDefaultFactoryFor<PK_Signer, CPP_TYPENAME SchemeClass::Signer>(name);
00089         RegisterDefaultFactoryFor<PK_Verifier, CPP_TYPENAME SchemeClass::Verifier>(name);
00090 }
00091 
00092 NAMESPACE_END
00093 
00094 #endif

Generated on Sun Mar 14 20:44:25 2004 for Crypto++ by doxygen 1.3.6-20040222