ATLAS Offline Software
Loading...
Searching...
No Matches
ColumnAccessorXAOD.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/VectorConvertView.h>
9#include <AthContainers/DataVector.h>
10
11namespace columnar
12{
13 namespace detail
14 {
15 // the xAOD specialization for native types
16 template<typename CT,ColumnAccessMode CAM>
17 requires (MemoryAccessor<CT,ColumnarModeXAOD>::isDefined)
18 class ContainerFreeAccessor<CT,CAM,ColumnarModeXAOD> final
19 {
20 /// Common Public Members
21 /// =====================
22 public:
23
24 using CM = ColumnarModeXAOD;
25
26 static_assert (CAM == ColumnAccessMode::input || MemoryAccessor<CT,CM>::viewIsReference || MemoryAccessor<CT,CM>::hasSetter, "output access not supported for this type");
27
28 static constexpr bool isDefined = true;
29 static constexpr bool viewIsReference = MemoryAccessor<CT,ColumnarModeXAOD>::viewIsReference;
30 static constexpr bool allowRead = true;
31
32 static_assert (!std::is_const_v<CT>, "CT must not be const");
33
34 using ColumnValueType = typename MemoryAccessor<CT,ColumnarModeXAOD>::MemoryType;
35 using ColumnType = std::conditional_t<CAM==ColumnAccessMode::input,const ColumnValueType,ColumnValueType>;
36 using MemoryType = ColumnValueType;
37 using AccessorType = typename ColumnAccessModeTraits<CAM>::template XAODAccessor<ColumnValueType>;
38
39 ContainerFreeAccessor () = default;
40
41 ContainerFreeAccessor (ColumnarTool<CM>& /*columnBase*/, const std::string& name, ColumnAccessorOptions&& options)
42 : m_accessor(name)
43 {
44 if (options.addMTDependency)
45 throw std::runtime_error ("adding MT dependencies not yet supported for individual decorations");
46 if (!options.replacesColumn.empty())
47 m_accessor = options.replacesColumn;
48 }
49
50 ContainerFreeAccessor (ContainerFreeAccessor&& that)
51 : m_accessor (that.m_accessor)
52 {
53 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name();
54 }
55
56 ContainerFreeAccessor& operator = (ContainerFreeAccessor&& that)
57 {
58 if (this != &that)
59 {
60 m_accessor = that.m_accessor;
61 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name();
62 }
63 return *this;
64 }
65
66 ContainerFreeAccessor (const ContainerFreeAccessor&) = delete;
67 ContainerFreeAccessor& operator = (const ContainerFreeAccessor&) = delete;
68
69 [[nodiscard]] ColumnType& operator () (const SG::AuxElement& element) const
70 requires (viewIsReference && CAM != ColumnAccessMode::update)
71 {
72 return m_accessor(element);
73 }
74
75 [[nodiscard]] ColumnType& operator () (SG::AuxElement& element) const
76 requires (viewIsReference && CAM == ColumnAccessMode::update)
77 {
78 return m_accessor(element);
79 }
80
81 [[nodiscard]] auto operator () (const SG::AuxElement& element) const
82 requires (!viewIsReference && CAM == ColumnAccessMode::input)
83 {
84 void **dataPtr = nullptr;
85 return MemoryAccessor<CT,CM>::makeViewer(dataPtr)(m_accessor(element));
86 }
87
88 [[nodiscard]] static auto& makeView (auto&& value) noexcept
89 requires (viewIsReference)
90 {
91 return value;
92 }
93
94 [[nodiscard]] static auto makeView (auto&& value) noexcept
95 requires (!viewIsReference && CAM == ColumnAccessMode::input)
96 {
97 void **dataPtr = nullptr;
98 return MemoryAccessor<CT,CM>::makeViewer(dataPtr)(value);
99 }
100
101 [[nodiscard]] std::span<ColumnType> operator () (const DataVector<SG::AuxElement>& container) const
102 requires (viewIsReference)
103 {
104 if (container.empty())
105 return std::span<ColumnType> ();
106 return std::span<ColumnType> (&m_accessor (*container[0]), container.size());
107 }
108
109 [[nodiscard]] auto operator () (const DataVector<SG::AuxElement>& container) const
110 requires (!viewIsReference && CAM == ColumnAccessMode::input)
111 {
112 std::span<ColumnType> mySpan;
113 if (!container.empty())
114 mySpan = std::span<ColumnType> (&m_accessor (*container[0]), container.size());
115 void **dataPtr = nullptr;
116 return detail::VectorConvertView (MemoryAccessor<CT,CM>::make_viewer(dataPtr), std::span (mySpan));
117 }
118
119 template<typename T>
120 requires (!viewIsReference && CAM == ColumnAccessMode::output)
121 // requires (!viewIsReference && CAM == ColumnAccessMode::output && requires(MemoryType memory, T value) {MemoryAccessor<CT,CM>::makeSetter(nullptr)(memory, value);})
122 void set (const SG::AuxElement& element, T&& value) const
123 {
124 void **dataPtr = nullptr;
125 MemoryAccessor<CT,CM>::makeSetter(dataPtr)(m_accessor(element), std::forward<T>(value));
126 }
127
128 [[nodiscard]] bool isAvailable (const SG::AuxElement& element) const
129 {
130 return m_accessor.isAvailable (element);
131 }
132
133 /// Private Members
134 /// ===============
135 private:
136
137 AccessorType m_accessor {std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name()};
138 };
139 }
140
141
142
143 // the xAOD specialization for native types
144 template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM>
145 requires (detail::ContainerFreeAccessor<CT,CAM,ColumnarModeXAOD>::isDefined)
146 class AccessorTemplate<CI,CT,CAM,ColumnarModeXAOD> final
147 {
148 /// Common Public Members
149 /// =====================
150 public:
151
152 static_assert (!std::is_const_v<CT>, "CT must not be const");
153
154 using CM = ColumnarModeXAOD;
155
156 AccessorTemplate () = default;
157
158 AccessorTemplate (ColumnarTool<CM>& columnBase,
159 const std::string& name, ColumnAccessorOptions&& options = {})
160 : m_accessor(columnBase, name, std::move (options))
161 {}
162
163 AccessorTemplate (AccessorTemplate&&) = default;
164 AccessorTemplate& operator = (AccessorTemplate&&) = default;
165 AccessorTemplate (const AccessorTemplate&) = delete;
166 AccessorTemplate& operator = (const AccessorTemplate&) = delete;
167
168 [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const
169 {
170 return m_accessor(id.getXAODObjectNoexcept());
171 }
172
173 [[nodiscard]] decltype(auto) operator () (ObjectRange<CI,CM> range) const
174 {
175 return m_accessor(range.getXAODObjectNoexcept());
176 }
177
178 template<typename T>
179 requires requires(T value) {std::declval<detail::ContainerFreeAccessor<CT,CAM,CM>>().set (std::declval<SG::AuxElement>(), value);}
180 void set (ObjectId<CI,CM> id, T&& value) const noexcept
181 {
182 m_accessor.set (id.getXAODObjectNoexcept(), std::forward<T>(value));
183 }
184
185 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
186 {
187 return m_accessor.isAvailable (id.getXAODObjectNoexcept());
188 }
189
190 [[nodiscard]] auto getOptional (ObjectId<CI,CM> id) const
191 {
192 std::optional<std::decay_t<decltype(std::declval<detail::ContainerFreeAccessor<CT,CAM,CM>>()(std::declval<const SG::AuxElement>()))>> result;
193 if (m_accessor.isAvailable (id.getXAODObjectNoexcept()))
194 result = m_accessor (id.getXAODObjectNoexcept());
195 return result;
196 }
197
198 /// Private Members
199 /// ===============
200 private:
201
202 detail::ContainerFreeAccessor<CT,CAM,CM> m_accessor;
203 };
204}