/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #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(const 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) const { 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(typename Type::Name(), typename Type::Version(), visitor); } else { StringTokeniser tokeniser(names); for(;;) { const char* name = tokeniser.getToken(); if(string_empty(name)) { break; } Module* module = globalModuleServer().findModule(typename Type::Name(), typename Type::Version(), name); if(module == 0) { globalModuleServer().setError(true); globalErrorStream() << "ModulesRef::initialise: type=" << makeQuoted(typename Type::Name()) << " version=" << makeQuoted(typename Type::Version()) << " name=" << makeQuoted(name) << " - not found\n"; break; } else { m_modules.insert(name, *module); } } } } } ModulesMap& get() { return m_modules; } }; #endif