fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <queue>
  5. #include <memory>
  6.  
  7. class Event
  8. {
  9. public:
  10. typedef std::shared_ptr<Event> Pointer;
  11. int id;
  12. Event() : id(0) {}
  13.  
  14. virtual std::shared_ptr<Event> getSharedPointer()
  15. {
  16. return std::shared_ptr<Event>(this);
  17. }
  18. };
  19.  
  20. class ParameterChangedEvent : public Event
  21. {
  22. public:
  23. typedef std::shared_ptr<ParameterChangedEvent> Pointer;
  24. int id;
  25. std::string device;
  26. ParameterChangedEvent() : id(1), device("M1") {}
  27.  
  28. virtual std::shared_ptr<Event> getSharedPointer()
  29. {
  30. return std::make_shared<ParameterChangedEvent>(*this);
  31. }
  32. };
  33.  
  34. class YetAnotherEvent : public Event
  35. {
  36. public:
  37. typedef std::shared_ptr<YetAnotherEvent> Pointer;
  38. int id;
  39. YetAnotherEvent() : id(3) {}
  40.  
  41. virtual std::shared_ptr<Event> getSharedPointer()
  42. {
  43. return std::make_shared<YetAnotherEvent>(*this);
  44. }
  45. };
  46.  
  47. typedef std::function<void (Event::Pointer)> EventListener;
  48. std::queue<Event::Pointer> events;
  49. std::vector<EventListener> listeners;
  50.  
  51. void enqueue(Event & event)
  52. {
  53. events.push(event.getSharedPointer());
  54. }
  55.  
  56. void producer1()
  57. {
  58. ParameterChangedEvent event;
  59. enqueue(event);
  60. }
  61.  
  62. void producer2()
  63. {
  64. YetAnotherEvent event;
  65. enqueue(event);
  66. }
  67.  
  68. void dispatch()
  69. {
  70. while (!events.empty()) {
  71. auto event = events.front();
  72. for (auto listener: listeners) {
  73. listener(event);
  74. }
  75. events.pop();
  76. }
  77. }
  78.  
  79. void listener1(Event::Pointer event)
  80. {
  81. ParameterChangedEvent::Pointer event2 = std::dynamic_pointer_cast<ParameterChangedEvent>(event);
  82. if (event2 == nullptr) {
  83. return;
  84. }
  85. std::cout << "Listener 1 [Event.id:" << event2->id << "], device: " << event2->device << std::endl;
  86. }
  87.  
  88. void listener2(Event::Pointer event)
  89. {
  90. YetAnotherEvent::Pointer event2 = std::dynamic_pointer_cast<YetAnotherEvent>(event);
  91. if (event2 == nullptr) {
  92. return;
  93. }
  94. std::cout << "Listener 2 [Event.id:" << event2->id << "], id: " << event2->id << std::endl;
  95. }
  96.  
  97. int main()
  98. {
  99. listeners.push_back(EventListener(listener1));
  100. listeners.push_back(EventListener(listener2));
  101.  
  102. producer1();
  103. producer1();
  104. producer2();
  105. producer1();
  106. producer2();
  107. producer2();
  108.  
  109. dispatch();
  110.  
  111. return 0;
  112. }
  113.  
Success #stdin #stdout 0s 3488KB
stdin
Standard input is empty
stdout
Listener 1 [Event.id:1], device: M1
Listener 1 [Event.id:1], device: M1
Listener 2 [Event.id:3], id: 3
Listener 1 [Event.id:1], device: M1
Listener 2 [Event.id:3], id: 3
Listener 2 [Event.id:3], id: 3