File indexing completed on 2026-08-06 09:38:22
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_HandlerGroup_H
0010 #define ThePEG_HandlerGroup_H
0011
0012
0013 #include "ThePEG/Config/ThePEG.h"
0014
0015
0016
0017 namespace ThePEG {
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 class HandlerGroupBase {
0045
0046 public:
0047
0048
0049 typedef pair<StepHdlPtr, HintPtr> StepWithHint;
0050
0051
0052 typedef vector<StepHdlPtr> StepVector;
0053
0054
0055 typedef vector<StepWithHint> StepHintVector;
0056
0057
0058 typedef deque<HintPtr> HintVector;
0059
0060 public:
0061
0062
0063
0064
0065 HandlerGroupBase();
0066
0067
0068
0069
0070 virtual ~HandlerGroupBase();
0071
0072
0073
0074
0075 bool empty() const { return isEmpty; }
0076
0077
0078
0079
0080
0081
0082 void init(const HandlerGroupBase & ext) {
0083 clear();
0084 refillDefaults(ext);
0085 }
0086
0087
0088
0089
0090 StepWithHint next();
0091
0092
0093
0094
0095
0096
0097
0098 void addPreHandler(tStepHdlPtr sh, tHintPtr hint,
0099 const HandlerGroupBase & ext);
0100
0101
0102
0103
0104
0105
0106
0107 void addPostHandler(tStepHdlPtr sh, tHintPtr hint,
0108 const HandlerGroupBase &);
0109
0110
0111
0112
0113
0114
0115 void addHint(tHintPtr hint, const HandlerGroupBase & ext);
0116
0117
0118
0119
0120 StepVector & preHandlers() { return theDefaultPreHandlers; }
0121
0122
0123
0124
0125 const StepVector & preHandlers() const { return theDefaultPreHandlers; }
0126
0127
0128
0129
0130 virtual tStepHdlPtr defaultHandler() const = 0;
0131
0132
0133
0134
0135 StepVector & postHandlers() { return theDefaultPostHandlers; }
0136
0137
0138
0139
0140 const StepVector & postHandlers() const { return theDefaultPostHandlers; }
0141
0142
0143
0144
0145 virtual tStepHdlPtr handler() const = 0;
0146
0147
0148
0149
0150 virtual void setHandler() = 0;
0151
0152
0153
0154
0155
0156 virtual bool setHandler(tStepHdlPtr, const HandlerGroupBase & ext) = 0;
0157
0158
0159
0160
0161
0162 virtual void refillDefaultHandler(tStepHdlPtr) = 0;
0163
0164
0165
0166
0167
0168 void refillDefaults(const HandlerGroupBase &);
0169
0170
0171
0172
0173 virtual void clear();
0174
0175
0176
0177
0178 virtual string handlerClass() const = 0;
0179
0180
0181
0182
0183 void interfaceSetPrehandler(StepHdlPtr p, int i);
0184
0185
0186
0187
0188 void interfaceInsertPrehandler(StepHdlPtr p, int i);
0189
0190
0191
0192
0193 void interfaceErasePrehandler(int i);
0194
0195
0196
0197
0198 vector<StepHdlPtr> interfaceGetPrehandlers() const;
0199
0200
0201
0202
0203 void interfaceSetPosthandler(StepHdlPtr p, int i);
0204
0205
0206
0207
0208 void interfaceInsertPosthandler(StepHdlPtr p, int i);
0209
0210
0211
0212
0213 void interfaceErasePosthandler(int i);
0214
0215
0216
0217
0218 vector<StepHdlPtr> interfaceGetPosthandlers() const;
0219
0220
0221
0222
0223 virtual void write(PersistentOStream &) const;
0224
0225
0226
0227
0228 virtual void read(PersistentIStream &);
0229
0230 protected:
0231
0232
0233
0234
0235 HandlerGroupBase(const HandlerGroupBase &);
0236
0237
0238
0239
0240 bool isEmpty;
0241
0242 private:
0243
0244
0245
0246
0247
0248 void checkInsert(StepHintVector & current, const StepVector & def);
0249
0250 protected:
0251
0252
0253
0254
0255 StepVector theDefaultPreHandlers;
0256
0257
0258
0259
0260 StepVector theDefaultPostHandlers;
0261
0262
0263
0264
0265 StepHintVector thePreHandlers;
0266
0267
0268
0269
0270 HintVector theHints;
0271
0272
0273
0274
0275 StepHintVector thePostHandlers;
0276
0277 private:
0278
0279
0280
0281
0282 HandlerGroupBase & operator=(const HandlerGroupBase &) = delete;
0283
0284 };
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320 template <typename HDLR>
0321 class HandlerGroup: public HandlerGroupBase {
0322
0323 public:
0324
0325
0326 typedef typename Ptr<HDLR>::pointer HdlPtr;
0327
0328
0329 typedef typename Ptr<HDLR>::transient_pointer tHdlPtr;
0330
0331 public:
0332
0333
0334
0335
0336 virtual ~HandlerGroup();
0337
0338
0339
0340
0341
0342 virtual bool setHandler(tStepHdlPtr, const HandlerGroupBase & ext);
0343
0344
0345
0346
0347 virtual void setHandler() { theHandler = HdlPtr(); }
0348
0349
0350
0351
0352 virtual tStepHdlPtr handler() const {
0353 return dynamic_ptr_cast<tStepHdlPtr>(theHandler);
0354 }
0355
0356
0357
0358
0359 virtual tStepHdlPtr defaultHandler() const {
0360 return dynamic_ptr_cast<tStepHdlPtr>(theDefaultHandler);
0361 }
0362
0363
0364
0365
0366
0367 virtual void refillDefaultHandler(tStepHdlPtr);
0368
0369
0370
0371
0372 virtual void clear();
0373
0374
0375
0376
0377 virtual string handlerClass() const;
0378
0379
0380
0381
0382 void interfaceSetHandler(HdlPtr);
0383
0384
0385
0386
0387 HdlPtr interfaceGetHandler() const;
0388
0389
0390
0391
0392 virtual void write(PersistentOStream & os) const {
0393 os << theDefaultHandler << theHandler;
0394 HandlerGroupBase::write(os);
0395 }
0396
0397
0398
0399
0400 virtual void read(PersistentIStream & is) {
0401 is >> theDefaultHandler >> theHandler;
0402 HandlerGroupBase::read(is);
0403 }
0404
0405 private:
0406
0407
0408
0409
0410
0411 HdlPtr theDefaultHandler;
0412
0413
0414
0415
0416 HdlPtr theHandler;
0417
0418 private:
0419
0420
0421
0422
0423 HandlerGroup<HDLR> & operator=(const HandlerGroup<HDLR> &) = delete;
0424
0425 };
0426
0427
0428 namespace Group {
0429
0430
0431
0432
0433 enum Handler {
0434 subproc,
0435 cascade,
0436 multi,
0437 hadron,
0438 decay
0439 };
0440
0441
0442 enum Level {
0443 before,
0444 main,
0445 after
0446 };
0447 }
0448
0449
0450 template <typename HDLR>
0451 inline PersistentOStream & operator<<(PersistentOStream & os,
0452 const HandlerGroup<HDLR> & hg) {
0453 hg.write(os);
0454 return os;
0455 }
0456
0457
0458 template <typename HDLR>
0459 inline PersistentIStream & operator>>(PersistentIStream & is,
0460 HandlerGroup<HDLR> & hg) {
0461 hg.read(is);
0462 return is;
0463 }
0464
0465 }
0466
0467
0468 #define ThePEG_DECLARE_PREPOST_GROUP(HandlerClass,prepost) \
0469 \
0470 void interfaceSet##prepost##HandlerClass(StepHdlPtr, int); \
0471 \
0472 void interfaceInsert##prepost##HandlerClass(StepHdlPtr, int); \
0473 \
0474 void interfaceErase##prepost##HandlerClass(int); \
0475 \
0476 vector<StepHdlPtr> interfaceGet##prepost##HandlerClass() const
0477
0478
0479 #define ThePEG_DECLARE_GROUPINTERFACE(HandlerClass,ptr) \
0480 ThePEG_DECLARE_PREPOST_GROUP(HandlerClass,Pre); \
0481 \
0482 void interfaceSet##HandlerClass(ptr); \
0483 \
0484 ptr interfaceGet##HandlerClass() const; \
0485 ThePEG_DECLARE_PREPOST_GROUP(HandlerClass,Post)
0486
0487
0488 #define ThePEG_IMPLEMENT_PREPOST_GROUP(ThisClass,HandlerClass,member,pp) \
0489 void ThisClass::interfaceSet##pp##HandlerClass(StepHdlPtr p , int i) { \
0490 member.interfaceSet##pp##handler(p,i); \
0491 } \
0492 void ThisClass::interfaceInsert##pp##HandlerClass(StepHdlPtr p, int i) { \
0493 member.interfaceInsert##pp##handler(p,i); \
0494 } \
0495 void ThisClass::interfaceErase##pp##HandlerClass(int i) { \
0496 member.interfaceErase##pp##handler(i); \
0497 } \
0498 vector<StepHdlPtr> ThisClass::interfaceGet##pp##HandlerClass() const { \
0499 return member.interfaceGet##pp##handlers(); \
0500 }
0501
0502
0503 #define ThePEG_IMPLEMENT_GROUPINTERFACE(ThisClass,HandlerClass,member,ptr) \
0504 ThePEG_IMPLEMENT_PREPOST_GROUP(ThisClass,HandlerClass,member,Pre) \
0505 void ThisClass::interfaceSet##HandlerClass(ptr p) { \
0506 member.interfaceSetHandler(p); \
0507 } \
0508 ptr ThisClass::interfaceGet##HandlerClass() const { \
0509 return member.interfaceGetHandler(); \
0510 } \
0511 ThePEG_IMPLEMENT_PREPOST_GROUP(ThisClass,HandlerClass,member,Post) \
0512
0513
0514 #define ThePEG_DECLARE_PREPOST_OBJECTS(ThisClass,HandlerClass,pp,ba) \
0515 static RefVector<ThisClass,StepHandler> interface##pp##HandlerClass \
0516 (#pp #HandlerClass "s", \
0517 "A list of handlers to be called " #ba " the " #HandlerClass ". " \
0518 "If handler objects are specified in a EventHandler and " \
0519 "the SubProcessHandler chosen in a given collision also specifies some, " \
0520 "the latter will caled first.", \
0521 0, 0, false, false, true, false, \
0522 &ThisClass::interfaceSet##pp##HandlerClass, \
0523 &ThisClass::interfaceInsert##pp##HandlerClass, \
0524 &ThisClass::interfaceErase##pp##HandlerClass, \
0525 &ThisClass::interfaceGet##pp##HandlerClass)
0526
0527
0528 #define ThePEG_DECLARE_GROUPINTERFACE_OBJECTS(ThisClass,HandlerClass) \
0529 ThePEG_DECLARE_PREPOST_OBJECTS(ThisClass,HandlerClass,Pre, before); \
0530 static Reference<ThisClass,HandlerClass> interface ## HandlerClass \
0531 (#HandlerClass, \
0532 "The " #HandlerClass " object used in this " #ThisClass ". " \
0533 "If a " #HandlerClass " object is specified in a EventHandler and " \
0534 "the SubProcessHandler chosen in a given collision also specifies one," \
0535 "the latter will be used.", \
0536 0, false, false, true, true, \
0537 &ThisClass::interfaceSet ## HandlerClass, \
0538 &ThisClass::interfaceGet ## HandlerClass); \
0539 ThePEG_DECLARE_PREPOST_OBJECTS(ThisClass,HandlerClass,Post, after)
0540
0541 #ifndef ThePEG_TEMPLATES_IN_CC_FILE
0542 #include "HandlerGroup.tcc"
0543 #endif
0544
0545 #endif