/* 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("module", loader_registry.size()) << std::endl; } }