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