00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __GUTZ_SIGNAL_CALLS_DOT_H
00024 #define __GUTZ_SIGNAL_CALLS_DOT_H
00025
00026 #include <iostream>
00027 #include <vector>
00028
00029 namespace gutz {
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 class _NA {};
00040 typedef const _NA NA;
00041
00042
00043
00044
00045 class SignalIF;
00046
00047
00048
00049 #define G_SIG_TRACK _sigtrack_
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 class SignalTracker {
00068 public:
00069 typedef std::vector<SignalIF*> SignalPVec;
00070 typedef SignalPVec::iterator SignalPVecIter;
00071
00072 SignalTracker() {}
00073 SignalTracker(const SignalTracker &st) {}
00074 SignalTracker &operator=(const SignalTracker &st) {}
00075 ~SignalTracker();
00076
00077
00078 void detatchSignalIF(SignalIF *sig);
00079 void attachSignalIF(SignalIF *sig)
00080 { _sigs.push_back(sig); }
00081
00082 void *callee;
00083 protected:
00084 SignalPVec _sigs;
00085 };
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 #define HAS_SLOTS gutz::SignalTracker G_SIG_TRACK;
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 template<class A1,class A2,class A3,class A4,
00116 class A5,class A6,class A7,class A8>
00117 class _CallIF {
00118 public:
00119 typedef A1 Arg1;
00120
00121 virtual ~_CallIF() {}
00122 virtual void call(A1,A2,A3,A4,A5,A6,A7,A8) = 0;
00123 virtual void detatch(SignalIF *sig) = 0;
00124 virtual bool isCallee(void const *callee) const = 0;
00125 virtual bool isCall(_CallIF const *) const = 0;
00126 int _p;
00127 protected:
00128 _CallIF(int priority) : _p(priority) {}
00129
00130 };
00131
00132
00133
00134
00135
00136
00137
00138 template<class CE,class F,class A1,class A2,class A3,class A4,
00139 class A5,class A6,class A7,class A8>
00140 class _Call : public _CallIF<A1,A2,A3,A4,A5,A6,A7,A8> {
00141 public:
00142 typedef _CallIF<A1,A2,A3,A4,A5,A6,A7,A8> btype;
00143
00144 _Call(CE *callee, F fptr, int priority, SignalIF *sig)
00145 : btype(priority), _func(fptr), _callee(callee)
00146 {
00147
00148
00149
00150
00151
00152
00153
00154 callee->G_SIG_TRACK.attachSignalIF(sig);
00155
00156
00157
00158 callee->G_SIG_TRACK.callee = callee;
00159 }
00160
00161
00162
00163 _Call(CE *callee, F fptr)
00164 : btype(0), _func(fptr), _callee(callee)
00165 {}
00166 ~_Call() {}
00167
00168
00169
00170
00171
00172
00173 virtual void call(A1,A2,A3,A4,A5,A6,A7,A8) {};
00174
00175 void detatch(SignalIF *sig)
00176 {
00177 _callee->G_SIG_TRACK.detatchSignalIF(sig);
00178 }
00179 bool isCallee(void const *callee) const
00180 {
00181 return _callee == callee;
00182 }
00183 bool isCall(_CallIF<A1,A2,A3,A4,A5,A6,A7,A8> const *c) const
00184 {
00185 _Call const *tc = dynamic_cast<_Call<CE,F,A1,A2,A3,A4,A5,A6,A7,A8> const *>(c);
00186 if(!tc)
00187 return false;
00188 return (tc->_callee == _callee) && (tc->_func == _func);
00189 }
00190
00191
00192 CE *_callee;
00193 F _func;
00194 };
00195
00196
00197
00198
00199
00200
00201 template<class CE,class F,
00202 class A1,class A2,class A3,class A4,
00203 class A5,class A6,class A7,class A8>
00204 class Call : public _Call<CE,F,A1,A2,A3,A4,A5,A6,A7,A8>
00205 {
00206 public:
00207 typedef _Call<CE,F,A1,A2,A3,A4,A5,A6,A7,A8> btype;
00208 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00209 : btype(callee,fptr,priority,sig)
00210 {}
00211
00212 void call(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)
00213 {
00214 (_callee->*_func)(a1,a2,a3,a4,a5,a6,a7,a8);
00215 }
00216 };
00217
00218
00219
00220 template<class CE, class F>
00221 class Call<CE,F,NA,NA,NA,NA,NA,NA,NA,NA>
00222 : public _Call<CE,F,NA,NA,NA,NA,NA,NA,NA,NA>
00223 {
00224 public:
00225 typedef _Call<CE,F,NA,NA,NA,NA,NA,NA,NA,NA> btype;
00226 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00227 : btype(callee,fptr,priority,sig)
00228 {}
00229
00230 void call(NA,NA,NA,NA,NA,NA,NA,NA)
00231 {
00232 (_callee->*_func)();
00233 }
00234 };
00235
00236
00237
00238 template<class CE,class F,class A1>
00239 class Call<CE,F,A1,NA,NA,NA,NA,NA,NA,NA>
00240 : public _Call<CE,F,A1,NA,NA,NA,NA,NA,NA,NA>
00241 {
00242 public:
00243 typedef _Call<CE,F,A1,NA,NA,NA,NA,NA,NA,NA> btype;
00244 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00245 : btype(callee,fptr,priority,sig)
00246 {}
00247
00248 void call(A1 a1,NA,NA,NA,NA,NA,NA,NA)
00249 {
00250 (_callee->*_func)(a1);
00251 }
00252 };
00253
00254
00255
00256 template<class CE,class F,class A1,class A2>
00257 class Call<CE,F,A1,A2,NA,NA,NA,NA,NA,NA>
00258 : public _Call<CE,F,A1,A2,NA,NA,NA,NA,NA,NA>
00259 {
00260 public:
00261 typedef _Call<CE,F,A1,A2,NA,NA,NA,NA,NA,NA> btype;
00262 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00263 : btype(callee,fptr,priority,sig)
00264 {}
00265
00266 void call(A1 a1,A2 a2,NA,NA,NA,NA,NA,NA)
00267 {
00268 (_callee->*_func)(a1,a2);
00269 }
00270 };
00271
00272
00273
00274 template<class CE,class F,class A1,class A2,class A3>
00275 class Call<CE,F,A1,A2,A3,NA,NA,NA,NA,NA>
00276 : public _Call<CE,F,A1,A2,A3,NA,NA,NA,NA,NA>
00277 {
00278 public:
00279 typedef _Call<CE,F,A1,A2,A3,NA,NA,NA,NA,NA> btype;
00280 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00281 : btype(callee,fptr,priority,sig)
00282 {}
00283
00284 void call(A1 a1,A2 a2,A3 a3,NA,NA,NA,NA,NA)
00285 {
00286 (_callee->*_func)(a1,a2,a3);
00287 }
00288 };
00289
00290
00291
00292 template<class CE,class F,class A1,class A2,class A3,class A4>
00293 class Call<CE,F,A1,A2,A3,A4,NA,NA,NA,NA>
00294 : public _Call<CE,F,A1,A2,A3,A4,NA,NA,NA,NA>
00295 {
00296 public:
00297 typedef _Call<CE,F,A1,A2,A3,A4,NA,NA,NA,NA> btype;
00298 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00299 : btype(callee,fptr,priority,sig)
00300 {}
00301
00302 void call(A1 a1,A2 a2,A3 a3,A4 a4,NA,NA,NA,NA)
00303 {
00304 (_callee->*_func)(a1,a2,a3,a4);
00305 }
00306 };
00307
00308
00309
00310 template<class CE,class F,class A1,class A2,class A3,class A4,
00311 class A5>
00312 class Call<CE,F,A1,A2,A3,A4,A5,NA,NA,NA>
00313 : public _Call<CE,F,A1,A2,A3,A4,A5,NA,NA,NA>
00314 {
00315 public:
00316 typedef _Call<CE,F,A1,A2,A3,A4,A5,NA,NA,NA> btype;
00317 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00318 : btype(callee,fptr,priority,sig)
00319 {}
00320
00321 void call(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,NA,NA,NA)
00322 {
00323 (_callee->*_func)(a1,a2,a3,a4,a5);
00324 }
00325 };
00326
00327
00328
00329 template<class CE,class F,class A1,class A2,class A3,class A4,
00330 class A5,class A6>
00331 class Call<CE,F,A1,A2,A3,A4,A5,A6,NA,NA>
00332 : public _Call<CE,F,A1,A2,A3,A4,A5,A6,NA,NA>
00333 {
00334 public:
00335 typedef _Call<CE,F,A1,A2,A3,A4,A5,A6,NA,NA> btype;
00336 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00337 : btype(callee,fptr,priority,sig)
00338 {}
00339
00340 void call(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,NA,NA)
00341 {
00342 (_callee->*_func)(a1,a2,a3,a4,a5,a6);
00343 }
00344 };
00345
00346
00347
00348 template<class CE,class F,class A1,class A2,class A3,class A4,
00349 class A5,class A6,class A7>
00350 class Call<CE,F,A1,A2,A3,A4,A5,A6,A7,NA>
00351 : public _Call<CE,F,A1,A2,A3,A4,A5,A6,A7,NA>
00352 {
00353 public:
00354 typedef _Call<CE,F,A1,A2,A3,A4,A5,A6,A7,NA> btype;
00355 Call(CE *callee, F fptr, int priority, SignalIF *sig)
00356 : btype(callee,fptr,priority,sig)
00357 {}
00358
00359 void call(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,NA)
00360 {
00361 (_callee->*_func)(a1,a2,a3,a4,a5,a6,a7);
00362 }
00363 };
00364
00365
00366
00367 }
00368
00369 #endif
00370
00371