DD4hep  1.28.0
Detector Description Toolkit for High Energy Physics
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 #include "DD4hep/Primitives.h"
25 
26 // C/C++ include files
27 #include <typeinfo>
28 
30 namespace dd4hep {
31 
33 
40  protected:
42  ExtensionEntry() = default;
44  ExtensionEntry(const ExtensionEntry& copy) = default;
45  public:
47  virtual ~ExtensionEntry() = default;
49  void invalidCall(const char* tag) const;
51  virtual void* object() const = 0;
53  virtual void* copy(void*) const = 0;
55  virtual void destruct() const = 0;
57  virtual ExtensionEntry* clone(void* arg) const = 0;
59  virtual unsigned long long int hash64() const = 0;
60  };
61 
62  namespace detail {
63 
65 
77  template <typename Q,typename T> class SimpleExtension : public ExtensionEntry {
78  protected:
79  T* ptr = 0;
80  mutable Q* iface = 0;
81  public:
83  SimpleExtension() = delete;
85  SimpleExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
89  virtual ~SimpleExtension() = default;
93  virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
95  virtual void destruct() const override { }
97  virtual void* object() const override
98  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
100  virtual ExtensionEntry* clone(void*) const override
101  { invalidCall("clone"); return 0; }
103  virtual unsigned long long int hash64() const override
104  { return detail::typeHash64<Q>(); }
105  };
106 
108 
122  template <typename Q,typename T> class DeleteExtension : public ExtensionEntry {
123  protected:
124  T* ptr = 0;
125  mutable Q* iface = 0;
126  public:
128  DeleteExtension() = delete;
130  DeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
134  virtual ~DeleteExtension() = default;
138  virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
140  virtual void destruct() const override { delete ptr; }
142  virtual void* object() const override
143  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
145  virtual ExtensionEntry* clone(void* arg) const override
146  { return new DeleteExtension((T*)this->copy(arg)); }
148  virtual unsigned long long int hash64() const override
149  { return detail::typeHash64<Q>(); }
150  };
151 
153 
167  template <typename Q,typename T> class CopyDeleteExtension : public ExtensionEntry {
168  protected:
169  T* ptr = 0;
170  mutable Q* iface = 0;
171  public:
175  CopyDeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
179  virtual ~CopyDeleteExtension() = default;
183  virtual void* copy(void*) const override { return new T(*ptr); }
185  virtual void destruct() const override { delete ptr; }
187  virtual void* object() const override
188  { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
190  virtual ExtensionEntry* clone(void* arg) const override
191  { return new CopyDeleteExtension((T*)this->copy(arg)); }
193  virtual unsigned long long int hash64() const override
194  { return detail::typeHash64<Q>(); }
195  };
196  } // End namespace detail
197 } // End namespace dd4hep
198 #endif // DD4HEP_EXTENSIONENTRY_H
dd4hep::ExtensionEntry
Definition of the extension entry interface class.
Definition: ExtensionEntry.h:39
dd4hep::detail::DeleteExtension::clone
virtual ExtensionEntry * clone(void *arg) const override
Virtual entry clone function.
Definition: ExtensionEntry.h:145
dd4hep::detail::SimpleExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:97
dd4hep::detail::CopyDeleteExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:187
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:93
dd4hep::detail::CopyDeleteExtension
Implementation class for the object extension mechanism.
Definition: ExtensionEntry.h:167
dd4hep::detail::SimpleExtension::hash64
virtual unsigned long long int hash64() const override
Hash value.
Definition: ExtensionEntry.h:103
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:77
dd4hep::detail::SimpleExtension::destruct
virtual void destruct() const override
Virtual object destructor. Function may still be called without side-effects.
Definition: ExtensionEntry.h:95
dd4hep::detail::SimpleExtension::ptr
T * ptr
Definition: ExtensionEntry.h:79
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:190
dd4hep::detail::CopyDeleteExtension::hash64
virtual unsigned long long int hash64() const override
Hash value.
Definition: ExtensionEntry.h:193
dd4hep::detail::DeleteExtension::DeleteExtension
DeleteExtension(T *p)
Initializing constructor.
Definition: ExtensionEntry.h:130
dd4hep::detail::CopyDeleteExtension::iface
Q * iface
Definition: ExtensionEntry.h:170
dd4hep::detail::DeleteExtension
Implementation class for the object extension mechanism.
Definition: ExtensionEntry.h:122
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:80
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:185
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:85
dd4hep::detail::DeleteExtension::object
virtual void * object() const override
Virtual object accessor.
Definition: ExtensionEntry.h:142
dd4hep
Namespace for the AIDA detector description toolkit.
Definition: AlignmentsCalib.h:28
dd4hep::detail::DeleteExtension::iface
Q * iface
Definition: ExtensionEntry.h:125
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:148
dd4hep::detail::CopyDeleteExtension::CopyDeleteExtension
CopyDeleteExtension(T *p)
Initializing constructor.
Definition: ExtensionEntry.h:175
dd4hep::detail::DeleteExtension::ptr
T * ptr
Definition: ExtensionEntry.h:124
dd4hep::detail::CopyDeleteExtension::copy
virtual void * copy(void *) const override
Virtual object copy operator.
Definition: ExtensionEntry.h:183
dd4hep::detail::SimpleExtension::clone
virtual ExtensionEntry * clone(void *) const override
Virtual entry clone function.
Definition: ExtensionEntry.h:100
dd4hep::detail::CopyDeleteExtension::ptr
T * ptr
Definition: ExtensionEntry.h:169
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:138
dd4hep::detail::DeleteExtension::DeleteExtension
DeleteExtension()=delete
Default constructor.
dd4hep::detail::DeleteExtension::destruct
virtual void destruct() const override
Virtual object destructor.
Definition: ExtensionEntry.h:140
dd4hep::ExtensionEntry::hash64
virtual unsigned long long int hash64() const =0
Hash value.