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();
152 static constexpr
bool useConvertOutput =
true;
157 template<ContainerIdConcept CI2>
161 auto* container =
static_cast<const typename CIBase::xAODElementLinkType*
>(
obj.getXAODObjectNoexcept().container());
180 : m_link (val_link), m_keys (val_keys),
m_data (val_data)
185 throw std::logic_error (
"can't call xAOD function in columnar mode");
203 if (m_link == CM::invalidLinkValue)
205 const auto key = getLinkKey();
206 for (
unsigned i = 0;
i < CI::numVariants; ++
i)
208 if (m_keys[
i] ==
key)
214 throw std::runtime_error (
"link key does not match any known container: " +
std::to_string(
key));
222 template<ContainerIdConcept CI2>
225 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
226 static_assert (variantIndex < CI::numVariants,
"invalid container id");
227 return getLinkKey() == m_keys[variantIndex];
231 template<ContainerIdConcept CI2>
234 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
235 static_assert (variantIndex < CI::numVariants,
"invalid container id");
236 return getLinkIndex() ==
id.getIndex() && getLinkKey() == m_keys[variantIndex];
246 if (m_keys ==
obj.m_keys)
247 return m_link ==
obj.m_link;
248 if (getLinkIndex() !=
obj.getLinkIndex())
250 const auto thisKey = getLinkKey();
251 const auto thatKey =
obj.getLinkKey();
252 for (
unsigned i = 0;
i < CI::numVariants; ++
i)
254 if (m_keys[
i] == thisKey)
256 if (
obj.m_keys[
i] == thatKey)
260 }
else if (
obj.m_keys[
i] == thatKey)
267 template<ContainerIdConcept CI2>
270 static constexpr
unsigned variantIndex =
CI::template getVariantIndex<CI2>();
271 static_assert (variantIndex < CI::numVariants,
"invalid container id");
272 if (getLinkKey() == m_keys[variantIndex])
280 return CM::getLinkIndex (m_link);
285 return CM::getLinkKey (m_link);
296 template<
typename... CIList>
299 return str <<
obj.getLinkKey() <<
"/" <<
obj.getLinkIndex();
315 static constexpr
std::array containerIdNames = {CIList::idName...};
321 std::string dataName = std::string (CI::idName) +
"." +
name;
322 std::string keysName = std::string (CI::idName) +
"." +
name +
".keys";
324 auto dataInfo =
info;
325 dataInfo.offsetName = CI::idName;
326 dataInfo.variantLinkKeyColumn = keysName;
327 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
328 for (
unsigned i = 0;
i < VariantCI::numVariants; ++
i)
329 dataInfo.linkTargetNames.emplace_back (containerIdNames[
i]);
332 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
335 columnBase.addColumn (dataName,
m_dataData.get(), std::move (dataInfo));
336 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
337 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
343 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
351 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
364 template<ContainerIdConcept CI2>
369 auto *
keys =
static_cast<const typename CM::LinkKeyType*
>(
id.getData()[m_keysIndex]);
373 [[nodiscard]]
bool isAvailable (ObjectId<CI,CM>
id)
const noexcept
376 return data !=
nullptr;
387 unsigned m_keysIndex = 0
u;
405 static constexpr
std::array containerIdNames = {CIList::idName...};
411 std::string offsetName = std::string (CI::idName) +
"." +
name +
".offset";
412 std::string dataName = std::string (CI::idName) +
"." +
name +
".data";
413 std::string keysName = std::string (CI::idName) +
"." +
name +
".keys";
415 auto offsetInfo =
info;
416 offsetInfo.offsetName = CI::idName;
417 offsetInfo.isOffset =
true;
418 auto dataInfo =
info;
419 dataInfo.offsetName = offsetName;
420 dataInfo.variantLinkKeyColumn = keysName;
421 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
422 for (
unsigned i = 0;
i < VariantCI::numVariants; ++
i)
423 dataInfo.linkTargetNames.emplace_back (containerIdNames[
i]);
425 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
428 columnBase.addColumn (offsetName,
m_offsetData.get(), std::move (offsetInfo));
430 columnBase.addColumn (dataName,
m_dataData.get(), std::move (dataInfo));
431 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
432 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
439 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
448 moveAccessor (m_keysIndex, m_keysData, that.m_keysIndex, that.m_keysData);
469 unsigned m_keysIndex = 0
u;
485 return value.opt_value();