GGS(GenericGEANT4Simulation)Software  2.99.0
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Macros
GGSMCPluginMacros.h
Go to the documentation of this file.
1 /*
2  * GGSMCPluginMacros.h
3  *
4  * Created on: 07 Aug 2013
5  * Author: Nicola Mori
6  */
7 
10 #ifndef GGSMCPLUGINMACROS_H_
11 #define GGSMCPLUGINMACROS_H_
12 
14 #define PhysicsListPlugin(plClass) \
15  extern "C" G4VUserPhysicsList *PhysicsListBuilder() { return new plClass(); } \
16  extern "C" void PhysicsListDestroyer(plClass *p) { delete p; }
17 
19 #define RegisterSD(sdClassName) \
20  G4VSensitiveDetector *sdClassName##Builder(std::string name) { return new sdClassName(name); } \
21  void sdClassName##Destroyer(sdClassName *p) { delete p; } \
22  class sdClassName##Proxy { \
23  public: \
24  sdClassName##Proxy() { \
25  GGSFactory<G4VSensitiveDetector, std::string>::GetInstance().RegisterBuilder(#sdClassName, \
26  sdClassName##Builder); \
27  } \
28  }; \
29  sdClassName##Proxy proxyFor##sdClassName
30 
33 #include "utils/GGSFactory.h"
34 #define RegisterUA(uaClassName) \
35  template <typename Derived, typename Enable = void> struct BaseOf {}; \
36  template <typename Derived> \
37  struct BaseOf<Derived, typename std::enable_if<std::is_convertible<Derived *, GGSUserAction *>::value>::type> { \
38  using type = GGSUserAction; \
39  }; \
40  template <class Derived> \
41  struct BaseOf<Derived, \
42  typename std::enable_if<!std::is_convertible<Derived *, GGSUserAction *>::value && \
43  std::is_convertible<Derived *, G4UserSteppingAction *>::value>::type> { \
44  using type = G4UserSteppingAction; \
45  }; \
46  template <class Derived> \
47  struct BaseOf<Derived, \
48  typename std::enable_if<!std::is_convertible<Derived *, GGSUserAction *>::value && \
49  std::is_convertible<Derived *, G4UserTrackingAction *>::value>::type> { \
50  using type = G4UserTrackingAction; \
51  }; \
52  template <class Derived> \
53  struct BaseOf<Derived, typename std::enable_if<!std::is_convertible<Derived *, GGSUserAction *>::value && \
54  std::is_convertible<Derived *, G4UserEventAction *>::value>::type> { \
55  using type = G4UserEventAction; \
56  }; \
57  template <class Derived> \
58  struct BaseOf<Derived, typename std::enable_if<!std::is_convertible<Derived *, GGSUserAction *>::value && \
59  std::is_convertible<Derived *, G4UserRunAction *>::value>::type> { \
60  using type = G4UserRunAction; \
61  }; \
62  template <class Derived> \
63  struct BaseOf<Derived, \
64  typename std::enable_if<!std::is_convertible<Derived *, GGSUserAction *>::value && \
65  std::is_convertible<Derived *, G4UserStackingAction *>::value>::type> { \
66  using type = G4UserStackingAction; \
67  }; \
68  template <typename Derived> typename BaseOf<Derived>::type *uaClassName##Builder() { return new Derived; } \
69  class uaClassName##Proxy { \
70  public: \
71  uaClassName##Proxy() { \
72  GGSFactory<typename std::remove_pointer<decltype(uaClassName##Builder<uaClassName>())>::type>::GetInstance() \
73  .RegisterBuilder(#uaClassName, uaClassName##Builder<uaClassName>); \
74  } \
75  }; \
76  uaClassName##Proxy proxyFor##uaClassName##Builder
77 
79 #include "G4VUserPrimaryGeneratorAction.hh"
80 #define RegisterGA(gaClassName, gaName) \
81  G4VUserPrimaryGeneratorAction *gaClassName##Builder() { return new gaClassName; } \
82  class gaClassName##Proxy { \
83  public: \
84  gaClassName##Proxy() { \
85  GGSFactory<G4VUserPrimaryGeneratorAction>::GetInstance().RegisterBuilder(#gaName, gaClassName##Builder); \
86  } \
87  }; \
88  gaClassName##Proxy proxyFor##gaClassName##Builder
89 
90 #endif /* GGSMCPLUGINMACROS_H_ */