ATLAS Offline Software
Loading...
Searching...
No Matches
VectorVectorColumn.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_VECTOR_COLUMN_H
9#define COLUMNAR_CORE_VECTOR_VECTOR_COLUMN_H
10
12
13namespace columnar
14{
15 // the column accessor for std::vector of std::vector in ColumnarModeArray
16 //
17 // This is one of the more tricky accessors, as it need to connect to
18 // three underlying columns. The first two columns are the offset
19 // columns, the third is the data column.
20 template<ContainerIdConcept CI,typename CT>
22 class AccessorTemplate<CI,std::vector<std::vector<CT>>,ColumnAccessMode::input,ColumnarModeArray> final
23 {
26 public:
27
31
32 AccessorTemplate () = default;
33
34 AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
35 {
36 auto myinfoOuter = info;
37 myinfoOuter.offsetName = CI::idName;
38 myinfoOuter.isOffset = true;
39 auto myinfoInner = info;
40 myinfoInner.offsetName = std::string (CI::idName) + "." + name + ".outerOffset";
41 myinfoInner.isOffset = true;
42 info.offsetName = std::string (CI::idName) + "." + name + ".innerOffset";
43 m_outerOffsetData = std::make_unique<ColumnAccessorDataArray> (&m_outerOffsetIndex, &m_outerOffsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
44 columnBase.addColumn (myinfoInner.offsetName, m_outerOffsetData.get(), std::move (myinfoOuter));
45 m_innerOffsetData = std::make_unique<ColumnAccessorDataArray> (&m_innerOffsetIndex, &m_innerOffsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
46 columnBase.addColumn (info.offsetName, m_innerOffsetData.get(), std::move (myinfoInner));
47 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &typeid (ElementType), ColumnAccessMode::input);
48 columnBase.addColumn (std::string (CI::idName) + "." + name + ".data", m_dataData.get(), std::move (info));
49 }
50
52 {
53 moveAccessor (m_outerOffsetIndex, m_outerOffsetData, that.m_outerOffsetIndex, that.m_outerOffsetData);
54 moveAccessor (m_innerOffsetIndex, m_innerOffsetData, that.m_innerOffsetIndex, that.m_innerOffsetData);
55 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
56 }
57
59 {
60 if (this != &that)
61 {
62 moveAccessor (m_outerOffsetIndex, m_outerOffsetData, that.m_outerOffsetIndex, that.m_outerOffsetData);
63 moveAccessor (m_innerOffsetIndex, m_innerOffsetData, that.m_innerOffsetIndex, that.m_innerOffsetData);
64 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
65 }
66 return *this;
67 }
68
69 auto operator () (ObjectId<CI,CM> id) const noexcept
70 {
71 auto *outerOffset = static_cast<const ColumnarOffsetType*>(id.getData()[m_outerOffsetIndex]);
72 auto *innerOffset = static_cast<const ColumnarOffsetType*>(id.getData()[m_innerOffsetIndex]);
73 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
74 return detail::VectorConvertView ([data] (const ColumnarOffsetType& index) noexcept {
75 const ColumnarOffsetType& endIndex = (&index)[1];
76 return std::span<const ElementType> (data + index, data + endIndex);},
77 std::span<const ColumnarOffsetType> (innerOffset + outerOffset[id.getIndex()], innerOffset + outerOffset[id.getIndex()+1]));
78 }
79
80 bool isAvailable (ObjectId<CI,CM> id) const noexcept
81 {
82 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
83 return data != nullptr;
84 }
85
88 private:
89
90 unsigned m_outerOffsetIndex = 0u;
91 std::unique_ptr<ColumnAccessorDataArray> m_outerOffsetData;
92 unsigned m_innerOffsetIndex = 0u;
93 std::unique_ptr<ColumnAccessorDataArray> m_innerOffsetData;
94 unsigned m_dataIndex = 0u;
95 std::unique_ptr<ColumnAccessorDataArray> m_dataData;
96 };
97}
98
99#endif
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
AccessorTemplate(ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
the base class for all columnar components
a class representing a single object (electron, muons, etc.)
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType > >
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
Definition index.py:1
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition ColumnInfo.h:35
a trait class to provide information about the column type
static constexpr bool isNativeType
std::map< std::string, HypoJetVector >::const_iterator CI