diff options
author | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2002-12-06 22:02:46 +0000 |
---|---|---|
committer | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2002-12-06 22:02:46 +0000 |
commit | a3f0af934e387ba259919f0b72b42120eef3bc5c (patch) | |
tree | df9cff822523331cad30742ddb34056544c7a80d /factory.h | |
parent | f8840dc745d13414205c944b2ffc0796837340f5 (diff) | |
download | cryptopp-a3f0af934e387ba259919f0b72b42120eef3bc5c.tar.gz |
add script-driven testing
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@24 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'factory.h')
-rw-r--r-- | factory.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/factory.h b/factory.h new file mode 100644 index 0000000..85d6631 --- /dev/null +++ b/factory.h @@ -0,0 +1,90 @@ +#ifndef CRYPTOPP_OBJFACT_H +#define CRYPTOPP_OBJFACT_H + +#include "cryptlib.h" +#include <map> + +NAMESPACE_BEGIN(CryptoPP) + +template <class AbstractClass> +class ObjectFactory +{ +public: + virtual AbstractClass * CreateObject() const =0; +}; + +template <class AbstractClass, class ConcreteClass> +class DefaultObjectFactory : public ObjectFactory<AbstractClass> +{ +public: + AbstractClass * CreateObject() const + { + return new ConcreteClass; + } + +}; + +template <class AbstractClass> +class ObjectFactoryRegistry +{ +public: + ~ObjectFactoryRegistry() + { + for (Map::iterator i = m_map.begin(); i != m_map.end(); ++i) + { + delete i->second; + i->second = NULL; + } + } + + void RegisterFactory(const char *name, ObjectFactory<AbstractClass> *factory) + { + m_map[name] = factory; + } + + const ObjectFactory<AbstractClass> * GetFactory(const char *name) const + { + Map::const_iterator i = m_map.find(name); + return i == m_map.end() ? NULL : i->second; + } + + AbstractClass *CreateObject(const char *name) const + { + const ObjectFactory<AbstractClass> *factory = GetFactory(name); + return factory ? factory->CreateObject() : NULL; + } + + static ObjectFactoryRegistry<AbstractClass> & Registry() + { + static ObjectFactoryRegistry<AbstractClass> s_registry; + return s_registry; + } + +private: + typedef std::map<std::string, ObjectFactory<AbstractClass> *> Map; + Map m_map; +}; + +template <class AbstractClass, class ConcreteClass> +void RegisterDefaultFactoryFor(const char *name, AbstractClass *Dummy1=NULL, ConcreteClass *Dummy2=NULL) +{ + ObjectFactoryRegistry<AbstractClass>::Registry().RegisterFactory(name, new DefaultObjectFactory<AbstractClass, ConcreteClass>); +} + +template <class SchemeClass> +void RegisterPublicKeyCryptoSystemDefaultFactories(const char *name, SchemeClass *dummy=NULL) +{ + RegisterDefaultFactoryFor<PK_Encryptor, CPP_TYPENAME SchemeClass::Encryptor>(name); + RegisterDefaultFactoryFor<PK_Decryptor, CPP_TYPENAME SchemeClass::Decryptor>(name); +} + +template <class SchemeClass> +void RegisterSignatureSchemeDefaultFactories(const char *name, SchemeClass *dummy=NULL) +{ + RegisterDefaultFactoryFor<PK_Signer, CPP_TYPENAME SchemeClass::Signer>(name); + RegisterDefaultFactoryFor<PK_Verifier, CPP_TYPENAME SchemeClass::Verifier>(name); +} + +NAMESPACE_END + +#endif |