File indexing completed on 2026-08-06 09:38:31
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_ClassDescription_H
0010 #define ThePEG_ClassDescription_H
0011
0012 #include "ThePEG/Config/ThePEG.h"
0013 #include "ClassDescription.fh"
0014 #include "ThePEG/Utilities/Named.h"
0015 #include "ThePEG/Persistency/PersistentOStream.fh"
0016 #include "ThePEG/Persistency/PersistentIStream.fh"
0017 #include "ClassTraits.h"
0018 #include "DescriptionList.h"
0019
0020 namespace ThePEG {
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 class ClassDescriptionBase: public Named {
0064
0065 public:
0066
0067
0068 typedef vector<const ClassDescriptionBase *> DescriptionVector;
0069
0070 protected:
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 ClassDescriptionBase(string newName,
0082 const type_info & newInfo,
0083 int newVersion,
0084 string newLibrary,
0085 bool abst)
0086 : Named(newName), theVersion(newVersion), theLibrary(newLibrary),
0087 theInfo(newInfo), isAbstract(abst), done(false) {}
0088
0089 public:
0090
0091
0092
0093
0094 virtual ~ClassDescriptionBase();
0095
0096
0097
0098
0099 const type_info & info() const { return theInfo; }
0100
0101
0102
0103
0104 int version() const { return theVersion; }
0105
0106
0107
0108
0109
0110 string library() const { return theLibrary; }
0111
0112
0113
0114
0115 bool check() const { return done; }
0116
0117
0118
0119
0120
0121 const DescriptionVector & descriptions() const { return theBaseClasses; }
0122
0123
0124
0125
0126 virtual void setup() = 0;
0127
0128
0129
0130
0131 virtual BPtr create() const = 0;
0132
0133
0134
0135
0136
0137
0138
0139 virtual void output(tcBPtr b, PersistentOStream & os) const = 0;
0140
0141
0142
0143
0144
0145
0146
0147
0148 virtual void input(tBPtr b, PersistentIStream & is, int oldVersion) const = 0;
0149
0150
0151
0152
0153
0154 bool isA(const ClassDescriptionBase & base) const;
0155
0156
0157
0158
0159 bool abstract() const { return isAbstract; }
0160
0161 protected:
0162
0163
0164
0165
0166
0167
0168
0169 void baseClasses(DescriptionVector::iterator first,
0170 DescriptionVector::iterator last)
0171 {
0172 theBaseClasses = DescriptionVector(first, last);
0173 done = true;
0174 }
0175
0176 private:
0177
0178
0179
0180
0181 int theVersion;
0182
0183
0184
0185
0186 string theLibrary;
0187
0188
0189
0190
0191 const type_info & theInfo;
0192
0193
0194
0195
0196 DescriptionVector theBaseClasses;
0197
0198
0199
0200
0201 bool isAbstract;
0202
0203
0204
0205
0206 bool done;
0207
0208 };
0209
0210
0211
0212
0213
0214 template <typename T, int IBase,
0215 typename B = typename BaseClassTrait<T,IBase>::NthBase>
0216 struct ClassDescriptionHelper {
0217
0218 static void addBases(vector<const ClassDescriptionBase *> & c){
0219 const ClassDescriptionBase * b = DescriptionList::find(typeid(B));
0220 if ( !b ) return;
0221 c.push_back(b);
0222 ClassDescriptionHelper<T,IBase+1>::addBases(c);
0223 }
0224 };
0225
0226
0227
0228
0229
0230
0231
0232 template <typename T, int IBase>
0233 struct ClassDescriptionHelper<T, IBase, int> {
0234
0235 static void addBases(vector<const ClassDescriptionBase *> & ) {}
0236 };
0237
0238
0239
0240
0241
0242
0243
0244 template <typename T>
0245 class ClassDescriptionTBase: public ClassDescriptionBase {
0246
0247 public:
0248
0249
0250 typedef ClassTraits<T> Traits;
0251
0252 public:
0253
0254
0255
0256
0257
0258 ClassDescriptionTBase(bool abst)
0259 : ClassDescriptionBase(Traits::className(), typeid(T), Traits::version(),
0260 Traits::library(), abst)
0261 {
0262 DescriptionList::Register(*this);
0263 T::Init();
0264 }
0265
0266
0267
0268
0269 virtual void setup() {
0270 DescriptionVector bases;
0271 ClassDescriptionHelper<T,1>::addBases(bases);
0272 baseClasses(bases.begin(), bases.end());
0273 }
0274
0275 };
0276
0277
0278
0279
0280
0281 template <typename T>
0282 class AbstractClassDescription: public ClassDescriptionTBase<T> {
0283
0284 public:
0285
0286
0287 typedef ClassTraits<T> Traits;
0288
0289 public:
0290
0291
0292
0293
0294 AbstractClassDescription() : ClassDescriptionTBase<T>(true) {}
0295
0296
0297
0298
0299
0300 virtual BPtr create() const {
0301 throw std::logic_error("Tried to instantiate virtual class " + Named::name());
0302 }
0303
0304
0305
0306
0307
0308
0309
0310 virtual void output(tcBPtr b, PersistentOStream & os) const {
0311 Traits::output(Traits::cast(b), os);
0312 }
0313
0314
0315
0316
0317
0318
0319
0320
0321 virtual void input(tBPtr b, PersistentIStream & is,
0322 int oldVersion) const {
0323 Traits::input(Traits::cast(b), is, oldVersion);
0324 }
0325
0326 };
0327
0328
0329
0330
0331
0332 template <typename T>
0333 class ClassDescription: public ClassDescriptionTBase<T> {
0334
0335 public:
0336
0337
0338 typedef ClassTraits<T> Traits;
0339
0340 public:
0341
0342
0343
0344
0345 ClassDescription() : ClassDescriptionTBase<T>(false) {}
0346
0347
0348
0349
0350 virtual BPtr create() const { return Traits::create(); }
0351
0352
0353
0354
0355
0356
0357
0358 virtual void output(tcBPtr b, PersistentOStream & os) const {
0359 Traits::output(Traits::cast(b), os);
0360 }
0361
0362
0363
0364
0365
0366
0367
0368
0369 virtual void input(tBPtr b, PersistentIStream & is,
0370 int oldVersion) const {
0371 Traits::input(Traits::cast(b), is, oldVersion);
0372 }
0373
0374 };
0375
0376
0377
0378
0379
0380 template <typename T>
0381 class NoPIOClassDescription: public ClassDescriptionTBase<T> {
0382
0383 public:
0384
0385
0386 typedef ClassTraits<T> Traits;
0387
0388 public:
0389
0390
0391
0392
0393 NoPIOClassDescription() : ClassDescriptionTBase<T>(false) {}
0394
0395
0396
0397
0398 virtual BPtr create() const { return Traits::create(); }
0399
0400
0401
0402
0403 virtual void output(tcBPtr, PersistentOStream &) const {}
0404
0405
0406
0407
0408 virtual void input(tBPtr, PersistentIStream &, int) const {}
0409
0410 };
0411
0412
0413
0414
0415
0416 template <typename T>
0417 class AbstractNoPIOClassDescription: public ClassDescriptionTBase<T> {
0418
0419 public:
0420
0421
0422 typedef ClassTraits<T> Traits;
0423
0424 public:
0425
0426
0427
0428
0429 AbstractNoPIOClassDescription() : ClassDescriptionTBase<T>(true) {}
0430
0431
0432
0433
0434
0435 virtual BPtr create() const {
0436 throw std::logic_error("Tried to instantiate virtual class " + Named::name());
0437 }
0438
0439
0440
0441
0442 virtual void output(tcBPtr, PersistentOStream & ) const {}
0443
0444
0445
0446
0447 virtual void input(tBPtr, PersistentIStream &, int) const {}
0448
0449 };
0450
0451 }
0452
0453 #define ThePEG_DECLARE_CLASS_DESCRIPTION(Class) \
0454 \
0455 static ClassDescription<Class> init ## Class \
0456
0457 #define ThePEG_DECLARE_ABSTRACT_CLASS_DESCRIPTION(Class) \
0458 \
0459 static AbstractClassDescription<Class> init ## Class \
0460
0461 #define ThePEG_DECLARE_NOPIO_CLASS_DESCRIPTION(Class) \
0462 \
0463 static NoPIOClassDescription<Class> init ## Class \
0464
0465 #define ThePEG_DECLARE_ABSTRACT_NOPIO_CLASS_DESCRIPTION(Class) \
0466 \
0467 static AbstractNoPIOClassDescription<Class> init ## Class \
0468
0469 #define ThePEG_IMPLEMENT_CLASS_DESCRIPTION(Class) \
0470 ClassDescription<Class> Class::init ## Class \
0471
0472 #define ThePEG_IMPLEMENT_ABSTRACT_CLASS_DESCRIPTION(Class) \
0473 AbstractClassDescription<Class> Class::init ## Class \
0474
0475 #define ThePEG_IMPLEMENT_NOPIO_CLASS_DESCRIPTION(Class) \
0476 NoPIOClassDescription<Class> Class::init ## Class \
0477
0478 #define ThePEG_IMPLEMENT_ABSTRACT_NOPIO_CLASS_DESCRIPTION(Class) \
0479 AbstractNoPIOClassDescription<Class> Class::init ## Class \
0480
0481 #endif