2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 /// @author Nils Krumnack
8 #include <ColumnarCore/ColumnarTool.h>
9 #include <ColumnarCore/ColumnAccessorDataArray.h>
10 #include <ColumnarCore/ObjectId.h>
11 #include <ColumnarCore/ObjectRange.h>
12 #include <ColumnarCore/ContainerId.h>
17 template<ContainerId CI>
18 class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeArray> final
20 /// Common Public Members
21 /// =====================
24 static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
26 using CM = ColumnarModeArray;
28 AccessorTemplate (ColumnarTool<CM>& columnBase,
29 const std::string& name)
30 : m_columnBase (&columnBase),
33 columnBase.setContainerName (CI, name);
34 if constexpr (ContainerIdTraits<CI>::isMutable)
35 columnBase.setContainerName (ContainerIdTraits<CI>::constId, name);
36 m_offsetsData = std::make_unique<ColumnAccessorDataArray> (&m_offsetsIndex, &m_offsetsData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
37 columnBase.addColumn (name, m_offsetsData.get(), {.offsetName = (CI!=ContainerId::eventInfo ? numberOfEventsName : ""), .isOffset = true});
40 AccessorTemplate (AccessorTemplate&& that)
42 moveAccessor (m_offsetsIndex, m_offsetsData, that.m_offsetsIndex, that.m_offsetsData);
45 AccessorTemplate& operator = (AccessorTemplate&& that)
48 moveAccessor (m_offsetsIndex, m_offsetsData, that.m_offsetsIndex, that.m_offsetsData);
52 AccessorTemplate (const AccessorTemplate&) = delete;
53 AccessorTemplate& operator = (const AccessorTemplate&) = delete;
55 ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
56 requires (ContainerIdTraits<CI>::perEventRange)
58 auto *offsets = static_cast<const ColumnarOffsetType*>(eventId.getData()[m_offsetsIndex]);
59 return ObjectRange<CI,CM> (eventId.getData(), offsets[eventId.getIndex()], offsets[eventId.getIndex() + 1]);
62 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
63 requires (ContainerIdTraits<CI>::perEventRange)
65 auto *offsets = static_cast<const ColumnarOffsetType*>(eventRange.getData()[m_offsetsIndex]);
66 return ObjectRange<CI,CM> (eventRange.getData(), offsets[eventRange.beginIndex()], offsets[eventRange.endIndex()]);
69 ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
70 requires (ContainerIdTraits<CI>::perEventId)
72 return ObjectId<CI,CM> (eventId.getData(), eventId.getIndex());
75 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
76 requires (ContainerIdTraits<CI>::perEventId)
78 return ObjectRange<CI,CM> (eventRange.getData(), eventRange.beginIndex(), eventRange.endIndex());
87 ColumnarTool<CM> *m_columnBase = nullptr;
90 unsigned m_offsetsIndex = 0;
91 std::unique_ptr<ColumnAccessorDataArray> m_offsetsData;