All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
IEvent.h
1 #pragma once
2 
3 #include "ICallback.h"
4 #include "Types.h"
5 
6 #include <vector>
7 #include <algorithm>
8 
9 namespace Eegeo
10 {
11  namespace Helpers
12  {
13  template <typename TCallbackType>
14  class IEventBase
15  {
16  public:
17  typedef TCallbackType CallbackType;
18 
19  virtual void Register(CallbackType& callback) = 0;
20 
21  virtual void Unregister(CallbackType& callback) = 0;
22  };
23 
24  class IEvent0 : public IEventBase< Helpers::ICallback0 >
25  {
26  public:
28 
29  virtual ~IEvent0() {}
30 
31  virtual void Raise() const = 0;
32  };
33 
34  template <typename TParam0>
35  class IEvent1 : public IEventBase< Helpers::ICallback1<TParam0> >
36  {
37  public:
38  typedef TParam0 Param0;
40 
41  virtual ~IEvent1() {}
42 
43  virtual void Raise(Param0& param0) const = 0;
44  };
45 
46 
47 
48  template <typename TEventInterface>
49  class TEventBase : public TEventInterface, private Eegeo::NonCopyable
50  {
51  public:
52  typedef typename TEventInterface::CallbackType CallbackType;
53  typedef std::vector<CallbackType*> CallbackVector;
54 
55  void Register(CallbackType& callback)
56  {
57  m_callbacks.push_back(&callback);
58  }
59 
60  void Unregister(CallbackType& callback)
61  {
62  m_callbacks.erase(std::remove(m_callbacks.begin(), m_callbacks.end(), &callback), m_callbacks.end());
63  }
64 
65  protected:
66  TEventBase() {}
67 
68  CallbackVector m_callbacks;
69  };
70 
71  template <typename TInterface>
72  class TEvent0 : public TEventBase< TInterface >
73  {
74  public:
75  typedef TInterface InterfaceType;
77 
78  void Raise() const
79  {
80  for (auto callback : this->m_callbacks)
81  {
82  (*callback)();
83  }
84  }
85  };
86 
87  template <typename TInterface>
88  class TEvent1 : public TEventBase<TInterface>
89  {
90  public:
91  typedef TInterface InterfaceType;
93 
94  void Raise(typename TInterface::Param0& param0) const
95  {
96  for (auto callback : this->m_callbacks)
97  {
98  (*callback)(param0);
99  }
100  }
101  };
102 
103 
104 
105  template <typename TInterface>
106  class TSingleObserverEventBase : public TInterface, private Eegeo::NonCopyable
107  {
108  public:
109  typedef typename TInterface::CallbackType CallbackType;
110  typedef TInterface InterfaceType;
111 
113  : m_callback(nullptr)
114  {}
115 
116  void Register(CallbackType& callback)
117  {
118  Eegeo_ASSERT(m_callback == nullptr);
119  m_callback = &callback;
120  }
121 
122  void Unregister(CallbackType& callback)
123  {
124  Eegeo_ASSERT(m_callback == &callback);
125  m_callback = nullptr;
126  }
127 
128  protected:
129 
130  CallbackType* m_callback;
131  };
132 
133  template <typename TInterface>
135  {
136  public:
137  typedef TInterface InterfaceType;
138 
139  void Raise() const
140  {
141  if (this->m_callback != nullptr)
142  {
143  (*this->m_callback)();
144  }
145  }
146  };
147 
148  template <typename TInterface>
150  {
151  public:
152  typedef TInterface InterfaceType;
153 
154  void Raise(typename TInterface::Param0& param0) const
155  {
156  if (this->m_callback != nullptr)
157  {
158  (*this->m_callback)(param0);
159  }
160  }
161  };
162 
163  }
164 }