Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ObjectColumnArray.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /// @author Nils Krumnack
6 
7 
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>
13 #include <cassert>
14 
15 namespace columnar
16 {
17  template<ContainerId CI>
18  class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeArray> final
19  {
20  /// Common Public Members
21  /// =====================
22  public:
23 
24  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
25 
26  using CM = ColumnarModeArray;
27 
28  AccessorTemplate (ColumnarTool<CM>& columnBase,
29  const std::string& name)
30  : m_columnBase (&columnBase),
31  m_name (name)
32  {
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});
38  }
39 
40  AccessorTemplate (AccessorTemplate&& that)
41  {
42  moveAccessor (m_offsetsIndex, m_offsetsData, that.m_offsetsIndex, that.m_offsetsData);
43  }
44 
45  AccessorTemplate& operator = (AccessorTemplate&& that)
46  {
47  if (this != &that)
48  moveAccessor (m_offsetsIndex, m_offsetsData, that.m_offsetsIndex, that.m_offsetsData);
49  return *this;
50  }
51 
52  AccessorTemplate (const AccessorTemplate&) = delete;
53  AccessorTemplate& operator = (const AccessorTemplate&) = delete;
54 
55  ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
56  requires (ContainerIdTraits<CI>::perEventRange)
57  {
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]);
60  }
61 
62  ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
63  requires (ContainerIdTraits<CI>::perEventRange)
64  {
65  auto *offsets = static_cast<const ColumnarOffsetType*>(eventRange.getData()[m_offsetsIndex]);
66  return ObjectRange<CI,CM> (eventRange.getData(), offsets[eventRange.beginIndex()], offsets[eventRange.endIndex()]);
67  }
68 
69  ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
70  requires (ContainerIdTraits<CI>::perEventId)
71  {
72  return ObjectId<CI,CM> (eventId.getData(), eventId.getIndex());
73  }
74 
75  ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
76  requires (ContainerIdTraits<CI>::perEventId)
77  {
78  return ObjectRange<CI,CM> (eventRange.getData(), eventRange.beginIndex(), eventRange.endIndex());
79  }
80 
81 
82 
83  /// Private Members
84  /// ===============
85  private:
86 
87  ColumnarTool<CM> *m_columnBase = nullptr;
88 
89  std::string m_name;
90  unsigned m_offsetsIndex = 0;
91  std::unique_ptr<ColumnAccessorDataArray> m_offsetsData;
92  };
93 }