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
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