summaryrefslogtreecommitdiff
path: root/factory.h
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-12-06 22:02:46 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-12-06 22:02:46 +0000
commita3f0af934e387ba259919f0b72b42120eef3bc5c (patch)
treedf9cff822523331cad30742ddb34056544c7a80d /factory.h
parentf8840dc745d13414205c944b2ffc0796837340f5 (diff)
downloadcryptopp-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.h90
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