File indexing completed on 2025-07-01 08:35:03
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #ifndef DD4HEP_EXTENSIONENTRY_H
0022 #define DD4HEP_EXTENSIONENTRY_H
0023
0024
0025 #include <DD4hep/Primitives.h>
0026
0027
0028 namespace dd4hep {
0029
0030
0031
0032
0033
0034
0035
0036
0037 class ExtensionEntry {
0038 protected:
0039
0040 ExtensionEntry() = default;
0041
0042 ExtensionEntry(const ExtensionEntry& copy) = default;
0043 public:
0044
0045 virtual ~ExtensionEntry() = default;
0046
0047 void invalidCall(const char* tag) const;
0048
0049 virtual void* object() const = 0;
0050
0051 virtual void* copy(void*) const = 0;
0052
0053 virtual void destruct() const = 0;
0054
0055 virtual ExtensionEntry* clone(void* arg) const = 0;
0056
0057 virtual unsigned long long int hash64() const = 0;
0058 };
0059
0060 namespace detail {
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 template <typename Q,typename T> class SimpleExtension : public ExtensionEntry {
0076 protected:
0077 T* ptr = 0;
0078 mutable Q* iface = 0;
0079 public:
0080
0081 SimpleExtension() = delete;
0082
0083 SimpleExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
0084
0085 SimpleExtension(const SimpleExtension& copy) = default;
0086
0087 virtual ~SimpleExtension() = default;
0088
0089 SimpleExtension& operator=(const SimpleExtension& copy) = default;
0090
0091 virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
0092
0093 virtual void destruct() const override { }
0094
0095 virtual void* object() const override
0096 { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
0097
0098 virtual ExtensionEntry* clone(void*) const override
0099 { invalidCall("clone"); return 0; }
0100
0101 virtual unsigned long long int hash64() const override
0102 { return detail::typeHash64<Q>(); }
0103 };
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 template <typename Q,typename T> class DeleteExtension : public ExtensionEntry {
0121 protected:
0122 T* ptr = 0;
0123 mutable Q* iface = 0;
0124 public:
0125
0126 DeleteExtension() = delete;
0127
0128 DeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
0129
0130 DeleteExtension(const DeleteExtension& copy) = default;
0131
0132 virtual ~DeleteExtension() = default;
0133
0134 DeleteExtension& operator=(const DeleteExtension& copy) = default;
0135
0136 virtual void* copy(void*) const override { invalidCall("copy"); return 0; }
0137
0138 virtual void destruct() const override { delete ptr; }
0139
0140 virtual void* object() const override
0141 { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
0142
0143 virtual ExtensionEntry* clone(void* arg) const override
0144 { return new DeleteExtension((T*)this->copy(arg)); }
0145
0146 virtual unsigned long long int hash64() const override
0147 { return detail::typeHash64<Q>(); }
0148 };
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 template <typename Q,typename T> class CopyDeleteExtension : public ExtensionEntry {
0166 protected:
0167 T* ptr = 0;
0168 mutable Q* iface = 0;
0169 public:
0170
0171 CopyDeleteExtension() = delete;
0172
0173 CopyDeleteExtension(T* p) : ptr(p) { iface = dynamic_cast<Q*>(p); }
0174
0175 CopyDeleteExtension(const CopyDeleteExtension& copy) = default;
0176
0177 virtual ~CopyDeleteExtension() = default;
0178
0179 CopyDeleteExtension& operator=(const CopyDeleteExtension& copy) = default;
0180
0181 virtual void* copy(void*) const override { return new T(*ptr); }
0182
0183 virtual void destruct() const override { delete ptr; }
0184
0185 virtual void* object() const override
0186 { return iface ? iface : (iface=dynamic_cast<Q*>(ptr)); }
0187
0188 virtual ExtensionEntry* clone(void* arg) const override
0189 { return new CopyDeleteExtension((T*)this->copy(arg)); }
0190
0191 virtual unsigned long long int hash64() const override
0192 { return detail::typeHash64<Q>(); }
0193 };
0194 }
0195 }
0196 #endif