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 Wed Jul 28 08:07:07 2004 for Crypto++ by doxygen 1.3.7