2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #if !defined(INCLUDED_MODULESYSTEM_MODULESMAP_H)
23 #define INCLUDED_MODULESYSTEM_MODULESMAP_H
25 #include "modulesystem.h"
26 #include "string/string.h"
30 template<typename Type>
31 class ModulesMap : public Modules<Type>
33 typedef std::map<CopiedString, Module*> modules_t;
38 for(modules_t::iterator i = m_modules.begin(); i != m_modules.end(); ++i)
40 (*i).second->release();
44 typedef modules_t::const_iterator iterator;
46 iterator begin() const
48 return m_modules.begin();
52 return m_modules.end();
55 void insert(const char* name, Module& module)
58 if(globalModuleServer().getError())
61 globalModuleServer().setError(false);
65 m_modules.insert(modules_t::value_type(name, &module));
69 Type* find(const char* name)
71 modules_t::iterator i = m_modules.find(name);
72 if(i != m_modules.end())
74 return static_cast<Type*>(Module_getTable(*(*i).second));
79 Type* findModule(const char* name)
83 void foreachModule(const typename Modules<Type>::Visitor& visitor)
85 for(modules_t::iterator i = m_modules.begin(); i != m_modules.end(); ++i)
87 visitor.visit((*i).first.c_str(), *static_cast<const Type*>(Module_getTable(*(*i).second)));
92 template<typename Type>
93 class InsertModules : public ModuleServer::Visitor
95 ModulesMap<Type>& m_modules;
97 InsertModules(ModulesMap<Type>& modules)
101 void visit(const char* name, Module& module) const
103 m_modules.insert(name, module);
107 template<typename Type>
110 ModulesMap<Type> m_modules;
112 ModulesRef(const char* names)
114 if(!globalModuleServer().getError())
116 if(string_equal(names, "*"))
118 InsertModules<Type> visitor(m_modules);
119 globalModuleServer().foreachModule(typename Type::Name(), typename Type::Version(), visitor);
123 StringTokeniser tokeniser(names);
126 const char* name = tokeniser.getToken();
127 if(string_empty(name))
131 Module* module = globalModuleServer().findModule(typename Type::Name(), typename Type::Version(), name);
134 globalModuleServer().setError(true);
135 globalErrorStream() << "ModulesRef::initialise: type=" << makeQuoted(typename Type::Name()) << " version=" << makeQuoted(typename Type::Version()) << " name=" << makeQuoted(name) << " - not found\n";
140 m_modules.insert(name, *module);
146 ModulesMap<Type>& get()