00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_Interfaced_H
00010 #define ThePEG_Interfaced_H
00011
00012
00013 #include "ThePEG/Config/ThePEG.h"
00014 #include "InterfacedBase.h"
00015
00016 namespace ThePEG {
00017
00037 class Interfaced: public InterfacedBase {
00038
00040 friend class Repository;
00041
00043 friend class EventGenerator;
00044
00045 public:
00046
00050 virtual ~Interfaced();
00051
00056 public:
00057
00067 virtual bool defaultInit();
00068
00075 PPtr getParticle(long) const;
00076
00081 PDPtr getParticleData(long) const;
00082
00086 bool used() const { return theUseFlag; }
00087
00092 void useMe() const { if ( !used() ) setUsed(); }
00093
00098 tEGPtr generator() const { return theGenerator; }
00100
00101 public:
00102
00109 void persistentOutput(PersistentOStream & os) const;
00110
00116 void persistentInput(PersistentIStream & is, int version);
00118
00122 static void Init();
00123
00124 protected:
00125
00129 static void registerRepository(IBPtr);
00130
00135 static void registerRepository(IBPtr, string newName);
00136
00144 void reporeg(IBPtr object, string name) const;
00145
00152 template <typename PtrT>
00153 bool setDefaultReference(PtrT & ptr, string classname, string objectname) {
00154 if ( ptr ) return true;
00155 const ClassDescriptionBase * db = DescriptionList::find(classname);
00156 if ( !db ) return false;
00157 ptr = dynamic_ptr_cast<PtrT>(db->create());
00158 if ( !ptr ) return false;
00159 reporeg(ptr, objectname);
00160 if ( !ptr->defaultInit() ) return false;
00161 return true;
00162 }
00163
00167 Interfaced() : theUseFlag(false) {}
00168
00172 Interfaced(const string & newName)
00173 : InterfacedBase(newName), theUseFlag(false) {}
00174
00178 Interfaced(const Interfaced & i)
00179 : InterfacedBase(i), theGenerator(i.theGenerator), theUseFlag(false) {}
00180
00181 protected:
00182
00187 void setGenerator(tEGPtr generator) { theGenerator=generator; }
00188
00189 private:
00190
00194 void setUsed() const;
00195
00199 tEGPtr theGenerator;
00200
00204 mutable bool theUseFlag;
00205
00209 string doDefaultInit(string);
00210
00211 private:
00212
00216 static AbstractClassDescription<Interfaced> initInterfaced;
00217
00221 Interfaced & operator=(const Interfaced &);
00222
00223 };
00224
00231 template <>
00232 struct BaseClassTrait<Interfaced,1>: public ClassTraitsType {
00234 typedef InterfacedBase NthBase;
00235 };
00236
00241 template <>
00242 struct ClassTraits<Interfaced>: public ClassTraitsBase<Interfaced> {
00244 static string className() { return "ThePEG::Interfaced"; }
00245 };
00246
00249 }
00250
00251 #endif