ATLAS Offline Software
Loading...
Searching...
No Matches
ColumnAccessor.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8#ifndef COLUMNAR_CORE_COLUMN_ACCESSOR_H
9#define COLUMNAR_CORE_COLUMN_ACCESSOR_H
10
19#include <span>
20#include <type_traits>
21
22namespace columnar
23{
24 template<ColumnAccessMode CAM> struct ColumnAccessModeTraits;
25
27 {
28 template<typename T> using XAODAccessor = SG::ConstAccessor<T>;
29 template<typename T> using ColumnType = const T;
30 };
31
33 {
34 template<typename T> using XAODAccessor = SG::Decorator<T>;
35 template<typename T> using ColumnType = T;
36 };
37
39 {
40 template<typename T> using XAODAccessor = SG::Accessor<T>;
41 template<typename T> using ColumnType = T;
42 };
43
44
45
81 template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM,typename CM> class AccessorTemplate;
82
83
94 template<typename CT,typename CM>
95 struct ColumnTypeTraits final
96 {
97 static constexpr bool isNativeType = false;
98 static constexpr bool useConvertInput = false;
99 static constexpr bool useConvertWithDataInput = false;
100 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
101 };
102
103 template<typename CT,typename CM>
104 requires ((std::is_integral_v<CT> || std::is_floating_point_v<CT>) && !std::is_same_v<CT,bool>)
106 {
107 using ColumnType = CT;
108 static constexpr bool isNativeType = true;
109 static constexpr bool useConvertInput = false;
110 static constexpr bool useConvertWithDataInput = false;
111 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
112 };
113
120 template<typename CT> struct NativeColumn final {};
121 template<typename CT,typename CM>
122 struct ColumnTypeTraits<NativeColumn<CT>,CM> final
123 {
124 using ColumnType = CT;
125 static constexpr bool isNativeType = true;
126 static constexpr bool useConvertInput = false;
127 static constexpr bool useConvertWithDataInput = false;
128 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
129 };
130
131
137 template<typename UT,typename CT> struct RetypeColumn final
138 {
139 static_assert (!std::is_const_v<CT>, "CT must not be const");
140 static_assert (!std::is_const_v<UT>, "UT must not be const");
141 };
142
143 template<typename UT,typename CT,typename CM>
144 struct ColumnTypeTraits<RetypeColumn<UT,CT>,CM> final
145 {
146 using ColumnType = CT;
147 using UserType = UT;
148 static constexpr bool isNativeType = false;
149 static constexpr bool useConvertInput = true;
150 static constexpr bool useConvertWithDataInput = false;
151 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnBase*/, ColumnInfo& info) {return info;}
152 static UT convertInput (const CT& value) {return UT (value);}
153 };
154
155
156
157 // the accessor specialization for type conversions
158 template<ContainerIdConcept CI,typename CT,typename CM>
160 class AccessorTemplate<CI,CT,ColumnAccessMode::input,CM> final
161 {
162 public:
163
164 using ColumnType = typename ColumnTypeTraits<CT,CM>::ColumnType;
165 using UserType = typename ColumnTypeTraits<CT,CM>::UserType;
166
167 AccessorTemplate () = default;
168
169 AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
170 : m_base (columnBase, name, std::move (ColumnTypeTraits<CT,CM>::updateColumnInfo(columnBase, info)))
171 {}
172
173 [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const noexcept
174 {
176 return ColumnTypeTraits<CT,CM>::convertInput (id.getData(), m_base(id));
177 else
178 return ColumnTypeTraits<CT,CM>::convertInput (m_base(id));
179 }
180
181 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
182 {
183 return m_base.isAvailable (id);
184 }
185
186 [[nodiscard]] std::optional<UserType> getOptional (ObjectId<CI,CM> id) const
187 {
188 if (m_base.isAvailable (id))
189 return operator()(id);
190 else
191 return std::nullopt;
192 }
193
194 private:
196 };
197
198
199
200 // the accessor specialization for type conversions
201 template<ContainerIdConcept CI,typename CT,typename CM>
202 requires (CI::regularObjectId && ColumnTypeTraits<CT,CM>::useConvertOutput)
204 {
205 public:
206
207 using ColumnType = typename ColumnTypeTraits<CT,CM>::ColumnType;
208 using UserType = typename ColumnTypeTraits<CT,CM>::UserType;
209
210 AccessorTemplate () = default;
211
212 AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
213 : m_base (columnBase, name, std::move (ColumnTypeTraits<CT,CM>::updateColumnInfo(columnBase, info)))
214 {}
215
216 template<typename T>
217 requires requires(T value) {ColumnTypeTraits<CT,CM>::convertOutput (value);}
218 void set (ObjectId<CI,CM> id, T&& value) const noexcept
219 {
220 m_base(id) = ColumnTypeTraits<CT,CM>::convertOutput (std::forward<T>(value));
221 }
222
223 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
224 {
225 return m_base.isAvailable (id);
226 }
227
228 [[nodiscard]] std::optional<UserType> getOptional (ObjectId<CI,CM> id) const
229 {
230 if (m_base.isAvailable (id))
231 return operator()(id);
232 else
233 return std::nullopt;
234 }
235
236 private:
238 };
239
240
241
242
250
251 template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM,typename CM>
252 void resetAccessor (AccessorTemplate<CI,CT,CAM,CM>& accessor, ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
253 {
254 accessor = AccessorTemplate<CI,CT,CAM,CM> (columnBase, name, std::move (info));
255 }
256
257
258
259
260
261 template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnAccessor = AccessorTemplate<CI,CT,ColumnAccessMode::input,CM>;
262 template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnDecorator = AccessorTemplate<CI,CT,ColumnAccessMode::output,CM>;
263 template<ContainerIdConcept CI,typename CT,typename CM=ColumnarModeDefault> using ColumnUpdater = AccessorTemplate<CI,CT,ColumnAccessMode::update,CM>;
264}
265
266#include "ColumnAccessorXAOD.icc"
268
269#endif
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Definition Decorator.h:59
the raw column accessor template class
the base class for all columnar components
a class representing a single object (electron, muons, etc.)
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition bitmask.h:232
bool isAvailable(const T_Aux &cont, SG::auxid_t auxid)
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
unsigned long long T
AccessorTemplate< CI, CT, ColumnAccessMode::input, CM > ColumnAccessor
void resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
reset a column accessor to point to a new column
AccessorTemplate< CI, CT, ColumnAccessMode::output, CM > ColumnDecorator
ColumnAccessMode
an enum for the different access modes for a column
Definition ColumnInfo.h:19
@ update
an updateable column
Definition ColumnInfo.h:27
@ output
an output column
Definition ColumnInfo.h:24
@ input
an input column
Definition ColumnInfo.h:21
AccessorTemplate< CI, CT, ColumnAccessMode::update, CM > ColumnUpdater
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition ColumnInfo.h:35
static constexpr bool useConvertWithDataInput
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
a trait class to provide information about the column type
static constexpr bool isNativeType
static constexpr bool useConvertWithDataInput
static constexpr bool useConvertInput
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
a type wrapper to force AccessorTemplate to treat the type as native
a type wrapper to make AccessorTemplate convert the underlying column type to a different type