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