Hummingbird Framework
 All Classes Functions Variables Modules Pages
EventManager.h
1 #ifndef HB_EVENT_MANAGER_H
2 #define HB_EVENT_MANAGER_H
3 #include <functional>
4 #include <vector>
5 
6 namespace hb
7 {
8  namespace detail
9  {
10  template <typename Event>
12  {
13  public:
14  typedef std::function<void(const Event&)> Listener;
15  int listen(Listener&& listener)
16  {
17  if (m_disabled.size() != 0)
18  {
19  int i = m_disabled.back();
20  m_disabled.pop_back();
21  m_listeners[i] = std::move(listener);
22  m_is_active[i] = true;
23  return i;
24  }
25  else
26  {
27  m_listeners.push_back(std::move(listener));
28  m_is_active.push_back(true);
29  return m_listeners.size()-1;
30  }
31  }
32 
33  void message(const Event& event)
34  {
35  for (unsigned int i = 0; i < m_listeners.size(); ++i)
36  {
37  if (m_is_active[i])
38  m_listeners[i](event);
39  }
40  }
41 
42  void ignore(int id)
43  {
44  m_is_active[id] = false;
45  m_disabled.push_back(id);
46  }
47 
48  private:
49  std::vector<Listener> m_listeners;
50  std::vector<int> m_disabled;
51  std::vector<bool> m_is_active;
52  };
53 
54  template <typename T>
55  struct traits : public traits<decltype(&T::operator())> {};
56 
57  template <typename C, typename R, typename A>
58  struct traits<R(C::*)(const A&) const>
59  {
60  typedef A type;
61  };
62  }
63 
64  template <typename... Events>
66  {
67  public:
68  template <typename Event>
69  struct ListenerId
70  {
71  typedef Event type;
72  int id;
73  };
74 
75  template <typename Listener>
76  ListenerId<typename detail::traits<Listener>::type> listen(Listener&& listener)
77  {
78  typedef typename detail::traits<Listener>::type Event;
79  detail::EventManager<Event>& em = *this;
81  ret.id = em.listen(std::move(listener));
82  return ret;
83  }
84 
85  template <typename Event>
86  void message(const Event& event)
87  {
88  detail::EventManager<Event>& em = *this;
89  em.message(event);
90  }
91 
92  template <typename Event>
93  void ignore(const ListenerId<Event>& id)
94  {
95  detail::EventManager<Event>& em = *this;
96  em.ignore(id.id);
97  }
98  };
99 }
100 #endif
Definition: EventManager.h:11
Definition: EventManager.h:55
Definition: EventManager.h:65
Definition: Box2DPlugin.h:6
Definition: EventManager.h:69