#ifndef _ARC_FF_FACTORY_H_ #define _ARC_FF_FACTORY_H_ #include #include #include struct ArcFFFactoryBase { virtual boost::shared_ptr Create(const std::string& param) const = 0; }; template struct ArcFFFactory : public ArcFFFactoryBase { boost::shared_ptr Create(const std::string& param) const { return boost::shared_ptr(new FF(param)); } }; struct ArcFFRegistry { boost::shared_ptr Create(const std::string& name, const std::string& param) const { std::map::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 facts; }; std::ostream& operator<<(std::ostream& os, const ArcFFRegistry& reg) { for (std::map::const_iterator it = reg.facts.begin(); it != reg.facts.end(); ++it) { os << " " << it->first << std::endl; } return os; } #endif