Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-11-23 12:34:07 +0000
committerStijn Buys <ingar@osirion.org>2008-11-23 12:34:07 +0000
commit583ec3285c41e9d253c4aaabd2af4dadac75f3a7 (patch)
tree5ec345e44af9d3699a95f493d8358ee766e23330 /src/core/loader.cc
parent44158ccfbe943b832c0e0bf9ce547212aa6c2b8b (diff)
clean module consturction/destruction
Diffstat (limited to 'src/core/loader.cc')
-rw-r--r--src/core/loader.cc93
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;
+}
+
+
+}
+
+