22 using namespace DD4hep;
25 static int s_extensionID = 0;
27 static std::map<const std::type_info*, ObjectExtensions::ExtensionMap> s_map;
53 void* ptr = (*i).second;
55 ExtensionMap::iterator j =
extensionMap->find((*i).first);
68 for (Extensions::const_iterator i = ext.begin(); i != ext.end(); ++i) {
69 const std::type_info* info = (*i).first;
70 ExtensionMap::const_iterator j =
extensionMap->find(info);
71 const Entry&
e = (*j).second;
83 Extensions::iterator j =
extensions.find(&info);
90 entry.
id = ++s_extensionID;
96 throw std::runtime_error(
"DD4hep: addExtension: Object already has an extension of type:" +
typeName(info) +
".");
101 Extensions::iterator j =
extensions.find(&info);
103 void *ptr = (*j).second;
115 throw std::runtime_error(
"DD4hep: removeExtension: The object of type " +
typeName(info) +
" is not present.");
120 Extensions::const_iterator j =
extensions.find(&info);
124 throw std::runtime_error(
"DD4hep: extension: Object has no extension of type:" +
typeName(info) +
".");
129 Extensions::const_iterator j =
extensions.find(&info);
135 throw std::runtime_error(
"DD4hep: extension: Object has no extension of type:" +
typeName(info) +
".");
Defintiion of the extension entry.
void move(ObjectExtensions ©)
Move extensions to target object.
std::map< const std::type_info *, void * > Extensions
Definition of the extension type.
std::map< const std::type_info *, Entry > ExtensionMap
Extensions extensions
The extensions object.
static void decrement(T *)
Decrement count according to type information.
std::string typeName(const std::type_info &type)
ABI information about type names.
void copyFrom(const Extensions &ext, void *arg)
Copy object extensions from another object. Hosting type must be identical!
ObjectExtensions(const std::type_info &parent_type)
Default constructor.
void clear(bool destroy=true)
Clear all extensions.
static void increment(T *)
Increment count according to type information.
virtual ~ObjectExtensions()
Default destructor.
void * extension(const std::type_info &info, bool alert) const
Access an existing extension object from the detector element.
void * addExtension(void *ptr, const std::type_info &info, copy_t ctor, destruct_t dtor)
Add an extension object to the detector element.
void * removeExtension(const std::type_info &info, bool destroy)
Remove an existing extension object from the instance.
Implementation of an object supporting arbitrary user extensions.
void * addExtension(void *ptr, const std::type_info &info, destruct_t dtor)
Add an extension object to the detector element.
ExtensionMap * extensionMap
Pointer to the extension map.