#include <iostream>
#include <string>
#include <memory>
#include <unordered_map>
using namespace std;
////////////////////////////////////////////////////////////////
// Manager declaration
////////////////////////////////////////////////////////////////
class manager {
public:
class instance;
instance &get_instance(string name);
void print(string sender, string message);
private:
unordered_map<string, unique_ptr<instance>> m_instances;
};
////////////////////////////////////////////////////////////////
// Instance declaration
////////////////////////////////////////////////////////////////
class manager::instance {
public:
instance(string name, manager &manager);
void print(string message);
private:
string m_name;
manager &m_manager;
};
////////////////////////////////////////////////////////////////
// Manager implementation
////////////////////////////////////////////////////////////////
manager::instance &manager::get_instance(string name) {
if (m_instances.find(name) == m_instances.end())
m_instances[name] = unique_ptr<instance>(new instance(name, *this));
return *m_instances[name].get();
}
void manager::print(string sender, string message) {
cout << sender << ": " << message << "." << endl;
}
////////////////////////////////////////////////////////////////
// Instance implementation
////////////////////////////////////////////////////////////////
manager::instance::instance(string name, manager &manager) : m_name(name),
m_manager(manager) {}
void manager::instance::print(string message) {
m_manager.print(m_name, message);
}
////////////////////////////////////////////////////////////////
// Main function
////////////////////////////////////////////////////////////////
int main() {
manager m;
m.get_instance("Window").print("Open up");
m.get_instance("Asset").print("Load textures");
return 0;
}