Skip to content

Commit 04ebfba

Browse files
authored
fix: Circumvent symbol visibility issues with templated final classes (#5547)
As discovered with #5536 there seems to be a general risk of using `template class final` which makes `dynamic_cast` fail across shared library boundaries. The easiest path to circumvent the problem right now appears to be dropping `final` from the class and making the functions final instead which results almost in the same behavior.
1 parent eef896d commit 04ebfba

7 files changed

Lines changed: 82 additions & 92 deletions

File tree

Core/include/Acts/EventData/AnyTrackProxy.hpp

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,14 @@
88

99
#pragma once
1010

11-
#include "Acts/Definitions/TrackParametrization.hpp"
1211
#include "Acts/EventData/ParticleHypothesis.hpp"
13-
#include "Acts/EventData/TrackProxy.hpp"
1412
#include "Acts/EventData/TrackProxyCommon.hpp"
1513
#include "Acts/EventData/TrackProxyConcept.hpp"
1614
#include "Acts/EventData/Types.hpp"
1715
#include "Acts/Utilities/HashedString.hpp"
1816

1917
#include <any>
2018
#include <cassert>
21-
#include <cmath>
2219
#include <type_traits>
2320

2421
namespace Acts {
@@ -107,7 +104,7 @@ template <typename container_t,
107104
class TrackHandler;
108105

109106
template <typename container_t>
110-
class TrackHandler<container_t, true> final : public TrackHandlerConstBase {
107+
class TrackHandler<container_t, true> /*final*/ : public TrackHandlerConstBase {
111108
using ContainerType = typename TrackHandlerTraits<container_t>::Container;
112109

113110
public:
@@ -118,55 +115,55 @@ class TrackHandler<container_t, true> final : public TrackHandlerConstBase {
118115
}
119116

120117
const Surface* referenceSurface(const void* container,
121-
TrackIndexType index) const override {
118+
TrackIndexType index) const final {
122119
assert(container != nullptr);
123120
const auto* tc = static_cast<const ContainerType*>(container);
124121
return &tc->getTrack(index).referenceSurface();
125122
}
126123

127124
bool hasReferenceSurface(const void* container,
128-
TrackIndexType index) const override {
125+
TrackIndexType index) const final {
129126
assert(container != nullptr);
130127
const auto* tc = static_cast<const ContainerType*>(container);
131128
return tc->getTrack(index).hasReferenceSurface();
132129
}
133130

134131
ParticleHypothesis particleHypothesis(const void* container,
135-
TrackIndexType index) const override {
132+
TrackIndexType index) const final {
136133
assert(container != nullptr);
137134
const auto* tc = static_cast<const ContainerType*>(container);
138135
return tc->getTrack(index).particleHypothesis();
139136
}
140137

141138
ConstParametersMap parameters(const void* container,
142-
TrackIndexType index) const override {
139+
TrackIndexType index) const final {
143140
assert(container != nullptr);
144141
const auto* tc = static_cast<const ContainerType*>(container);
145142
return tc->getTrack(index).parameters();
146143
}
147144

148145
ConstCovarianceMap covariance(const void* container,
149-
TrackIndexType index) const override {
146+
TrackIndexType index) const final {
150147
assert(container != nullptr);
151148
const auto* tc = static_cast<const ContainerType*>(container);
152149
return tc->getTrack(index).covariance();
153150
}
154151

155152
unsigned int nTrackStates(const void* container,
156-
TrackIndexType index) const override {
153+
TrackIndexType index) const final {
157154
assert(container != nullptr);
158155
const auto* tc = static_cast<const ContainerType*>(container);
159156
return tc->getTrack(index).nTrackStates();
160157
}
161158

162-
bool hasColumn(const void* container, HashedString key) const override {
159+
bool hasColumn(const void* container, HashedString key) const final {
163160
assert(container != nullptr);
164161
const auto* tc = static_cast<const ContainerType*>(container);
165162
return tc->hasColumn(key);
166163
}
167164

168165
std::any component(const void* container, TrackIndexType index,
169-
HashedString key) const override {
166+
HashedString key) const final {
170167
assert(container != nullptr);
171168
const auto* tc = static_cast<const ContainerType*>(container);
172169
return tc->container().component_impl(key, index);
@@ -177,7 +174,8 @@ class TrackHandler<container_t, true> final : public TrackHandlerConstBase {
177174
};
178175

179176
template <typename container_t>
180-
class TrackHandler<container_t, false> final : public TrackHandlerMutableBase {
177+
class TrackHandler<container_t,
178+
false> /*final*/ : public TrackHandlerMutableBase {
181179
using ContainerType = typename TrackHandlerTraits<container_t>::Container;
182180

183181
public:
@@ -188,76 +186,74 @@ class TrackHandler<container_t, false> final : public TrackHandlerMutableBase {
188186
}
189187

190188
const Surface* referenceSurface(const void* container,
191-
TrackIndexType index) const override {
189+
TrackIndexType index) const final {
192190
assert(container != nullptr);
193191
const auto* tc = static_cast<const ContainerType*>(container);
194192
return &tc->getTrack(index).referenceSurface();
195193
}
196194

197195
bool hasReferenceSurface(const void* container,
198-
TrackIndexType index) const override {
196+
TrackIndexType index) const final {
199197
assert(container != nullptr);
200198
const auto* tc = static_cast<const ContainerType*>(container);
201199
return tc->getTrack(index).hasReferenceSurface();
202200
}
203201

204202
ParticleHypothesis particleHypothesis(const void* container,
205-
TrackIndexType index) const override {
203+
TrackIndexType index) const final {
206204
assert(container != nullptr);
207205
const auto* tc = static_cast<const ContainerType*>(container);
208206
return tc->getTrack(index).particleHypothesis();
209207
}
210208

211209
ConstParametersMap parameters(const void* container,
212-
TrackIndexType index) const override {
210+
TrackIndexType index) const final {
213211
assert(container != nullptr);
214212
const auto* tc = static_cast<const ContainerType*>(container);
215213
return tc->getTrack(index).parameters();
216214
}
217215

218-
ParametersMap parameters(void* container,
219-
TrackIndexType index) const override {
216+
ParametersMap parameters(void* container, TrackIndexType index) const final {
220217
assert(container != nullptr);
221218
auto* tc = static_cast<ContainerType*>(container);
222219
return tc->getTrack(index).parameters();
223220
}
224221

225222
ConstCovarianceMap covariance(const void* container,
226-
TrackIndexType index) const override {
223+
TrackIndexType index) const final {
227224
assert(container != nullptr);
228225
const auto* tc = static_cast<const ContainerType*>(container);
229226
return tc->getTrack(index).covariance();
230227
}
231228

232-
CovarianceMap covariance(void* container,
233-
TrackIndexType index) const override {
229+
CovarianceMap covariance(void* container, TrackIndexType index) const final {
234230
assert(container != nullptr);
235231
auto* tc = static_cast<ContainerType*>(container);
236232
return tc->getTrack(index).covariance();
237233
}
238234

239235
unsigned int nTrackStates(const void* container,
240-
TrackIndexType index) const override {
236+
TrackIndexType index) const final {
241237
assert(container != nullptr);
242238
const auto* tc = static_cast<const ContainerType*>(container);
243239
return tc->getTrack(index).nTrackStates();
244240
}
245241

246-
bool hasColumn(const void* container, HashedString key) const override {
242+
bool hasColumn(const void* container, HashedString key) const final {
247243
assert(container != nullptr);
248244
const auto* tc = static_cast<const ContainerType*>(container);
249245
return tc->hasColumn(key);
250246
}
251247

252248
std::any component(const void* container, TrackIndexType index,
253-
HashedString key) const override {
249+
HashedString key) const final {
254250
assert(container != nullptr);
255251
const auto* tc = static_cast<const ContainerType*>(container);
256252
return tc->container().component_impl(key, index);
257253
}
258254

259255
std::any component(void* container, TrackIndexType index,
260-
HashedString key) const override {
256+
HashedString key) const final {
261257
assert(container != nullptr);
262258
auto* tc = static_cast<ContainerType*>(container);
263259
return tc->container().component_impl(key, index);

0 commit comments

Comments
 (0)