Advertisement
s1ay3r44

DataLayer

Aug 15th, 2014
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. //DataLayer.h
  2. #pragma once
  3. #include<boost\any.hpp>
  4. #include<unordered_map>
  5. #include<typeindex>
  6. #include<iostream>
  7.  
  8. #include "Handle.h"
  9.  
  10. class DataLayer
  11. {
  12. public:
  13.     DataLayer();
  14.     ~DataLayer();
  15.     template<class T>
  16.     T* create(std::string str);
  17.     template<class T>
  18.     T* getData(std::string);
  19.     template<class T>
  20.     void setData(std::string, T&);
  21. private:
  22.     std::unordered_map<std::string, Handle> data;
  23. };
  24.  
  25. template<class T>
  26. T* DataLayer::create(std::string str){
  27.     if (data[str].ptr != NULL){
  28.         Deleter_base* deleter = static_cast<Deleter_base*>(data[str].deleter);
  29.         deleter->_delete(data[str]);
  30.         delete deleter;
  31.         std::cout << "Deleting old data at " << str.c_str() << "\n";
  32.     }
  33.     std::cout << "Creating new " << typeid(T).name() << " at " << str.c_str() << "\n";
  34.     data[str].ptr = new T;
  35.     data[str].deleter = new Deleter<T>;
  36.     return static_cast<T*>(data[str].ptr);
  37. }
  38.  
  39. template<class T>
  40. T* DataLayer::getData(std::string str){
  41.     T* castData = static_cast<T*>(data[str].ptr);
  42.     if (castData == NULL)
  43.         std::cout << "WARNING: Cast from void* to " << typeid(castData).name() << " failed in getData\n";
  44.     return castData;
  45. }
  46.  
  47. template<class T>
  48. void DataLayer::setData(std::string str, T& toSet){
  49.     if (data[str].ptr == NULL)
  50.         create<T>(str);
  51.     T* ptrToData = static_cast<T*>(data[str].ptr);
  52.     if (ptrToData == NULL){
  53.         std::cout << "WARNING: Cast from void* to " << typeid(ptrToData).name() << " failed in setData\n";
  54.         return;
  55.     }
  56.     else{
  57.         *ptrToData = toSet;
  58.     }
  59. }
  60.  
  61. //DataLayer.cpp
  62. #include "DataLayer.h"
  63.  
  64.  
  65. DataLayer::DataLayer()
  66. {
  67. }
  68.  
  69.  
  70. DataLayer::~DataLayer()
  71. {
  72.     for (auto it = data.begin(); it != data.end(); it++){
  73.         std::cout << "~DATALAYER: Deleting " << typeid(it->second).name() << " at " << it->first.c_str() << "\n";
  74.         Deleter_base* deleter = static_cast<Deleter_base*>(it->second.deleter);
  75.         deleter->_delete(it->second);
  76.         delete deleter;
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement