DD4hep  1.32.0
Detector Description Toolkit for High Energy Physics
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ExtensionEntry.h
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 // Author : M.Frank
11 //
12 //==========================================================================
13 //
14 // NOTE:
15 //
16 // This is an internal include file. It should only be included to
17 // instantiate code. Otherwise the BasicGrammar include file should be
18 // sufficient for all practical purposes.
19 //
20 //==========================================================================
21 #ifndef DD4HEP_EXTENSIONENTRY_H
22 #define DD4HEP_EXTENSIONENTRY_H
23 
24 // Framework include files
25 #include <DD4hep/Primitives.h>
26 
28 namespace dd4hep {
29 
31 
38  protected:
40  ExtensionEntry() = default;
42  ExtensionEntry(const ExtensionEntry& copy) = default;
43  public:
45  virtual ~ExtensionEntry() = default;
47  void invalidCall(const char* tag) const;
49  virtual void* object() const = 0;
51  virtual void* copy(void*) const = 0;
53  virtual void destruct() const = 0;
55  virtual ExtensionEntry* clone(void* arg) const = 0;
57  virtual unsigned long long int hash64() const = 0;
58  };
59 
60  namespace detail {
61 
63 
75  template <typename Q,typename T> class SimpleExtension : public ExtensionEntry {
76  protected:
77  T* ptr = 0;
78  mutable Q* iface = 0;
79  public:
81  SimpleExtension() = delete;
83  SimpleExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
87  virtual ~SimpleExtension() = default;
91  virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
93  virtual void destruct() const override { }
95  virtual void* object() const override
96  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
98  virtual ExtensionEntry* clone(void*) const override
99  { invalidCall("clone"); return 0; }
101  virtual unsigned long long int hash64() const override
102  { return detail::typeHash64<Q>(); }
103  };
104 
106 
120  template <typename Q,typename T> class DeleteExtension : public ExtensionEntry {
121  protected:
122  T* ptr = 0;
123  mutable Q* iface = 0;
124  public:
126  DeleteExtension() = delete;
128  DeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
132  virtual ~DeleteExtension() = default;
136  virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
138  virtual void destruct() const override { delete ptr; }
140  virtual void* object() const override
141  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
143  virtual ExtensionEntry* clone(void* arg) const override
144  { return new DeleteExtension((T*)this->copy(arg)); }
146  virtual unsigned long long int hash64() const override
147  { return detail::typeHash64<Q>(); }
148  };
149 
151 
165  template <typename Q,typename T> class CopyDeleteExtension : public ExtensionEntry {
166  protected:
167  T* ptr = 0;
168  mutable Q* iface = 0;
169  public:
173  CopyDeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
177  virtual ~CopyDeleteExtension() = default;
181  virtual void* copy(void*) const override { return new T(*ptr); }
183  virtual void destruct() const override { delete ptr; }
185  virtual void* object() const override
186  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
188  virtual ExtensionEntry* clone(void* arg) const override
189  { return new CopyDeleteExtension((T*)this->copy(arg)); }
191  virtual unsigned long long int hash64() const override
192  { return detail::typeHash64<Q>(); }
193  };
194  } // End namespace detail
195 } // End namespace dd4hep
196 #endif // DD4HEP_EXTENSIONENTRY_H
dd4hep::ExtensionEntry
Definition of the extension entry interface class.
Definition: ExtensionEntry.h:37
dd4hep::detail::DeleteExtension::clone
virtual ExtensionEntry * clone(void *arg) const override
Virtual entry clone function.
Definition: ExtensionEntry.h:143
dd4hep::detail::SimpleExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:95
dd4hep::detail::CopyDeleteExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:185
dd4hep::detail::SimpleExtension::~SimpleExtension
virtual ~SimpleExtension()=default
Default destructor.
dd4hep::ExtensionEntry::destruct
virtual void destruct() const =0
Virtual object destructor.
dd4hep::detail::CopyDeleteExtension::CopyDeleteExtension
CopyDeleteExtension(const CopyDeleteExtension &copy)=default
Copy constructor.
dd4hep::detail::DeleteExtension::DeleteExtension
DeleteExtension(const DeleteExtension &copy)=default
Copy constructor.
dd4hep::detail::SimpleExtension::SimpleExtension
SimpleExtension(const SimpleExtension &copy)=default
Copy constructor.
dd4hep::detail::SimpleExtension::copy
virtual void * copy(void *) const override
Virtual object copy operator.
Definition: ExtensionEntry.h:91
dd4hep::detail::CopyDeleteExtension
Implementation class for the object extension mechanism.
Definition: ExtensionEntry.h:165
dd4hep::detail::SimpleExtension::hash64
virtual unsigned long long int hash64() const override
Hash value.
Definition: ExtensionEntry.h:101
dd4hep::ExtensionEntry::clone
virtual ExtensionEntry * clone(void *arg) const =0
Virtual entry clone function.
dd4hep::detail::SimpleExtension
Implementation class for the object extension mechanism.
Definition: ExtensionEntry.h:75
dd4hep::detail::SimpleExtension::destruct
virtual void destruct() const override
Virtual object destructor. Function may still be called without side-effects.
Definition: ExtensionEntry.h:93
dd4hep::detail::SimpleExtension::ptr
T * ptr
Definition: ExtensionEntry.h:77
dd4hep::ExtensionEntry::~ExtensionEntry
virtual ~ExtensionEntry()=default
Default destructor.
dd4hep::ExtensionEntry::invalidCall
void invalidCall(const char *tag) const
Callback on invalid call invokation.
Definition: ExtensionEntry.cpp:19
dd4hep::detail::CopyDeleteExtension::clone
virtual ExtensionEntry * clone(void *arg) const override
Virtual entry clone function.
Definition: ExtensionEntry.h:188
dd4hep::detail::CopyDeleteExtension::hash64
virtual unsigned long long int hash64() const override
Hash value.
Definition: ExtensionEntry.h:191
dd4hep::detail::DeleteExtension::DeleteExtension
DeleteExtension(T *p)
Initializing constructor.
Definition: ExtensionEntry.h:128
dd4hep::detail::CopyDeleteExtension::iface
Q * iface
Definition: ExtensionEntry.h:168
dd4hep::detail::DeleteExtension
Implementation class for the object extension mechanism.
Definition: ExtensionEntry.h:120
dd4hep::ExtensionEntry::object
virtual void * object() const =0
Virtual object accessor.
dd4hep::detail::CopyDeleteExtension::~CopyDeleteExtension
virtual ~CopyDeleteExtension()=default
Default destructor.
dd4hep::detail::SimpleExtension::iface
Q * iface
Definition: ExtensionEntry.h:78
dd4hep::ExtensionEntry::ExtensionEntry
ExtensionEntry(const ExtensionEntry &copy)=default
Copy constructor.
dd4hep::detail::CopyDeleteExtension::operator=
CopyDeleteExtension & operator=(const CopyDeleteExtension &copy)=default
Assignment operator.
dd4hep::ExtensionEntry::copy
virtual void * copy(void *) const =0
Virtual object copy operator.
dd4hep::detail::DeleteExtension::operator=
DeleteExtension & operator=(const DeleteExtension &copy)=default
Assignment operator.
dd4hep::detail::SimpleExtension::operator=
SimpleExtension & operator=(const SimpleExtension &copy)=default
Assignment operator.
dd4hep::detail::CopyDeleteExtension::destruct
virtual void destruct() const override
Virtual object destructor.
Definition: ExtensionEntry.h:183
dd4hep::detail::DeleteExtension::~DeleteExtension
virtual ~DeleteExtension()=default
Default destructor.
Primitives.h
dd4hep::ExtensionEntry::ExtensionEntry
ExtensionEntry()=default
Default constructor.
dd4hep::detail::SimpleExtension::SimpleExtension
SimpleExtension(T *p)
Initializing constructor.
Definition: ExtensionEntry.h:83
dd4hep::detail::DeleteExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:140
dd4hep
Namespace for the AIDA detector description toolkit.
Definition: AlignmentsCalib.h:28
dd4hep::detail::DeleteExtension::iface
Q * iface
Definition: ExtensionEntry.h:123
dd4hep::detail::CopyDeleteExtension::CopyDeleteExtension
CopyDeleteExtension()=delete
Default constructor.
dd4hep::detail::DeleteExtension::hash64
virtual unsigned long long int hash64() const override
Hash value.
Definition: ExtensionEntry.h:146
dd4hep::detail::CopyDeleteExtension::CopyDeleteExtension
CopyDeleteExtension(T *p)
Initializing constructor.
Definition: ExtensionEntry.h:173
dd4hep::detail::DeleteExtension::ptr
T * ptr
Definition: ExtensionEntry.h:122
dd4hep::detail::CopyDeleteExtension::copy
virtual void * copy(void *) const override
Virtual object copy operator.
Definition: ExtensionEntry.h:181
dd4hep::detail::SimpleExtension::clone
virtual ExtensionEntry * clone(void *) const override
Virtual entry clone function.
Definition: ExtensionEntry.h:98
dd4hep::detail::CopyDeleteExtension::ptr
T * ptr
Definition: ExtensionEntry.h:167
dd4hep::detail::SimpleExtension::SimpleExtension
SimpleExtension()=delete
Default constructor.
dd4hep::detail::DeleteExtension::copy
virtual void * copy(void *) const override
Virtual object copy operator.
Definition: ExtensionEntry.h:136
dd4hep::detail::DeleteExtension::DeleteExtension
DeleteExtension()=delete
Default constructor.
dd4hep::detail::DeleteExtension::destruct
virtual void destruct() const override
Virtual object destructor.
Definition: ExtensionEntry.h:138
dd4hep::ExtensionEntry::hash64
virtual unsigned long long int hash64() const =0
Hash value.