ATLAS Offline Software
Loading...
Searching...
No Matches
VectorColumn.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_VECTOR_COLUMN_H
9#define COLUMNAR_CORE_VECTOR_COLUMN_H
10
13#include <span>
14#include <vector>
15
16namespace columnar
17{
28
29
30
31 // in xAOD mode we can do a straightforward conversion from
32 // std::vector to std::span, as xAODs natively use std::vector
33 template<typename CT>
35 struct ColumnTypeTraits<std::vector<CT>,ColumnarModeXAOD> final
36 {
40 using UserType = std::span<const ElementType>;
41 static constexpr bool isNativeType = false;
42 static constexpr bool useConvertInput = true;
43 static constexpr bool useConvertWithDataInput = false;
44 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnarTool*/, ColumnInfo& info) {return info;}
45 static std::span<const ElementType> convertInput (const std::vector<ElementType>& value) {return std::span<const ElementType> (value);}
46 };
47
48
49
50 // in xAOD array mode we can do a straightforward conversion from
51 // std::vector to std::span, as xAODs natively use std::vector
52 template<typename CT>
54 struct ColumnTypeTraits<std::vector<CT>,ColumnarModeXAODArray> final
55 {
59 using UserType = std::span<const ElementType>;
60 static constexpr bool isNativeType = false;
61 static constexpr bool useConvertInput = true;
62 static constexpr bool useConvertWithDataInput = false;
63 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnarTool*/, ColumnInfo& info) {return info;}
64 static std::span<const ElementType> convertInput (const std::vector<ElementType>& value) {return std::span<const ElementType> (value);}
65 };
66
67
68
69
70 // the column accessor for std::vector in ColumnarModeArray
71 //
72 // This is one of the more tricky accessors, as it need to connect to
73 // two underlying columns. The first column is the offset column, the
74 // second is the data column.
75 template<RegularContainerIdConcept CI,typename CT>
78 {
81 public:
82
86
87 AccessorTemplate () = default;
88
89 AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
90 {
91 auto myinfo = info;
92 myinfo.offsetName = CI::idName;
93 myinfo.isOffset = true;
94 info.offsetName = std::string (CI::idName) + "." + name + ".offset";
95 m_offsetData = std::make_unique<ColumnAccessorDataArray> (&m_offsetIndex, &m_offsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
96 columnarTool.addColumn (info.offsetName, m_offsetData.get(), std::move (myinfo));
97 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &typeid (ElementType), ColumnAccessMode::input);
98 columnarTool.addColumn (std::string (CI::idName) + "." + name + ".data", m_dataData.get(), std::move (info));
99 }
100
102 {
103 moveAccessor (m_offsetIndex, m_offsetData, that.m_offsetIndex, that.m_offsetData);
104 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
105 }
106
108 {
109 if (this != &that)
110 {
111 moveAccessor (m_offsetIndex, m_offsetData, that.m_offsetIndex, that.m_offsetData);
112 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
113 }
114 return *this;
115 }
116
117 std::span<const ElementType> operator () (ObjectId<CI,CM> id) const noexcept
118 {
119 auto *offset = static_cast<const ColumnarOffsetType*>(id.getData()[m_offsetIndex]);
120 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
121 return std::span<const ElementType> (&data[offset[id.getIndex()]], offset[id.getIndex()+1]-offset[id.getIndex()]);
122 }
123
124 bool isAvailable (ObjectId<CI,CM> id) const noexcept
125 {
126 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
127 return data != nullptr;
128 }
129
132 private:
133
134 unsigned m_offsetIndex = 0u;
135 std::unique_ptr<ColumnAccessorDataArray> m_offsetData;
136 unsigned m_dataIndex = 0u;
137 std::unique_ptr<ColumnAccessorDataArray> m_dataData;
138 };
139
140
150 template<ContainerIdConcept CI,typename CT,typename CM>
152 class AccessorTemplate<CI,std::vector<CT>,ColumnAccessMode::input,CM> final
153 {
156 public:
157
158 AccessorTemplate () = default;
159
160 AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
161 : m_accessor(columnarTool,name,std::move(ColumnTypeTraits<CT,CM>::updateColumnInfo(columnarTool, info)))
162 {
163 }
164
165 auto operator () (ObjectId<CI,CM> id) const
166 {
168 return detail::VectorConvertView ([data = id.getData()](const auto& value) {return ColumnTypeTraits<CT,CM>::convertInput (data, value);}, m_accessor(id));
169 else
170 return detail::VectorConvertView ([](const auto& value) {return ColumnTypeTraits<CT,CM>::convertInput(value);}, m_accessor(id));
171 }
172
173 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
174 {
175 return m_accessor.isAvailable (id);
176 }
177
180
181 private:
182
184 };
185}
186
187#endif
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
AccessorTemplate(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
ColumnAccessor< CI, std::vector< typename ColumnTypeTraits< CT, CM >::ColumnType >, CM > m_accessor
AccessorTemplate(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
the base class for all columnar components
a class representing a single object (electron, muons, etc.)
a range view that does converts members using a passed in function
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType > >
AccessorTemplate< CI, CT, ColumnAccessMode::input, CM > ColumnAccessor
void moveAccessor(unsigned &dataIndex, std::unique_ptr< ColumnAccessorDataArray > &accessorData, unsigned &sourceIndex, std::unique_ptr< ColumnAccessorDataArray > &sourceData)
ColumnAccessMode
an enum for the different access modes for a column
Definition ColumnInfo.h:19
@ input
an input column
Definition ColumnInfo.h:21
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
STL namespace.
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition ColumnInfo.h:35
static std::span< const ElementType > convertInput(const std::vector< ElementType > &value)
typename ColumnTypeTraits< CT, CM >::ColumnType ElementType
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
typename ColumnTypeTraits< CT, CM >::ColumnType ElementType
static std::span< const ElementType > convertInput(const std::vector< ElementType > &value)
NativeColumn< std::vector< ElementType > > ColumnType
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
a type wrapper to force AccessorTemplate to treat the type as native
std::map< std::string, HypoJetVector >::const_iterator CI