gatelib  2.1
g_signal_signal_receiver.h
1 #pragma once
2 
3 #include "g_signal_subscribers.h"
4 
5 namespace g
6 {
7 namespace signal
8 {
10 template < class E > class signal_receiver
11 {
12 public:
13  typedef E Event_t;
14  typedef typename E::Subscriber Subscriber_t;
15  typedef typename E::SubscriberRef_t SubscriberRef_t;
16  typedef typename E::ListSubscriber_t ListSubscriber_t;
17  typedef typename E::FunctionSubscriber FunctionSubscriber_t;
18  typedef typename E::FunctionPointer_t FunctionPointer_t;
19 
20  void subscribe ( SubscriberRef_t aSubscriberRef )
21  {
22  mListSubscribers.pushTail ( aSubscriberRef );
23  }
24 
25  SubscriberRef_t subscribe ( typename E::FunctionPointer_t aFunctionPointer )
26  {
27  SubscriberRef_t event_ref = FunctionSubscriber_t::create ( aFunctionPointer );
28  subscribe ( event_ref );
29 
30  return event_ref;
31  }
32 
33  template < class T > SubscriberRef_t subscribe ( T* aClsInstance , typename E::template class_method<T>::Pointer_t aMethodPointer )
34  {
35  SubscriberRef_t event_ref = E::template method_subscriber<T>::create( aMethodPointer , aClsInstance );
36  subscribe ( event_ref );
37 
38  return event_ref;
39  }
40 
41  void unsubscribe ( SubscriberRef_t aSubscriberRef )
42  {
43  mListSubscribers.removeAll ( aSubscriberRef );
44  }
45 
46  void unsubscribe ( typename Event_t::FunctionPointer_t aFunctionPointer )
47  {
48  ListSubscriber_t to_remove_list;
49 
50  for ( typename ListSubscriber_t::It_t it = mListSubscribers.getIterator ( ) ; it.isIn ( ) ; it++ )
51  {
53 
54  //if
55  if ( subscriber_ref.tryRefTakeDynamically((SubscriberRef_t)it) )
56  {
57  if ( subscriber_ref->functionPointer == aFunctionPointer )
58  {
59  to_remove_list.pushTail ( it );
60  }
61  }
62  }
63 
64  for ( typename ListSubscriber_t::It_t it = to_remove_list.getIterator ( ) ; it.isIn ( ) ; it++ )
65  {
66  mListSubscribers.tryRemove ( it );
67  }
68  }
69 
70  void doClearSubscribers() { mListSubscribers.setEmpty(); }
71 
72  template < class T > void unsubscribe ( T* aInstanceP , typename E::template class_method<T>::Pointer_t aClassMethodPointer )
73  {
74  ListSubscriber_t to_remove_list;
75 
76  for ( typename ListSubscriber_t::It_t it = mListSubscribers.getIterator ( ) ; it.isIn ( ) ; it++ )
77  {
79 
80  //if
81  if ( subscriber_ref.tryRefTakeDynamically((SubscriberRef_t)it) )
82  {
83  if ( subscriber_ref->clsInstanceP == aInstanceP && subscriber_ref->methodPointer == aClassMethodPointer )
84  {
85  to_remove_list.pushTail ( it );
86  }
87  }
88  }
89 
90  for ( typename ListSubscriber_t::It_t it = to_remove_list.getIterator ( ) ; it.isIn ( ) ; it++ )
91  {
92  mListSubscribers.tryRemove ( it );
93  }
94  }
95 
96 protected:
97  ListSubscriber_t mListSubscribers;
98 };
99 
100 //class able to receive events as own methods
101 template <class E,class T> class class_with_event_receiver :
102  //is included as virtual, in case of subclassing i.e.:
103  //class MyClassWithEvent : public class_with_event_receiver<MyEvent,MyClassWithEvent>{}
104  //class MyClassWithEventChild : public MyClassWithEvent,publicclass_with_event_receiver<MyEvent,MyClassWithEventChild>{}
105  protected virtual signal_receiver<E>
106 {
107 public:
108  typedef typename E::template class_method<T>::Pointer_t MethodPointer_t;
109  typedef typename E::SubscriberRef_t SubscriberRef_t;
110 
111  void subscribe ( MethodPointer_t aThisClassMethodPointer )
112  {
113  signal_receiver<E>::subscribe ( static_cast<T*>(this) , (MethodPointer_t)aThisClassMethodPointer );
114  }
115 
116  void unsubscribe ( MethodPointer_t aThisClassMethodPointer )
117  {
118  signal_receiver<E>::unsubscribe ( static_cast<T*>(this) , aThisClassMethodPointer );
119  }
120 
121  void subscribe ( SubscriberRef_t aSubscriberRef ) { signal_receiver<E>::subscribe(aSubscriberRef); }
122  void unsubscribe ( SubscriberRef_t aSubscriberRef ) { signal_receiver<E>::unsubscribe(aSubscriberRef); }
123 };
124 
125 
126 //both a sender and a receiver ( simple)
127 template <class E,class T> struct class_with_event_sender_receiver : class_with_event_receiver<E,T> , public E::SenderReceiver{};
128 
129 }//namespace signal
130 }//namespace g
131 
132 
Class capable of receiving events.
Definition: g_signal_signal_receiver.h:10
Definition: g.mthread.ThreadSimpleEvent.h:5
Definition: g_cont_it_ref.h:10
Definition: g_signal_signal_receiver.h:127
Definition: g_signal_signal_receiver.h:101