raSystem  1.0 bata
raEvent.h
Go to the documentation of this file.
1  template<class TSender, typename TYPE>
2  class raEvent
3  {
4  public:
5  raEvent() { }
6  ~raEvent();
7 
8  void Call( const TSender* pSender, IRADelegateParam<TYPE>* pParameter);
9 
10  void operator += ( const IRADelegate<TSender, TYPE>* pHandler);
11  void operator -= ( const IRADelegate<TSender, TYPE>* pHandler);
12  void operator () ( const TSender* pSender, IRADelegateParam<TYPE>* pParameter);
13  private:
14  void Register( const IRADelegate<TSender, TYPE>* pHandler);
15  void Unregister( const IRADelegate<TSender, TYPE>* pHandler);
16  private:
17  std::list< IRADelegate<TSender, TYPE>* > m_observers;
18  };
19 
20  template<class TSender, typename TYPE>
22  {
23  Register(pHandler);
24  }
25 
26  template<class TSender, typename TYPE>
28  {
29  Unregister(pHandler);
30  }
31 
32  template<class TSender, typename TYPE>
33  void raEvent<TSender, TYPE>::operator ()(const TSender* pSender, IRADelegateParam<TYPE>* pParameter)
34  {
35  Call(pSender, pParameter);
36  }
37 
38  template<class TSender, typename TYPE>
40  {
41  assert(pHandler != NULL);
42 
43  for(std::list< IRADelegate<TSender, TYPE>* >::iterator itr = m_observers.begin();
44  itr != m_observers.end();
45  itr++)
46  {
47  if((*itr)->Equals(pHandler))
48  return;
49  }
50 
51  m_observers.push_back(const_cast<IRADelegate<TSender, TYPE>*>(pHandler));
52  }
53 
54  template<class TSender, typename TYPE>
56  {
57  assert(pHandler != NULL);
58 
59  std::vector< IRADelegate<TSender, TYPE>* >::iterator where;
60  for(list< IRADelegate<TSender, TYPE>* >::iterator itr = m_observers.begin();
61  itr != m_observers.end();
62  itr++)
63  {
64  if((*itr)->Equals(pHandler))
65  {
66  where = itr;
67  break;
68  }
69  }
70 
71  m_observers.erase(where);
72  }
73 
74  template<class TSender, typename TYPE>
75  void raEvent<TSender, TYPE>::Call(const TSender* pSender, IRADelegateParam<TYPE>* pParameter)
76  {
77  for(std::list< IRADelegate<TSender, TYPE>* >::iterator itr = m_observers.begin();
78  itr != m_observers.end();
79  itr++)
80  {
81  (*itr)->Call(pSender, pParameter);
82  }
83  }
84 
85  template<class TSender, typename TYPE>
87  {
88  for(std::list< IRADelegate<TSender, TYPE>* >::iterator itr = m_observers.begin();
89  itr != m_observers.end();
90  itr++)
91  {
92  assert(*itr != NULL);
93  delete (*itr);
94  }
95  }
void operator-=(const IRADelegate< TSender, TYPE > *pHandler)
Definition: raEvent.h:27
void operator+=(const IRADelegate< TSender, TYPE > *pHandler)
Definition: raEvent.h:21
void operator()(const TSender *pSender, IRADelegateParam< TYPE > *pParameter)
Definition: raEvent.h:33
void Call(const TSender *pSender, IRADelegateParam< TYPE > *pParameter)
Definition: raEvent.h:75
~raEvent()
Definition: raEvent.h:86
Definition: raEvent.h:2
raEvent()
Definition: raEvent.h:5