File indexing completed on 2026-09-18 08:41:41
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include <any>
0012 #include <cassert>
0013 #include <memory>
0014 #include <vector>
0015
0016 namespace Acts::detail {
0017
0018
0019
0020
0021
0022 class DynamicColumnBase {
0023 public:
0024 virtual ~DynamicColumnBase() = default;
0025
0026
0027
0028
0029 virtual std::any get(std::size_t i) = 0;
0030
0031
0032
0033
0034 virtual std::any get(std::size_t i) const = 0;
0035
0036
0037 virtual void add() = 0;
0038
0039
0040 virtual void clear() = 0;
0041
0042
0043
0044 virtual void reserve(std::size_t size) = 0;
0045
0046
0047
0048 virtual void resize(std::size_t size) = 0;
0049
0050
0051
0052 virtual void erase(std::size_t i) = 0;
0053
0054
0055
0056 virtual std::size_t size() const = 0;
0057
0058
0059
0060
0061
0062
0063
0064 virtual void copyFrom(std::size_t dstIdx, const DynamicColumnBase& src,
0065 std::size_t srcIdx) = 0;
0066
0067
0068
0069
0070
0071 virtual void copyFrom(std::size_t dstIdx, const std::any& srcPtr) = 0;
0072
0073
0074
0075
0076
0077 virtual std::unique_ptr<DynamicColumnBase> clone(
0078 bool empty = false) const = 0;
0079 };
0080
0081
0082
0083
0084
0085 template <typename T>
0086 class DynamicColumn : public DynamicColumnBase {
0087 public:
0088
0089 std::any get(std::size_t i) override {
0090 assert(i < m_vector.size() && "DynamicColumn out of bounds");
0091 return &m_vector[i];
0092 }
0093
0094
0095 std::any get(std::size_t i) const override {
0096 assert(i < m_vector.size() && "DynamicColumn out of bounds");
0097 return &m_vector[i];
0098 }
0099
0100
0101 void add() override { m_vector.emplace_back(); }
0102
0103
0104 void clear() override { m_vector.clear(); }
0105
0106
0107 void resize(std::size_t size) override { m_vector.resize(size); }
0108
0109
0110 void reserve(std::size_t size) override { m_vector.reserve(size); }
0111
0112
0113 void erase(std::size_t i) override { m_vector.erase(m_vector.begin() + i); }
0114
0115
0116 std::size_t size() const override { return m_vector.size(); }
0117
0118
0119 std::unique_ptr<DynamicColumnBase> clone(bool empty) const override {
0120 if (empty) {
0121 return std::make_unique<DynamicColumn<T>>();
0122 }
0123 return std::make_unique<DynamicColumn<T>>(*this);
0124 }
0125
0126
0127 void copyFrom(std::size_t dstIdx, const DynamicColumnBase& src,
0128 std::size_t srcIdx) override {
0129 const auto* other = dynamic_cast<const DynamicColumn<T>*>(&src);
0130 assert(other != nullptr &&
0131 "Source column is not of same type as destination");
0132 m_vector.at(dstIdx) = other->m_vector.at(srcIdx);
0133 }
0134
0135
0136 void copyFrom(std::size_t dstIdx, const std::any& srcPtr) override {
0137 const auto* other = std::any_cast<const T*>(srcPtr);
0138 assert(other != nullptr &&
0139 "Source column is not of same type as destination");
0140 m_vector.at(dstIdx) = *other;
0141 }
0142
0143 private:
0144 std::vector<T> m_vector;
0145 };
0146
0147
0148
0149 template <>
0150 class DynamicColumn<bool> : public DynamicColumnBase {
0151 public:
0152
0153 std::any get(std::size_t i) override {
0154 assert(i < m_vector.size() && "DynamicColumn out of bounds");
0155 return &m_vector[i].value;
0156 }
0157
0158
0159 std::any get(std::size_t i) const override {
0160 assert(i < m_vector.size() && "DynamicColumn out of bounds");
0161 return &m_vector[i].value;
0162 }
0163
0164
0165 void add() override { m_vector.emplace_back(); }
0166
0167
0168 void reserve(std::size_t size) override { m_vector.reserve(size); }
0169
0170
0171 void resize(std::size_t size) override { m_vector.resize(size); }
0172
0173
0174 void clear() override { m_vector.clear(); }
0175
0176
0177 void erase(std::size_t i) override { m_vector.erase(m_vector.begin() + i); }
0178
0179
0180 std::size_t size() const override { return m_vector.size(); }
0181
0182
0183 std::unique_ptr<DynamicColumnBase> clone(bool empty) const override {
0184 if (empty) {
0185 return std::make_unique<DynamicColumn<bool>>();
0186 }
0187 return std::make_unique<DynamicColumn<bool>>(*this);
0188 }
0189
0190
0191 void copyFrom(std::size_t dstIdx, const DynamicColumnBase& src,
0192 std::size_t srcIdx) override {
0193 const auto* other = dynamic_cast<const DynamicColumn<bool>*>(&src);
0194 assert(other != nullptr &&
0195 "Source column is not of same type as destination");
0196 m_vector.at(dstIdx) = other->m_vector.at(srcIdx);
0197 }
0198
0199
0200 void copyFrom(std::size_t dstIdx, const std::any& srcPtr) override {
0201 const auto* other = std::any_cast<const bool*>(srcPtr);
0202 assert(other != nullptr &&
0203 "Source column is not of same type as destination");
0204 m_vector.at(dstIdx).value = *other;
0205 }
0206
0207 private:
0208
0209 struct Wrapper {
0210 bool value{false};
0211 };
0212 std::vector<Wrapper> m_vector;
0213 };
0214
0215 }