Loading [MathJax]/jax/output/SVG/config.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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<ContainerId CI,typename CT,ColumnAccessMode CAM>
14  requires (ColumnTypeTraits<CT,ColumnarModeArray>::isNativeType)
15  class AccessorTemplate<CI,CT,CAM,ColumnarModeArray> final
16  {
17  /// Common Public Members
18  /// =====================
19  public:
20 
21  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
22  static_assert (!std::is_const_v<CT>, "CT must not be const");
23 
24  using CM = ColumnarModeArray;
25  using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeArray>::ColumnType>;
26 
27  AccessorTemplate () noexcept = default;
28 
29  AccessorTemplate (ColumnarTool<CM>& columnBase,
30  const std::string& name, ColumnInfo&& info = {})
31  {
32  ColumnTypeTraits<CT,ColumnarModeArray>::updateColumnInfo (columnBase, info);
33  info.offsetName = columnBase.objectName (CI);
34  m_accessorData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_accessorData, &typeid (typename ColumnTypeTraits<CT,CM>::ColumnType), CAM);
35  columnBase.addColumn (columnBase.objectName(CI) + "." + name, m_accessorData.get(), std::move (info));
36  }
37 
38  AccessorTemplate (AccessorTemplate&& that)
39  {
40  moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
41  }
42 
43  AccessorTemplate& operator = (AccessorTemplate&& that)
44  {
45  if (this != &that)
46  moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
47  return *this;
48  }
49 
50  AccessorTemplate (const AccessorTemplate&) = delete;
51  AccessorTemplate& operator = (const AccessorTemplate&) = delete;
52 
53  void reset (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
54  {
55  *this = AccessorTemplate (columnBase, name, std::move (info));
56  }
57 
58  [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const noexcept
59  {
60  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
61  return data[id.getIndex()];
62  }
63 
64  [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const noexcept
65  {
66  auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
67  return std::span<ColumnType> (data+range.beginIndex(), range.endIndex()-range.beginIndex());
68  }
69 
70  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
71  {
72  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
73  return data != nullptr;
74  }
75 
76  [[nodiscard]] bool isAvailable (ObjectRange<CI,CM> range) const noexcept
77  {
78  auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
79  return data != nullptr;
80  }
81 
82  [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
83  {
84  auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
85  if (data != nullptr)
86  return data[id.getIndex()];
87  else
88  return std::nullopt;
89  }
90 
91  /// Private Members
92  /// ===============
93  private:
94 
95  unsigned m_dataIndex = 0u;
96  std::unique_ptr<ColumnAccessorDataArray> m_accessorData;
97  };
98 }