ATLAS Offline Software
ColumnVectorWrapper.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_TOOL_WRAPPER_COLUMN_VECTOR_WRAPPER_H
9 #define COLUMNAR_TOOL_WRAPPER_COLUMN_VECTOR_WRAPPER_H
10 
11 #include <span>
12 #include <string>
13 #include <typeinfo>
14 #include <vector>
15 
16 namespace columnar
17 {
18  struct ColumnInfo;
19  class IColumnarTool;
20 
21 
28 
30  {
42  std::string debugName;
43 
44 
46  const std::type_info *type = nullptr;
47 
48 
50  bool isOptional = true;
51 
52 
57  bool readOnly = true;
58 
59 
67  bool isOffset = false;
68 
69 
75  unsigned arraySize = 1u;
76 
77 
84  std::size_t offsetIndex = 0u;
85  };
86 
87 
88 
95 
97  {
100  public:
101 
103  static constexpr std::size_t nullIndex = 0u;
104 
106  static constexpr std::size_t sizeIndex = 1u;
107 
109  static constexpr std::size_t unsetIndex = static_cast<std::size_t>(-1);
110 
112  static constexpr std::size_t numFixedColumns = 2u;
113 
116 
117 
119  [[nodiscard]] std::size_t addColumn (const ColumnInfo& columnInfo);
120 
122  void setOffsetColumn (std::size_t columnIndex, std::size_t offsetIndex);
123 
124 
126  [[nodiscard]] std::size_t numColumns () const noexcept {
127  return m_elements.size(); }
128 
130  [[nodiscard]] const ColumnVectorElementHeader&
131  getColumn (std::size_t index) const {
132  return m_elements.at (index); }
133 
134 
136  void checkSelf () const;
137 
139  void checkData (std::span<const void*const> data) const;
140 
141 
144  private:
145 
147  std::vector<ColumnVectorElementHeader> m_elements;
148  };
149 
150 
151 
156 
158  {
161  public:
162 
164  explicit ColumnVectorData (const ColumnVectorHeader *val_header);
165 
166 
168  template<typename CT>
169  void setColumn (std::size_t columnIndex, std::size_t size, CT* dataPtr) {
170  auto voidPtr = reinterpret_cast<const void*>(const_cast<const CT*>(dataPtr));
171  setColumnVoid (columnIndex, size, voidPtr, typeid (std::decay_t<CT>), std::is_const_v<CT>);
172  }
173  void setColumnVoid (std::size_t columnIndex, std::size_t size, const void *dataPtr, const std::type_info& type, bool isConst);
174 
175 
177  template<typename CT>
178  [[nodiscard]] std::pair<std::size_t,CT*>
179  getColumn (std::size_t columnIndex)
180  {
181  auto [size, ptr] = getColumnVoid (columnIndex, &typeid (std::decay_t<CT>), std::is_const_v<CT>);
182  if constexpr (std::is_const_v<CT>)
183  return std::make_pair (size, static_cast<CT*>(ptr));
184  else
185  return std::make_pair (size, static_cast<CT*>(const_cast<void*>(ptr)));
186  }
187  [[nodiscard]] std::pair<std::size_t,const void*>
188  getColumnVoid (std::size_t columnIndex, const std::type_info *type, bool isConst);
189 
190 
192  void checkData () const {
194  }
195 
198  void callNoCheck (const IColumnarTool& tool);
199 
200 
203  private:
204 
205  const ColumnVectorHeader *m_header = nullptr;
206  std::vector<void*> m_data;
207  std::vector<std::size_t> m_dataSize;
208  };
209 }
210 
211 #endif
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
columnar::IColumnarTool
an interface for tools that operate on columnar data
Definition: IColumnarTool.h:214
columnar::ColumnVectorData::setColumn
void setColumn(std::size_t columnIndex, std::size_t size, CT *dataPtr)
set the data for the given column
Definition: ColumnVectorWrapper.h:169
columnar::ColumnVectorData::ColumnVectorData
ColumnVectorData(const ColumnVectorHeader *val_header)
standard constructor
Definition: ColumnVectorWrapper.cxx:197
index
Definition: index.py:1
columnar::ColumnVectorHeader::checkSelf
void checkSelf() const
check the self-consistency of the header
Definition: ColumnVectorWrapper.cxx:98
columnar::ColumnVectorHeader
the header information for the entire columnar data vector
Definition: ColumnVectorWrapper.h:97
columnar::ColumnVectorHeader::nullIndex
static constexpr std::size_t nullIndex
the index used for an invalid index (always has to be 0)
Definition: ColumnVectorWrapper.h:103
columnar::ColumnVectorElementHeader::readOnly
bool readOnly
whether this column will only be used for read access
Definition: ColumnVectorWrapper.h:57
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
columnar::ColumnVectorHeader::unsetIndex
static constexpr std::size_t unsetIndex
the number used for an unset but non-null index
Definition: ColumnVectorWrapper.h:109
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
columnar::ColumnVectorData::callNoCheck
void callNoCheck(const IColumnarTool &tool)
call the tool with the assembled data, without performing any checks on the data
Definition: ColumnVectorWrapper.cxx:261
columnar::ColumnVectorData::m_data
std::vector< void * > m_data
Definition: ColumnVectorWrapper.h:206
columnar::ColumnVectorHeader::addColumn
std::size_t addColumn(const ColumnInfo &columnInfo)
add a column for the given ColumnInfo, returning its index
Definition: ColumnVectorWrapper.cxx:47
columnar::ColumnVectorData::getColumnVoid
std::pair< std::size_t, const void * > getColumnVoid(std::size_t columnIndex, const std::type_info *type, bool isConst)
Definition: ColumnVectorWrapper.cxx:242
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
columnar::ColumnVectorElementHeader::isOffset
bool isOffset
whether this is an offset column
Definition: ColumnVectorWrapper.h:67
columnar::ColumnVectorData::checkData
void checkData() const
do a basic check of the data vector
Definition: ColumnVectorWrapper.h:192
columnar::ColumnVectorData::setColumnVoid
void setColumnVoid(std::size_t columnIndex, std::size_t size, const void *dataPtr, const std::type_info &type, bool isConst)
Definition: ColumnVectorWrapper.cxx:208
columnar::ColumnVectorHeader::numColumns
std::size_t numColumns() const noexcept
the number of columns in the columnar data vector
Definition: ColumnVectorWrapper.h:126
columnar::ColumnVectorData::m_dataSize
std::vector< std::size_t > m_dataSize
Definition: ColumnVectorWrapper.h:207
columnar::ColumnVectorElementHeader::debugName
std::string debugName
the name of the column to use in messages
Definition: ColumnVectorWrapper.h:42
columnar::ColumnVectorData::getColumn
std::pair< std::size_t, CT * > getColumn(std::size_t columnIndex)
get the data for the given column
Definition: ColumnVectorWrapper.h:179
columnar::size
std::size_t size() const noexcept
Definition: ObjectRange.h:166
columnar::ColumnVectorHeader::sizeIndex
static constexpr std::size_t sizeIndex
the index used for the column size column
Definition: ColumnVectorWrapper.h:106
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::ColumnVectorHeader::numFixedColumns
static constexpr std::size_t numFixedColumns
the number of fix elements in the columnar data vector
Definition: ColumnVectorWrapper.h:112
columnar::ColumnVectorElementHeader::offsetIndex
std::size_t offsetIndex
the index of the offset column (or nullIndex for none)
Definition: ColumnVectorWrapper.h:84
columnar::ColumnVectorElementHeader::type
const std::type_info * type
the type to use for the column
Definition: ColumnVectorWrapper.h:46
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
columnar::ColumnVectorData
a class that holds the columnar data for a single call
Definition: ColumnVectorWrapper.h:158
columnar::CT
CT
Definition: ColumnAccessor.h:160
columnar::ColumnVectorElementHeader::arraySize
unsigned arraySize
the total size of all inner array dimensions
Definition: ColumnVectorWrapper.h:75
columnar
Definition: ClusterDef.h:16
columnar::ColumnVectorHeader::getColumn
const ColumnVectorElementHeader & getColumn(std::size_t index) const
get the column for the given index
Definition: ColumnVectorWrapper.h:131
columnar::ColumnVectorHeader::m_elements
std::vector< ColumnVectorElementHeader > m_elements
the elements in the columnar data vector
Definition: ColumnVectorWrapper.h:147
columnar::ColumnVectorHeader::setOffsetColumn
void setOffsetColumn(std::size_t columnIndex, std::size_t offsetIndex)
set the index of the offset column for the given column
Definition: ColumnVectorWrapper.cxx:80
columnar::ColumnVectorElementHeader::isOptional
bool isOptional
whether this column is optional
Definition: ColumnVectorWrapper.h:50
columnar::ColumnVectorHeader::checkData
void checkData(std::span< const void *const > data) const
do a basic check of the data vector
Definition: ColumnVectorWrapper.cxx:137
columnar::ColumnVectorElementHeader
the header information for a single element in the columnar data vector
Definition: ColumnVectorWrapper.h:30
columnar::ColumnVectorHeader::ColumnVectorHeader
ColumnVectorHeader()
standard contructor
Definition: ColumnVectorWrapper.cxx:29
columnar::ColumnVectorData::m_header
const ColumnVectorHeader * m_header
Definition: ColumnVectorWrapper.h:205