00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _ucall_hpp_
00026 #define _ucall_hpp_
00027
00028 #include <ubit/ucond.hpp>
00029
00133 class UGenCallImpl: public UBrick {
00134 virtual void addingTo(class ULink *selflink, UGroup *parent);
00135 virtual void removingFrom(class ULink *selflink, UGroup *parent);
00136
00137 public:
00138 UGenCallImpl() {}
00139 virtual ~UGenCallImpl() {destructs();}
00140 };
00141
00142 template <class EE>
00143 class UGenCall: public UGenCallImpl {
00144 public:
00145 virtual void call(EE&) = 0;
00146 };
00147
00148 typedef UGenCall<class UEvent> UCall;
00149 typedef UGenCall<class UBrick> UListCall;
00150
00151
00152
00153
00154 template <class CC, class VAL, class EE>
00155 class UCall_show : public UGenCall<EE>{
00156 CC obj;
00157 VAL val;
00158 public:
00159 UCall_show(CC _obj, VAL _val) : UCall(), obj(_obj), val(_val) {}
00160 void call(EE&) {obj->show(val);}
00161 };
00162
00163
00164
00165
00166
00167 template <class CC, class VAL>
00168 UCall& ushow(CC* obj, VAL val)
00169 {return *(new UCall_show<CC*,VAL,UEvent>(obj, val));}
00170
00171 template <class CC, class VAL>
00172 UCall& ushowref(CC* obj, VAL& val)
00173 {return *(new UCall_show<CC*,VAL&,UEvent>(obj, val));}
00174
00175
00176
00177 template <class CC, class VAL, class EE>
00178 class UCall_set : public UGenCall<EE>{
00179 CC obj;
00180 VAL val;
00181 public:
00182 UCall_set(CC _obj, VAL _val) : UCall(), obj(_obj), val(_val) {}
00183 void call(EE&) {obj->set(val);}
00184 };
00185
00186
00187
00188
00189
00190 template <class CC, class VAL>
00191 UCall& uset(CC* obj, VAL val)
00192 {return *(new UCall_set<CC*,VAL,UEvent>(obj, val));}
00193
00194 template <class CC, class VAL>
00195 UCall& usetref(CC* obj, VAL& val)
00196 {return *(new UCall_set<CC*,VAL&,UEvent>(obj, val));}
00197
00198
00199
00200 template <class CC, class VAL, class EE>
00201 class UCall_assign : public UGenCall<EE>{
00202 CC obj;
00203 VAL val;
00204 public:
00205 UCall_assign(CC _obj, VAL _val) : UCall(), obj(_obj), val(_val) {}
00206 void call(EE&) {*obj = val;}
00207 };
00208
00209
00210
00211
00212 template <class CC, class VAL>
00213 UCall& uassign(CC* obj, VAL val)
00214 {return *(new UCall_assign<CC*,VAL,UEvent>(obj, val));}
00215
00216 template <class CC, class VAL>
00217 UCall& uassignref(CC* obj, VAL& val)
00218 {return *(new UCall_assign<CC*,VAL&,UEvent>(obj, val));}
00219
00220
00221
00222
00223
00224 template <class CC, class RR, class MM, class EE>
00225 class UCall_M_0a : public UGenCall<EE>{
00226 CC obj;
00227 RR (MM::*member)();
00228 public:
00229 UCall_M_0a(CC _obj, RR(MM::*mm)()) : obj(_obj), member(mm) {}
00230 void call(EE&) {(obj->*member)();}
00231 };
00232
00233
00234
00235 template <class CC, class RR, class MM, class EE>
00236 class UCall_M_e0a : public UGenCall<EE> {
00237 CC obj;
00238 RR (MM::*member)(EE&);
00239 public:
00240 UCall_M_e0a(CC _obj, RR(MM::*mm)(EE&)) : obj(_obj), member(mm) {}
00241 void call(EE& e) {(obj->*member)(e);}
00242 };
00243
00244
00245
00246 template <class CC, class RR, class MM>
00247 UCall& ucall(CC* obj, RR(MM::*mm)())
00248 {return *(new UCall_M_0a<CC*,RR,MM,UEvent>(obj, mm));}
00249
00250 template <class CC, class RR, class MM>
00251 UCall& ucall(CC* obj, RR(MM::*mm)(UEvent&))
00252 {return *(new UCall_M_e0a<CC*,RR,MM,UEvent>(obj, mm));}
00253
00254 template <class CC, class RR, class MM>
00255 UListCall& ucall(CC* obj, RR(MM::*mm)(UBrick&))
00256 {return *(new UCall_M_e0a<CC*,RR,MM,UBrick>(obj, mm));}
00257
00258
00259
00260
00261
00262
00263 template <class CC, class A1, class RR, class MM, class EE>
00264 class UCall_M_1a : public UGenCall<EE> {
00265 CC obj;
00266 RR (MM::*member)(A1);
00267 A1 a1;
00268 public:
00269 UCall_M_1a(CC _obj, RR(MM::*mm)(A1), A1 _a1) : obj(_obj), member(mm), a1(_a1) {}
00270 void call(EE&) {(obj->*member)(a1);}
00271 };
00272
00273
00274
00275 template <class CC, class A1, class RR, class MM, class EE>
00276 class UCall_M_e1a : public UGenCall<EE> {
00277 CC obj;
00278 RR (MM::*member)(EE&, A1);
00279 A1 a1;
00280 public:
00281 UCall_M_e1a(CC _obj, RR(MM::*mm)(EE&,A1), A1 _a1) : obj(_obj), member(mm), a1(_a1) {}
00282 void call(EE& e) {(obj->*member)(e, a1);}
00283 };
00284
00285
00286
00287
00288
00289
00290 template <class CC, class A1, class RR, class MM>
00291 UCall& ucall(CC* obj, A1 a1, RR(MM::*mm)(A1))
00292 {return *(new UCall_M_1a<CC*,A1,RR,MM,UEvent>(obj, mm, a1));}
00293
00294 template <class CC, class A1, class RR, class MM>
00295 UCall& ucall(CC* obj, A1 a1, RR(MM::*mm)(UEvent&, A1))
00296 {return *(new UCall_M_e1a<CC*,A1,RR,MM,UEvent>(obj, mm, a1));}
00297
00298 template <class CC, class A1, class RR, class MM>
00299 UListCall& ucall(CC* obj, A1 a1, RR(MM::*mm)(UBrick&, A1))
00300 {return *(new UCall_M_e1a<CC*,A1,RR,MM,UBrick>(obj, mm, a1));}
00301
00302
00303
00304
00305 template <class CC, class A1, class RR, class MM>
00306 UCall& ucallref(CC* obj, A1& a1, RR(MM::*mm)(A1&))
00307 {return *(new UCall_M_1a<CC*,A1&,RR,MM,UEvent>(obj, mm, a1));}
00308
00309 template <class CC, class A1, class RR, class MM>
00310 UCall& ucallref(CC* obj, A1& a1, RR(MM::*mm)(UEvent&, A1&))
00311 {return *(new UCall_M_e1a<CC*,A1&,RR,MM,UEvent>(obj, mm, a1));}
00312
00313 template <class CC, class A1, class RR, class MM>
00314 UListCall& ucallref(CC* obj, A1& a1, RR(MM::*mm)(UBrick&, A1&))
00315 {return *(new UCall_M_e1a<CC*,A1&,RR,MM,UBrick>(obj, mm, a1));}
00316
00317
00318
00319
00320 template <class CC, class A1, class RR, class MM>
00321 UCall& ucallref(CC* obj, const A1& a1, RR(MM::*mm)(const A1&))
00322 {return *(new UCall_M_1a<CC*,const A1&,RR,MM,UEvent>(obj, mm, a1));}
00323
00324 template <class CC, class A1, class RR, class MM>
00325 UCall& ucallref(CC* obj, const A1& a1, RR(MM::*mm)(UEvent&, const A1&))
00326 {return *(new UCall_M_e1a<CC*,const A1&,RR,MM,UEvent>(obj, mm, a1));}
00327
00328 template <class CC, class A1, class RR, class MM>
00329 UListCall& ucallref(CC* obj, const A1& a1, RR(MM::*mm)(UBrick&, const A1&))
00330 {return *(new UCall_M_e1a<CC*,const A1&,RR,MM,UBrick>(obj, mm, a1));}
00331
00332
00333
00334
00335
00336
00337 template <class CC, class A1, class A2, class RR, class MM, class EE>
00338 class UCall_M_2a : public UGenCall<EE> {
00339 CC obj;
00340 RR (MM::*member)(A1, A2);
00341 A1 a1; A2 a2;
00342 public:
00343 UCall_M_2a(CC _obj, RR(MM::*mm)(A1,A2), A1 _a1, A2 _a2)
00344 : obj(_obj), member(mm), a1(_a1), a2(_a2) {}
00345 void call(EE&) {(obj->*member)(a1, a2);}
00346 };
00347
00348
00349
00350 template <class CC, class A1, class A2, class RR, class MM, class EE>
00351 class UCall_M_e2a : public UGenCall<EE> {
00352 CC obj;
00353 RR (MM::*member)(EE&, A1, A2);
00354 A1 a1; A2 a2;
00355 public:
00356 UCall_M_e2a(CC _obj, RR(MM::*mm)(EE&,A1,A2), A1 _a1, A2 _a2)
00357 : obj(_obj), member(mm), a1(_a1), a2(_a2) {}
00358 void call(EE& e) {(obj->*member)(e, a1, a2);}
00359 };
00360
00361
00362
00363
00364 template <class CC, class A1, class A2, class RR, class MM>
00365 UCall& ucall(CC* obj, A1 a1, A2 a2, RR(MM::*mm)(A1,A2))
00366 {return *(new UCall_M_2a<CC*,A1,A2,RR,MM,UEvent>(obj, mm, a1, a2));}
00367
00368 template <class CC, class A1, class A2, class RR, class MM>
00369 UCall& ucall(CC* obj, A1 a1, A2 a2, RR(MM::*mm)(UEvent&,A1,A2))
00370 {return *(new UCall_M_e2a<CC*,A1,A2,RR,MM,UEvent>(obj, mm, a1, a2));}
00371
00372 template <class CC, class A1, class A2, class RR, class MM>
00373 UListCall& ucall(CC* obj, A1 a1, A2 a2, RR(MM::*mm)(UBrick&,A1,A2))
00374 {return *(new UCall_M_e2a<CC*,A1,A2,RR,MM,UBrick>(obj, mm, a1, a2));}
00375
00376
00377
00378
00379 template <class CC, class A1, class A2, class RR, class MM>
00380 UCall& ucallref(CC* obj, A1& a1, A2& a2, RR(MM::*mm)(A1&,A2&))
00381 {return *(new UCall_M_2a<CC*,A1&,A2&,RR,MM,UEvent>(obj, mm, a1, a2));}
00382
00383 template <class CC, class A1, class A2, class RR, class MM>
00384 UCall& ucallref(CC* obj, A1& a1, A2& a2, RR(MM::*mm)(UEvent&,A1&,A2&))
00385 {return *(new UCall_M_e2a<CC*,A1&,A2&,RR,MM,UEvent>(obj, mm, a1, a2));}
00386
00387 template <class CC, class A1, class A2, class RR, class MM>
00388 UListCall& ucallref(CC* obj, A1& a1, A2& a2, RR(MM::*mm)(UBrick&,A1&,A2&))
00389 {return *(new UCall_M_e2a<CC*,A1&,A2&,RR,MM,UBrick>(obj, mm, a1, a2));}
00390
00391
00392
00393
00394
00395
00396 template <class A1, class RR, class EE>
00397 class UCall_F_1a : public UGenCall<EE> {
00398 RR (*fun)(A1);
00399 A1 a1;
00400 public:
00401 UCall_F_1a( RR(*f)(A1), A1 _a1) : fun(f), a1(_a1) {}
00402 void call(EE&) {(*fun)(a1);}
00403 };
00404
00405
00406
00407 template <class A1, class RR, class EE>
00408 class UCall_F_e1a : public UGenCall<EE> {
00409 RR (*fun)(EE&, A1);
00410 A1 a1;
00411 public:
00412 UCall_F_e1a( RR(*f)(EE&,A1), A1 _a1) : fun(f), a1(_a1) {}
00413 void call(EE& e) {(*fun)(e, a1);}
00414 };
00415
00416
00417
00418
00419 template <class A1, class RR>
00420 UCall& ucall(A1 a1, RR(*f)(A1))
00421 {return *(new UCall_F_1a<A1,RR,UEvent>(f, a1));}
00422
00423 template <class A1, class RR>
00424 UCall& ucall(A1 a1, RR(*f)(UEvent&,A1))
00425 {return *(new UCall_F_e1a<A1,RR,UEvent>(f, a1));}
00426
00427 template <class A1, class RR>
00428 UListCall& ucall(A1 a1, RR(*f)(UBrick&,A1))
00429 {return *(new UCall_F_e1a<A1,RR,UBrick>(f, a1));}
00430
00431
00432
00433
00434 template <class A1, class RR>
00435 UCall& ucallref(A1& a1, RR(*f)(A1&))
00436 {return *(new UCall_F_1a<A1&,RR,UEvent>(f, a1));}
00437
00438 template <class A1, class RR>
00439 UCall& ucallref(A1& a1, RR(*f)(UEvent&,A1&))
00440 {return *(new UCall_F_e1a<A1&,RR,UEvent>(f, a1));}
00441
00442 template <class A1, class RR>
00443 UListCall& ucallref(A1& a1, RR(*f)(UBrick&,A1&))
00444 {return *(new UCall_F_e1a<A1&,RR,UBrick>(f, a1));}
00445
00446
00447
00448
00449 template <class A1, class RR>
00450 UCall& ucallref(const A1& a1, RR(*f)(const A1&))
00451 {return *(new UCall_F_1a<const A1&,RR,UEvent> (f, a1));}
00452
00453 template <class A1, class RR>
00454 UCall& ucallref(const A1& a1, RR(*f)(UEvent&,const A1&))
00455 {return *(new UCall_F_e1a<const A1&,RR,UEvent> (f, a1));}
00456
00457
00458
00459
00460
00461
00462 template <class A1, class A2, class RR, class EE>
00463 class UCall_F_2a : public UGenCall<EE>{
00464 RR (*fun)(A1, A2);
00465 A1 a1; A2 a2;
00466 public:
00467 UCall_F_2a( RR(*f)(A1,A2), A1 _a1, A2 _a2) : fun(f), a1(_a1), a2(_a2) {}
00468 void call(EE&) {(*fun)(a1, a2);}
00469 };
00470
00471
00472
00473 template <class A1, class A2, class RR, class EE>
00474 class UCall_F_e2a : public UGenCall<EE>{
00475 RR (*fun)(EE&, A1, A2);
00476 A1 a1; A2 a2;
00477 public:
00478 UCall_F_e2a( RR(*f)(EE&,A1,A2), A1 _a1, A2 _a2) : fun(f), a1(_a1), a2(_a2) {}
00479 void call(EE& e) {(*fun)(e, a1, a2);}
00480 };
00481
00482
00483
00484
00485 template <class A1, class A2, class RR>
00486 UCall& ucall(A1 a1, A2 a2, RR(*f)(A1,A2))
00487 {return *(new UCall_F_2a<A1,A2,RR,UEvent>(f, a1, a2));}
00488
00489 template <class A1, class A2, class RR>
00490 UCall& ucall(A1 a1, A2 a2, RR(*f)(UEvent&,A1,A2))
00491 {return *(new UCall_F_e2a<A1,A2,RR,UEvent>(f, a1, a2));}
00492
00493 template <class A1, class A2, class RR>
00494 UListCall& ucall(A1 a1, A2 a2, RR(*f)(UBrick&,A1,A2))
00495 {return *(new UCall_F_e2a<A1,A2,RR,UBrick>(f, a1, a2));}
00496
00497
00498
00499
00500 template <class A1, class A2, class RR>
00501 UCall& ucallref(A1& a1, A2& a2, RR(*f)(A1&,A2&))
00502 {return *(new UCall_F_2a<A1&,A2&,RR,UEvent>(f, a1, a2));}
00503
00504 template <class A1, class A2, class RR>
00505 UCall& ucallref(A1& a1, A2& a2, RR(*f)(UEvent&,A1&,A2&))
00506 {return *(new UCall_F_e2a<A1&,A2&,RR,UEvent>(f, a1, a2));}
00507
00508 template <class A1, class A2, class RR>
00509 UListCall& ucallref(A1& a1, A2& a2, RR(*f)(UBrick&,A1&,A2&))
00510 {return *(new UCall_F_e2a<A1&,A2&,RR,UBrick>(f, a1, a2));}
00511
00512
00513
00514
00515 template <class A1, class A2, class RR>
00516 UCall& ucallref(const A1& a1, const A2& a2, RR(*f)(const A1&,const A2&))
00517 {return *(new UCall_F_2a<const A1&, const A2&,RR,UEvent>(f, a1, a2));}
00518
00519 template <class A1, class A2, class RR>
00520 UCall& ucallref(const A1& a1, const A2& a2, RR(*f)(UEvent&,const A1&,const A2&))
00521 {return *(new UCall_F_e2a<const A1&, const A2&,RR,UEvent>(f, a1, a2));}
00522
00523
00524 #endif
00525
00526