8 #ifndef COLUMNAR_VARIANT_VARIANT_LINK_COLUMN_H
9 #define COLUMNAR_VARIANT_VARIANT_LINK_COLUMN_H
56 if (m_link->isValid())
68 return m_link->isValid();
74 return m_link->isValid();
88 template<ContainerIdConcept CI2>
91 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
92 static_assert (variantIndex < CI::numVariants,
"invalid container id");
93 return m_link->isValid() &&
dynamic_cast<typename CI2::xAODObjectRangeType*
>(m_link->getStorableObjectPointer());
97 template<ContainerIdConcept CI2>
100 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
101 static_assert (variantIndex < CI::numVariants,
"invalid container id");
102 return m_link->isValid() && (**m_link) == &
id.getXAODObject();
112 return m_link ==
obj.m_link;
116 template<ContainerIdConcept CI2>
119 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
120 static_assert (variantIndex < CI::numVariants,
"invalid container id");
121 if (m_link->isValid())
134 template<
typename... CIList>
137 return str <<
obj.getXAODObject() <<
"/" <<
obj.getXAODObject()->type();
172 : m_link (val_link), m_keys (val_keys),
m_data (val_data)
177 throw std::logic_error (
"can't call xAOD function in columnar mode");
195 if (m_link == CM::invalidLinkValue)
197 const auto key = getLinkKey();
198 for (
unsigned i = 0;
i < CI::numVariants; ++
i)
200 if (m_keys[
i] ==
key)
206 throw std::runtime_error (
"link key does not match any known container: " +
std::to_string(
key));
214 template<ContainerIdConcept CI2>
217 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
218 static_assert (variantIndex < CI::numVariants,
"invalid container id");
219 return getLinkKey() == m_keys[variantIndex];
223 template<ContainerIdConcept CI2>
226 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
227 static_assert (variantIndex < CI::numVariants,
"invalid container id");
228 return getLinkIndex() ==
id.getIndex() && getLinkKey() == m_keys[variantIndex];
238 if (m_keys ==
obj.m_keys)
239 return m_link ==
obj.m_link;
240 if (getLinkIndex() !=
obj.getLinkIndex())
242 const auto thisKey = getLinkKey();
243 const auto thatKey =
obj.getLinkKey();
244 for (
unsigned i = 0;
i < CI::numVariants; ++
i)
246 if (m_keys[
i] == thisKey)
248 if (
obj.m_keys[
i] == thatKey)
252 }
else if (
obj.m_keys[
i] == thatKey)
259 template<ContainerIdConcept CI2>
262 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
263 static_assert (variantIndex < CI::numVariants,
"invalid container id");
264 if (getLinkKey() == m_keys[variantIndex])
272 return CM::getLinkIndex (m_link);
277 return CM::getLinkKey (m_link);
288 template<
typename... CIList>
291 return str <<
obj.getLinkKey() <<
"/" <<
obj.getLinkIndex();
306 static constexpr
std::array containerIdNames = {CIList::idName...};
312 std::string dataName = columnBase.containerStoreName (CI::idName) +
"." +
name;
313 std::string keysName = columnBase.containerStoreName (CI::idName) +
"." +
name +
".keys";
315 auto dataInfo =
info;
316 dataInfo.offsetName = columnBase.containerStoreName (CI::idName);
317 dataInfo.variantLinkKeyColumn = keysName;
318 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
319 for (
unsigned i = 0;
i < VariantCI::numVariants; ++
i)
320 dataInfo.linkTargetNames.push_back (columnBase.containerStoreName (containerIdNames[
i]));
322 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
325 columnBase.addColumn (dataName,
m_dataData.get(), std::move (dataInfo));
326 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
327 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
333 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
341 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
359 unsigned m_keysIndex = 0
u;
375 static constexpr
std::array containerIdNames = {CIList::idName...};
381 std::string offsetName = columnBase.containerStoreName (CI::idName) +
"." +
name +
".offset";
382 std::string dataName = columnBase.containerStoreName (CI::idName) +
"." +
name +
".data";
383 std::string keysName = columnBase.containerStoreName (CI::idName) +
"." +
name +
".keys";
385 auto offsetInfo =
info;
386 offsetInfo.offsetName = columnBase.containerStoreName (CI::idName);
387 offsetInfo.isOffset =
true;
388 auto dataInfo =
info;
389 dataInfo.offsetName = offsetName;
390 dataInfo.variantLinkKeyColumn = keysName;
391 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
392 for (
unsigned i = 0;
i < VariantCI::numVariants; ++
i)
393 dataInfo.linkTargetNames.push_back (columnBase.containerStoreName (containerIdNames[
i]));
395 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
398 columnBase.addColumn (offsetName,
m_offsetData.get(), std::move (offsetInfo));
400 columnBase.addColumn (dataName,
m_dataData.get(), std::move (dataInfo));
401 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
402 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
409 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
418 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
439 unsigned m_keysIndex = 0
u;