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