diff options
author | Stijn Buys <ingar@osirion.org> | 2008-11-23 12:34:07 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-11-23 12:34:07 +0000 |
commit | 583ec3285c41e9d253c4aaabd2af4dadac75f3a7 (patch) | |
tree | 5ec345e44af9d3699a95f493d8358ee766e23330 /src/core/loader.cc | |
parent | 44158ccfbe943b832c0e0bf9ce547212aa6c2b8b (diff) |
clean module consturction/destruction
Diffstat (limited to 'src/core/loader.cc')
-rw-r--r-- | src/core/loader.cc | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/core/loader.cc b/src/core/loader.cc new file mode 100644 index 0000000..46e0990 --- /dev/null +++ b/src/core/loader.cc @@ -0,0 +1,93 @@ +/* + core/loader.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "auxiliary/functions.h" +#include "core/loader.h" +#include "sys/sys.h" + +namespace core { + +Loader::Registry Loader::loader_registry; +std::string Loader::loader_label; + +Loader::FactoryFuncPtr Loader::find(const char *label) +{ + Registry::iterator it = loader_registry.find(label); + if (it == loader_registry.end()) + return 0; + else + return (*it).second; +} + +Loader::FactoryFuncPtr Loader::find(const std::string &label) +{ + return (find(label.c_str())); +} + +void Loader::add(const std::string &label, FactoryFuncPtr factory) +{ + if (find(label)) { + con_warn << "module '" << label << "' already registered" << std::endl; + return; + } + + loader_registry[label] = factory; + con_debug << " registering module '" << label << "'" << std::endl; +} + +bool Loader::load(const char *label) +{ + FactoryFuncPtr factory = find(label); + if (!factory) { + con_warn << "module '" << label << "' not found" << std::endl; + return false; + } + + con_debug << " loading module '" << label << "'" << std::endl; + loader_label.assign(label); + return true; +} + +bool Loader::load(const std::string &label) +{ + return load(label.c_str()); +} + +Module *Loader::init() +{ + FactoryFuncPtr factory = find(loader_label); + if (!factory) { + con_warn << "module '" << loader_label << "' not found" << std::endl; + } + + Module *module = factory(); + module->set_label(loader_label); + return module; +} + +void Loader::clear() +{ + loader_registry.clear(); + loader_label.clear(); +} + +void Loader::list() +{ + std::string loaderlist; + for (Registry::iterator it = loader_registry.begin(); it != loader_registry.end(); it++) { + if (loaderlist.size()) + loaderlist += " "; + loaderlist += (*it).first; + + } + con_print << loaderlist << std::endl; + con_print << loader_registry.size() << " registered " << aux::plural("modules", loader_registry.size()) << std::endl; +} + + +} + + |