ThePEG  1.8.0
DescribeClass.h
1 // -*- C++ -*-
2 //
3 // DescribeClass.h is a part of ThePEG - Toolkit for HEP Event Generation
4 // Copyright (C) 1999-2011 Leif Lonnblad
5 //
6 // ThePEG is licenced under version 2 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef ThePEG_DescribeClass_H
10 #define ThePEG_DescribeClass_H
11 
12 #include "ThePEG/Utilities/ClassDescription.h"
13 
14 namespace ThePEG {
15 
22 template <typename BaseT1, typename BaseT2 = int,
23  typename BaseT3 = int, typename BaseT4 = int>
24 struct BaseClasses {};
25 
30 template <typename T>
32 
34  typedef T Base1;
35 
37  typedef int Base2;
38 
40  typedef int Base3;
41 
43  typedef int Base4;
44 
45 };
46 
51 template <typename BaseT1, typename BaseT2, typename BaseT3, typename BaseT4>
52 struct BaseClassesTraits< BaseClasses<BaseT1,BaseT2,BaseT3,BaseT4> > {
53 
55  typedef BaseT1 Base1;
56 
58  typedef BaseT2 Base2;
59 
61  typedef BaseT3 Base3;
62 
64  typedef BaseT4 Base4;
65 
66 };
67 
72 template <typename T, bool NoPIO>
74 
78  static void output(const T & t, PersistentOStream & os) {
79  t.persistentOutput(os);
80  }
81 
85  static void input(T & t, PersistentIStream & is, int oldVersion) {
86  t.persistentInput(is, oldVersion);
87  }
88 
89 };
90 
95 template <typename T>
96 struct DescribeClassPIOHelper<T,true> {
97 
101  static void output(const T &, PersistentOStream &) {}
102 
106  static void input(T &, PersistentIStream &, int) {}
107 
108 };
109 
114 template <typename T, bool abstract>
116 
120  static typename ThePEG::Ptr<T>::pointer create() {
121  return new_ptr(T());
122  }
123 };
124 
129 template <typename T>
131 
135  static typename ThePEG::Ptr<T>::pointer create() {
136  throw std::logic_error("Tried to instantiate abstract class " +
138  }
139 
140 };
141 
142 
143 
144 
158 template <typename T, typename BaseT, bool Abstract = false, bool NoPIO = false>
160 
161 public:
162 
165 
170  DescribeClassT(string cname, string lib, int vers = 0)
171  : ClassDescriptionBase(cname, typeid(T), vers, lib, Abstract) {
173  T::Init();
174  }
175 
179  virtual ~DescribeClassT() {}
180 
184  virtual void setup() {
185  DescriptionVector bases;
186  const ClassDescriptionBase * b =
188  if ( b ) bases.push_back(b);
190  if ( b ) bases.push_back(b);
192  if ( b ) bases.push_back(b);
194  if ( b ) bases.push_back(b);
195  baseClasses(bases.begin(), bases.end());
196  }
197 
201  virtual BPtr create() const {
203  }
204 
208  virtual void output(tcBPtr o, PersistentOStream & os) const {
211  }
212 
216  virtual void input(tBPtr o, PersistentIStream & is, int oldVersion) const {
217  tTPtr t = dynamic_ptr_cast<tTPtr>(o);
218  DescribeClassPIOHelper<T,NoPIO>::input(*t, is, oldVersion);
219  }
220 
221 };
222 
243 template <typename T, typename BaseT = int,
244  bool Abstract = false, bool NoPIO = false>
245 class DescribeClass: public DescribeClassT<T,BaseT,Abstract,NoPIO> {
246 
247 public:
248 
253  DescribeClass(string cname, string lib, int vers = 0)
254  : DescribeClassT<T,BaseT,Abstract,NoPIO>(cname, lib, vers) {}
255 
256 };
257 
276 template <typename T, typename BaseT = int>
277 class DescribeNoPIOClass: public DescribeClassT<T,BaseT,false,true> {
278 
279 public:
280 
285  DescribeNoPIOClass(string cname, string lib, int vers = 0)
286  : DescribeClassT<T,BaseT,false,true>(cname, lib, vers) {}
287 
288 };
289 
308 template <typename T, typename BaseT = int>
309 class DescribeAbstractClass: public DescribeClassT<T,BaseT,true,false> {
310 
311 public:
312 
317  DescribeAbstractClass(string cname, string lib, int vers = 0)
318  :DescribeClassT<T,BaseT,true,false>(cname, lib, vers) {}
319 
320 };
321 
340 template <typename T, typename BaseT = int>
341 class DescribeAbstractNoPIOClass: public DescribeClassT<T,BaseT,true,true> {
342 
343 public:
344 
349  DescribeAbstractNoPIOClass(string cname, string lib, int vers = 0)
350  :DescribeClassT<T,BaseT,true,true>(cname, lib, vers) {}
351 
352 };
353 
354 }
355 
356 
357 #endif /* ThePEG_DescribeClass_H */