Advertisement
syngenara

Listener system

Jul 15th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. template<class IListener>
  10. class ListenerManager
  11. {  
  12. public:
  13.     void registerListener(IListener* listener)
  14.     {
  15.         listeners.insert(listener);
  16.     }
  17.  
  18.     void unregisterListener(IListener* listener)
  19.     {
  20.         listeners.erase(listener);
  21.     }
  22.  
  23. protected:
  24.    
  25.     template<class... FuncArgs, class... InvokeArgs>
  26.     void InvokeListener(void (IListener::*function)(FuncArgs...), InvokeArgs... args)
  27.     {
  28.         for (auto listener : listeners)
  29.             (listener->*(function))(args...); // yes, it`s magic!
  30.     }
  31.    
  32. private:
  33.     std::set<IListener*> listeners;
  34. };
  35.  
  36.  
  37. struct IDrigaloListener
  38. {
  39.     virtual void KatanaZero() = 0;
  40.     virtual void Drigae(int) = 0;
  41.     virtual void NotDrigae(float, char) = 0;
  42. };
  43.  
  44. struct IDrigaloNextGenListener
  45. {
  46.     virtual void KatanaZero() = 0;
  47.     virtual void Drigae(int) = 0;
  48.     virtual void NotDrigae(float, char) = 0;
  49. };
  50.  
  51.  
  52. class DrigaloSystem: public ListenerManager<IDrigaloListener>, public ListenerManager<IDrigaloNextGenListener>
  53. {
  54. public:
  55.     void CallDrigala()
  56.     {
  57.         InvokeListener(&IDrigaloListener::KatanaZero);
  58.         InvokeListener(&IDrigaloListener::Drigae, 100);
  59.         InvokeListener(&IDrigaloListener::NotDrigae, 0.5, 'a');
  60.     }
  61. };
  62.  
  63.  
  64. class DrigaloHandler: public IDrigaloListener
  65. {
  66. public:
  67.  
  68.     void KatanaZero() override
  69.     {
  70.         cout << "Katana drigae" << endl;
  71.     }
  72.    
  73.     void Drigae(int a) override
  74.     {
  75.         cout << "Drigae> " << a << endl;
  76.     }
  77.    
  78.     void NotDrigae(float a, char b) override
  79.     {
  80.         cout << "Not drigae> " << a << ":" << b << endl;
  81.     }
  82. };
  83.  
  84. class SuperDrigaloHandler : public IDrigaloListener
  85. {
  86. public:
  87.  
  88.     void KatanaZero() override
  89.     {
  90.         cout << "Katana super drigae" << endl;
  91.     }
  92.    
  93.     void Drigae(int a) override
  94.     {
  95.         cout << "Super drigae> " << a << endl;
  96.     }
  97.  
  98.     void NotDrigae(float a, char b) override
  99.     {
  100.         cout << "Not super drigae> " << a << ":" << b << endl;
  101.     }
  102. };
  103.  
  104.  
  105.  
  106. int main(int argc, char *argv[])
  107. {
  108.  
  109.     DrigaloSystem drigalo;
  110.    
  111.     DrigaloHandler handler1;
  112.     DrigaloHandler handler2;
  113.     SuperDrigaloHandler handler3;
  114.     SuperDrigaloHandler handler4;
  115.    
  116.     drigalo.registerListener(&handler1);
  117.     drigalo.registerListener(&handler2);
  118.     drigalo.registerListener(&handler3);
  119.     drigalo.registerListener(&handler4);
  120.  
  121.     drigalo.CallDrigala();
  122.    
  123.     drigalo.unregisterListener(&handler1);
  124.     drigalo.unregisterListener(&handler2);
  125.     drigalo.unregisterListener(&handler3);
  126.     drigalo.unregisterListener(&handler4);
  127.    
  128.     getchar();
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement