Advertisement
agrippa1994

Untitled

Dec 25th, 2013
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <memory>
  4. #include <vector>
  5. #include <map>
  6.  
  7. // LPDIRECT3DDEVICE9
  8. class Device { };
  9.  
  10.  
  11.  
  12. class OverlayObject
  13. {
  14.     class RenderInterface * const _interface;
  15.     int _id;
  16.  
  17. protected:
  18.     explicit OverlayObject(class RenderInterface * const interface, int id) : _interface(interface), _id(id) { }
  19.     virtual ~OverlayObject() { }
  20.  
  21. public:
  22.     class RenderInterface * const interface() { return _interface; }
  23.     int id() const { return _id; }
  24. };
  25.  
  26. class TextOverlay : public OverlayObject
  27. {
  28.     std::string _font;
  29. public:
  30.     explicit TextOverlay(class RenderInterface * const interface, int id, std::string font) : OverlayObject(interface, id), _font(font) { std::cout << "TextOverlay::TextOverlay" << std::endl; }
  31.     ~TextOverlay() { std::cout << "~TextOverlay" << std::endl; }
  32. };
  33.  
  34. class RenderInterface
  35. {
  36.     typedef std::shared_ptr<OverlayObject> overlay_ptr;
  37.     typedef std::set<overlay_ptr> overlay_set;
  38.    
  39.     Device *_device;
  40.     overlay_set overlays;
  41. public:
  42.     explicit RenderInterface(Device * const dev) : _device(dev) { }
  43.  
  44.     template<typename T, typename ...Args> std::shared_ptr<T> createOverlay(Args... params)
  45.     {
  46.         int id = 0;
  47.         while (true)
  48.         {
  49.             bool flag = false;
  50.             for (overlay_ptr ptr : overlays)
  51.                 if (id == ptr->id())
  52.                     flag = true;
  53.  
  54.             if (!flag)
  55.                 break;
  56.  
  57.             id ++;
  58.         }
  59.  
  60.         std::shared_ptr<T> ptr = std::make_shared<T>(this, id, params...);
  61.         overlays.insert(ptr);
  62.  
  63.         return ptr;
  64.     }
  65.  
  66.     template<typename T> void deleteOverlay(overlay_ptr obj)
  67.     {
  68.         overlays.erase(obj);
  69.     }
  70.  
  71.     void deleteOverlay(int id)
  72.     {
  73.         for (auto obj : overlays)
  74.         {
  75.             if (obj->id() == id)
  76.             {
  77.                 overlays.erase(obj);
  78.                 return;
  79.             }
  80.         }
  81.     }
  82.  
  83.     template<typename T> std::shared_ptr<T> ptrByID(int id)
  84.     {
  85.         for (auto obj : overlays)
  86.         {
  87.             if (obj->id() == id)
  88.             {
  89.                 return std::dynamic_pointer_cast<T>(obj);
  90.             }
  91.         }
  92.  
  93.         return nullptr;
  94.     }
  95. };
  96.  
  97. void main()
  98. {
  99.     // Könnte LPDIRECT3DDEVICE9 sein
  100.     Device dev;
  101.  
  102.     RenderInterface interface(&dev);
  103.     std::shared_ptr<TextOverlay> text_1 = interface.createOverlay<TextOverlay>("Arial");
  104.     std::shared_ptr<TextOverlay> text_2 = interface.createOverlay<TextOverlay>("Arial");
  105.  
  106.     std::cout << text_1->id() << ' ' << text_2->id() << std::endl;
  107.  
  108.     std::shared_ptr<TextOverlay> text_3 = interface.ptrByID<TextOverlay>(0);
  109.     if (text_3 == text_1)
  110.         std::cout << "Gleich!" << std::endl;
  111.  
  112.     std::cin.get();
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement