Guest User

Untitled

a guest
Apr 6th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "precompiled.hpp"
  4.  
  5. namespace twg7
  6. {
  7.     template<class T> class Manager
  8.     {
  9.     protected:
  10.         std::map<std::pair<std::string, int>, T*> objects;
  11.         std::function<T*(const std::string&)> constructor;
  12.  
  13.     public:
  14.         Manager(const std::function<T*(const std::string&)> &constructor = [](const std::string &name) -> T*
  15.         {
  16.             return new T(name);
  17.         }) :
  18.                 constructor(constructor)
  19.         {
  20.  
  21.         }
  22.  
  23.         ~Manager()
  24.         {
  25.             this->for_each_ptr([](T *object) -> void
  26.             {
  27.                 delete object;
  28.             });
  29.         }
  30.  
  31.         T* add_ptr(const std::string &name, int id, bool addToList = true)
  32.         {
  33.             if (this->objects.count({name, id}) > 0) throw std::runtime_error("Object (" + name + "; " + std::to_string(id) + ") already in list!");
  34.             T *element = this->constructor(name);
  35.             if (addToList) this->objects.insert({std::make_pair(name, id), element});
  36.             return element;
  37.         }
  38.  
  39.         T* add_ptr(const std::string &name)
  40.         {
  41.             return this->add_ptr(name, this->objects.size());
  42.         }
  43.  
  44.         T& add(const std::string &name, int id)
  45.         {
  46.             return *(this->add_ptr(name, id));
  47.         }
  48.  
  49.         T& add(const std::string &name)
  50.         {
  51.             return *(this->add_ptr(name));
  52.         }
  53.  
  54.         T* get_ptr(const std::string &name, int id = 0)
  55.         {
  56.             if (this->objects.count({name, id}) == 0) return this->add_ptr(name, id);
  57.             return this->objects[{name, id}];
  58.         }
  59.  
  60.         T& get(const std::string &name, int id = 0)
  61.         {
  62.             return *(this->get_ptr(name, id));
  63.         }
  64.  
  65.         void for_each_ptr(const std::function<void(T*)> &processor)
  66.         {
  67.             for (std::pair<std::pair<std::string, int>, T*> pair : this->objects)
  68.             {
  69.                 processor(pair.second);
  70.             }
  71.         }
  72.  
  73.         void for_each(const std::function<void(T&)> &processor)
  74.         {
  75.             this->for_each_ptr([&processor](T *object) -> void
  76.             {
  77.                 processor(*object);
  78.             });
  79.         }
  80.     };
  81. }
Advertisement
Add Comment
Please, Sign In to add comment