#include "Models.h" namespace platform { using namespace std; // Idea from: https://www.codeproject.com/Articles/567242/AplusC-2b-2bplusObjectplusFactory Models* Models::factory = nullptr;; Models* Models::instance() { //manages singleton if (factory == nullptr) factory = new Models(); return factory; } void Models::registerFactoryFunction(const string& name, function classFactoryFunction) { // register the class factory function functionRegistry[name] = classFactoryFunction; } shared_ptr Models::create(const string& name) { bayesnet::BaseClassifier* instance = nullptr; // find name in the registry and call factory method. auto it = functionRegistry.find(name); if (it != functionRegistry.end()) instance = it->second(); // wrap instance in a shared ptr and return if (instance != nullptr) return unique_ptr(instance); else return nullptr; } vector Models::getNames() { vector names; transform(functionRegistry.begin(), functionRegistry.end(), back_inserter(names), [](const pair>& pair) { return pair.first; }); return names; } string Models::toString() { string result = ""; for (const auto& pair : functionRegistry) { result += pair.first + ", "; } return "{" + result.substr(0, result.size() - 2) + "}"; } Registrar::Registrar(const string& name, function classFactoryFunction) { // register the class factory function Models::instance()->registerFactoryFunction(name, classFactoryFunction); } }