summaryrefslogtreecommitdiff
path: root/rst_parser/arc_ff_factory.h
diff options
context:
space:
mode:
Diffstat (limited to 'rst_parser/arc_ff_factory.h')
-rw-r--r--rst_parser/arc_ff_factory.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/rst_parser/arc_ff_factory.h b/rst_parser/arc_ff_factory.h
new file mode 100644
index 00000000..4237fd5d
--- /dev/null
+++ b/rst_parser/arc_ff_factory.h
@@ -0,0 +1,42 @@
+#ifndef _ARC_FF_FACTORY_H_
+#define _ARC_FF_FACTORY_H_
+
+#include <string>
+#include <map>
+#include <boost/shared_ptr.hpp>
+
+struct ArcFFFactoryBase {
+ virtual boost::shared_ptr<ArcFeatureFunction> Create(const std::string& param) const = 0;
+};
+
+template<class FF>
+struct ArcFFFactory : public ArcFFFactoryBase {
+ boost::shared_ptr<ArcFeatureFunction> Create(const std::string& param) const {
+ return boost::shared_ptr<ArcFeatureFunction>(new FF(param));
+ }
+};
+
+struct ArcFFRegistry {
+ boost::shared_ptr<ArcFeatureFunction> Create(const std::string& name, const std::string& param) const {
+ std::map<std::string, ArcFFFactoryBase*>::const_iterator it = facts.find(name);
+ assert(it != facts.end());
+ return it->second->Create(param);
+ }
+
+ void Register(const std::string& name, ArcFFFactoryBase* fact) {
+ ArcFFFactoryBase*& f = facts[name];
+ assert(f == NULL);
+ f = fact;
+ }
+ std::map<std::string, ArcFFFactoryBase*> facts;
+};
+
+std::ostream& operator<<(std::ostream& os, const ArcFFRegistry& reg) {
+ for (std::map<std::string, ArcFFFactoryBase*>::const_iterator it = reg.facts.begin();
+ it != reg.facts.end(); ++it) {
+ os << " " << it->first << std::endl;
+ }
+ return os;
+}
+
+#endif