ATLAS Offline Software
ColumnAccessorArray.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/ColumnAccessorDataArray.h>
9 
10 namespace columnar
11 {
12  // the external mode specialization for native types
13  template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM>
14  requires (CI::regularColumnAccessorArray && ColumnTypeTraits<CT,ColumnarModeArray>::isNativeType)
15  class AccessorTemplate<CI,CT,CAM,ColumnarModeArray> final
16  {
17  /// Common Public Members
18  /// =====================
19  public:
20 
21  static_assert (!std::is_const_v<CT>, "CT must not be const");
22 
23  using CM = ColumnarModeArray;
24  using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeArray>::ColumnType>;
25 
26  AccessorTemplate () noexcept = default;
27 
28  AccessorTemplate (ColumnarTool<CM>& columnBase,
29  const std::string& name, ColumnInfo&& info = {})
30  {
31  ColumnTypeTraits<CT,ColumnarModeArray>::updateColumnInfo (columnBase, info);
32  info.offsetName = columnBase.containerStoreName (CI::idName);
33  m_accessorData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_accessorData, &typeid (typename ColumnTypeTraits<CT,CM>::ColumnType), CAM);
34  columnBase.addColumn (columnBase.containerStoreName(CI::idName) + "." + name, m_accessorData.get(), std::move (info));
35  }
36 
37  AccessorTemplate (AccessorTemplate&& that)
38  {
39  moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
40  }
41 
42  AccessorTemplate& operator = (AccessorTemplate&& that)
43  {
44  if (this != &that)
45  moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
46  return *this;
47  }
48 
49  AccessorTemplate (const AccessorTemplate&) = delete;
50  AccessorTemplate& operator = (const AccessorTemplate&) = delete;
51 
52  void reset (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
53  {
54  *this = AccessorTemplate (columnBase, name, std::move (info));
55  }
56 
57  [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const noexcept
58  {
59  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
60  return data[id.getIndex()];
61  }
62 
63  [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const noexcept
64  {
65  auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
66  return std::span<ColumnType> (data+range.beginIndex(), range.endIndex()-range.beginIndex());
67  }
68 
69  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
70  {
71  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
72  return data != nullptr;
73  }
74 
75  [[nodiscard]] bool isAvailable (const ObjectRange<CI,CM>& range) const noexcept
76  {
77  auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
78  return data != nullptr;
79  }
80 
81  [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
82  {
83  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
84  if (data != nullptr)
85  return data[id.getIndex()];
86  else
87  return std::nullopt;
88  }
89 
90  /// Private Members
91  /// ===============
92  private:
93 
94  unsigned m_dataIndex = 0u;
95  std::unique_ptr<ColumnAccessorDataArray> m_accessorData;
96  };
97 }