ATLAS Offline Software
Loading...
Searching...
No Matches
CollectionGetterToolImpl.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5// $Id$
12
13
17
18
19namespace D3PD {
20
21
29 const std::string& name,
30 const IInterface* parent)
31 : base_class (type, name, parent)
32{
33 declareProperty ("Label", m_label,
34 "Label to assign to this getter, to be able to reference "
35 "it from an association tool. Leave blank if no label "
36 "is needed.");
37 declareProperty ("CollectionGetterRegistry", m_registry,
38 "Collection getter registry tool");
39}
40
41
46{
47 // If a label was provided, add ourselves to the registry.
48 if (!m_label.empty()) {
49 CHECK( m_registry.retrieve() );
50 CHECK( m_registry->add (m_label, this) );
51 }
52 else {
53 m_registry.disable();
54 }
55 return ObjGetterToolImpl::initialize();
57
58
67const void*
69{
70 // Configure the converter.
71 if (!this->m_converter.isValid() ||
72 this->m_converter.dstTypeinfo() != ti)
73 {
74 if (this->configureElementTypeinfo(ti).isFailure())
75 return 0;
76 }
77
78 // Get the next object. If the conversion fails, loop until we get
79 // a good one.
80 while (true) {
81 const void* p = this->nextUntyped();
82 if (!p) return 0;
83 const void* pconv = this->m_converter.convertUntyped (p);
84 if (pconv) return pconv;
85 this->releaseElementUntyped (p);
86 REPORT_MESSAGE (MSG::WARNING)
87 << "Pointer conversion from " << m_converter.srcName() << " to "
88 << m_converter.dstName() << "failed.";
89 }
90}
92
103void
105 const std::type_info& ti)
106{
107 if (!p)
108 return;
109
110 // Configure the converter if needed.
111 if (!this->m_backConverter.isValid() ||
112 this->m_backConverter.srcTypeinfo() != ti)
113 {
114 if (this->m_backConverter.init (ti, this->typeinfo()).isFailure()) {
115 REPORT_MESSAGE (MSG::WARNING)
116 << "Can't configure pointer conversion from "
117 << System::typeinfoName (ti) << " to "
118 << System::typeinfoName (this->typeinfo());
119 return;
120 }
121 }
122
123 // Convert to the desired type.
124 p = this->m_backConverter.convertUntyped (p);
125
126 // Release.
127 if (p)
128 this->releaseElementUntyped (p);
129 else {
130 REPORT_MESSAGE (MSG::WARNING)
131 << "Pointer conversion from " << m_backConverter.srcName() << " to "
132 << m_backConverter.dstName() << "failed.";
133 }
134}
135
136
145StatusCode
147 (const std::type_info& ti)
148{
149 return this->m_converter.init(this->elementTypeinfo(), ti);
150}
151
152
153} // namespace D3PD
Non-template parts of CollectionGetterTool.
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE(LVL)
Report a message.
#define CHECK(...)
Evaluate an expression and check for errors.
Abstract interface to keep a registry of collection getter tools.
const void * nextTypeinfo(const std::type_info &ti)
Return the next object cast to a different pointer type.
TypeConverter m_converter
Helper to convert pointers.
StatusCode initialize()
Standard Gaudi initialize method.
std::string m_label
Property: label to assign to this getter (or null).
void releaseElementTypeinfo(const void *p, const std::type_info &ti)
Release an element retrieved from the getter.
StatusCode configureElementTypeinfo(const std::type_info &ti)
Test type compatibility.
ToolHandle< ICollectionGetterRegistryTool > m_registry
The collection getter registry tool.
TypeConverter m_backConverter
Helper to convert pointers back, for releaseElement.
CollectionGetterToolImpl(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
Block filler tool for noisy FEB information.