#if !defined(INCLUDED_MODULESYSTEM_MODULESMAP_H) #define INCLUDED_MODULESYSTEM_MODULESMAP_H #include "modulesystem.h" #include "string/string.h" #include #include template class ModulesMap : public Modules { typedef std::map modules_t; modules_t m_modules; public: ~ModulesMap() { for(modules_t::iterator i = m_modules.begin(); i != m_modules.end(); ++i) { (*i).second->release(); } } typedef modules_t::const_iterator iterator; iterator begin() const { return m_modules.begin(); } iterator end() const { return m_modules.end(); } void insert(const char* name, Module& module) { module.capture(); if(globalModuleServer().getError()) { module.release(); globalModuleServer().setError(false); } else { m_modules.insert(modules_t::value_type(name, &module)); } } Type* find(const char* name) { modules_t::iterator i = m_modules.find(name); if(i != m_modules.end()) { return static_cast(Module_getTable(*(*i).second)); } return 0; } Type* findModule(const char* name) { return find(name); } void foreachModule(typename Modules::Visitor& visitor) { for(modules_t::iterator i = m_modules.begin(); i != m_modules.end(); ++i) { visitor.visit((*i).first.c_str(), *static_cast(Module_getTable(*(*i).second))); } } }; template class InsertModules : public ModuleServer::Visitor { ModulesMap& m_modules; public: InsertModules(ModulesMap& modules) : m_modules(modules) { } void visit(const char* name, Module& module) { m_modules.insert(name, module); } }; template class ModulesRef { ModulesMap m_modules; public: ModulesRef(const char* names) { if(!globalModuleServer().getError()) { if(string_equal(names, "*")) { InsertModules visitor(m_modules); globalModuleServer().foreachModule(Type::name(), Type::VERSION, visitor); } else { StringTokeniser tokeniser(names); for(;;) { const char* name = tokeniser.getToken(); if(string_empty(name)) { break; } Module* module = globalModuleServer().findModule(Type::name(), Type::VERSION, name); if(module == 0) { globalModuleServer().setError(true); globalErrorStream() << "ModulesRef::initialise: type=" << makeQuoted(Type::name()) << " version= " << makeQuoted(int(Type::VERSION)) << " name=" << makeQuoted(name) << " - not found\n"; break; } else { m_modules.insert(name, *module); } } } } } ModulesMap& get() { return m_modules; } }; #endif