00001
00002
00003 #ifndef __LISTENER__args_event_listener_h__
00004 #define __LISTENER__args_event_listener_h__
00005
00006 #include "common.h"
00007 #include "event.h"
00008 #include "listener.h"
00009 #include "utils/functions.h"
00010
00025 namespace listener {
00026 template <typename E >
00027 class GenArgListener: public ListenerForEvent<E > {
00028 public:
00029 typedef typename E::function_type function_type ;
00030 GenArgListener(Publisher* p, const function_type& f) ;
00031 protected:
00032 inline bool process_event(E* e) ;
00033 private:
00034 function_type f_ ;
00035 } ;
00036 }
00037
00038 #define CREATE_EVENT_LISTENER(EXP,NAME) \
00039 class EXP NAME##Listener: public listener::GenArgListener< NAME##Event > { \
00040 public: \
00041 NAME##Listener(listener::Publisher* p, const function_type& f): \
00042 listener::GenArgListener< NAME##Event >(p,f) {} \
00043 } ;
00044
00045
00046
00047
00048
00049
00050 namespace listener {
00051 class IGSLISTENER NoArgEvent: public Event {
00052 public:
00053 typedef basic::function0<void> function_type ;
00054 NoArgEvent() ;
00055 virtual ~NoArgEvent() ;
00056 bool process(const function_type&) ;
00057 } ;
00058 }
00064 #define CREATE_0_ARG_EVENT_LISTENER(EXP,NAME) \
00065 class EXP NAME##Event: public listener::NoArgEvent { \
00066 public: \
00067 NAME##Event(): listener::NoArgEvent() {} \
00068 } ; \
00069 CREATE_EVENT_LISTENER(EXP,NAME)
00070
00071
00072
00073
00074 namespace listener {
00075 template <typename T1>
00076 class OneArgEvent: public Event {
00077 public:
00078 typedef basic::function1<void, T1> function_type ;
00079 OneArgEvent(T1) ;
00080 virtual ~OneArgEvent() ;
00081 T1 arg1() const ;
00082 bool process(const function_type& f) ;
00083 private:
00084 T1 arg1_ ;
00085 } ;
00086 }
00093 #define CREATE_1_ARG_EVENT_LISTENER(EXP,NAME,T1) \
00094 class EXP NAME##Event: public listener::OneArgEvent<T1 > { \
00095 public: \
00096 NAME##Event(T1 t1): listener::OneArgEvent<T1 >(t1) {} \
00097 } ; \
00098 CREATE_EVENT_LISTENER(EXP,NAME)
00099
00100
00101
00102
00103 namespace listener {
00104 template <typename T1, typename T2>
00105 class TwoArgsEvent: public OneArgEvent< T1 > {
00106 public:
00107 typedef basic::function2<void,T1,T2 > function_type ;
00108 TwoArgsEvent(T1, T2) ;
00109 virtual ~TwoArgsEvent() ;
00110 T2 arg2() const ;
00111 bool process(const function_type& f) ;
00112 private:
00113 T2 arg2_ ;
00114 } ;
00115 }
00123 #define CREATE_2_ARGS_EVENT_LISTENER(EXP,NAME,T1,T2) \
00124 class EXP NAME##Event: public listener::TwoArgsEvent<T1,T2 > { \
00125 public: \
00126 NAME##Event(T1 t1,T2 t2): listener::TwoArgsEvent<T1,T2 >(t1,t2) {} \
00127 } ; \
00128 CREATE_EVENT_LISTENER(EXP,NAME)
00129
00130
00131
00132
00133 namespace listener {
00134 template <typename T1, typename T2, typename T3>
00135 class ThreeArgsEvent: public TwoArgsEvent<T1,T2 > {
00136 public:
00137 typedef basic::function3<void,T1,T2,T3 > function_type ;
00138 ThreeArgsEvent(T1, T2, T3) ;
00139 virtual ~ThreeArgsEvent() ;
00140 T3 arg3() const ;
00141 bool process(const function_type& f) ;
00142 private:
00143 T3 arg3_ ;
00144 } ;
00145 }
00154 #define CREATE_3_ARGS_EVENT_LISTENER(EXP,NAME,T1,T2,T3) \
00155 class EXP NAME##Event: public listener::ThreeArgsEvent<T1,T2,T3 > { \
00156 public: \
00157 NAME##Event(T1 t1,T2 t2,T3 t3): \
00158 listener::ThreeArgsEvent<T1,T2,T3 >(t1,t2,t3) {} \
00159 } ; \
00160 CREATE_EVENT_LISTENER(EXP,NAME)
00161
00162
00163
00164
00165 namespace listener {
00166 template <typename T1, typename T2, typename T3, typename T4>
00167 class FourArgsEvent: public ThreeArgsEvent<T1,T2,T3 > {
00168 public:
00169 typedef basic::function4<void,T1,T2,T3,T4 > function_type ;
00170 FourArgsEvent(T1, T2, T3, T4) ;
00171 virtual ~FourArgsEvent() ;
00172 T4 arg4() const ;
00173 bool process(const function_type& f) ;
00174 private:
00175 T4 arg4_ ;
00176 } ;
00177 }
00187 #define CREATE_4_ARGS_EVENT_LISTENER(EXP,NAME,T1,T2,T3,T4) \
00188 class EXP NAME##Event: public listener::FourArgsEvent<T1,T2,T3,T4 > { \
00189 public: \
00190 NAME##Event(T1 t1,T2 t2,T3 t3,T4 t4): \
00191 listener::FourArgsEvent<T1,T2,T3,T4 >(t1,t2,t3,t4) {} \
00192 } ; \
00193 CREATE_EVENT_LISTENER(EXP,NAME)
00194
00195
00196
00197
00198 namespace listener {
00199 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00200 class FiveArgsEvent: public FourArgsEvent<T1,T2,T3,T4 > {
00201 public:
00202 typedef basic::function5<void,T1,T2,T3,T4,T5 > function_type ;
00203 FiveArgsEvent(T1, T2, T3, T4, T5) ;
00204 virtual ~FiveArgsEvent() ;
00205 T5 arg5() const ;
00206 bool process(const function_type& f) ;
00207 private:
00208 T5 arg5_ ;
00209 } ;
00210 }
00221 #define CREATE_5_ARGS_EVENT_LISTENER(EXP,NAME,T1,T2,T3,T4,T5) \
00222 class EXP NAME##Event: public listener::FiveArgsEvent<T1,T2,T3,T4,T5 > { \
00223 public: \
00224 NAME##Event(T1 t1,T2 t2,T3 t3,T4 t4, T5 t5): \
00225 listener::FiveArgsEvent<T1,T2,T3,T4,T5 >(t1,t2,t3,t4,t5) {} \
00226 } ; \
00227 CREATE_EVENT_LISTENER(EXP,NAME)
00228
00229
00230
00231
00232 #include "inline_src/args_event_listener.hxx"
00233 #endif