ATLAS Offline Software
VariantAccessor.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_VARIANT_VARIANT_ACCESSOR_H
9 #define COLUMNAR_VARIANT_VARIANT_ACCESSOR_H
10 
13 #include <boost/mp11/tuple.hpp>
14 
15 namespace columnar
16 {
17  // the column accessor for variant objects in ColumnarModeArray
18  //
19  // This internally contains a tuple of accessors, one for each
20  // variant. This is probably not the best way to implement it, but it
21  // fits best with the current accessor infrastructure.
22  template<ContainerIdConcept CIBase,ContainerIdConcept... CIList,typename CT,ColumnAccessMode CAM>
25  {
28  public:
29 
30  static_assert (!std::is_const_v<CT>, "CT must not be const");
31 
32  using CI = VariantContainerId<CIBase,CIList...>;
35  using AccessorTuple = std::tuple<AccessorTemplate<CIList,CT,CAM,CM>...>;
36 
37  AccessorTemplate () noexcept = default;
38 
39  AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
40  {
41  boost::mp11::tuple_for_each (m_accessors, [&columnarTool,&name,&info] (auto& accessor)
42  {
43  resetAccessor (accessor, columnarTool, name, ColumnInfo(info));
44  });
45  }
46 
48  {
49  m_accessors = std::move (that.m_accessors);
50  }
51 
53  {
54  if (this != &that)
55  m_accessors = std::move (that.m_accessors);
56  return *this;
57  }
58 
61 
62  void reset (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
63  {
64  boost::mp11::tuple_for_each (m_accessors, [&columnarTool,&name,&info] (auto& accessor)
65  {
66  resetAccessor (accessor, columnarTool, name, ColumnInfo(info));
67  });
68  }
69 
70  [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const noexcept
71  {
72  return internalGet<0> (id);
73  }
74 
75  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
76  {
77  return internalIsAvailable<0> (id);
78  }
79 
82  private:
83 
85 
86  template<unsigned Index>
87  void internalInit (ColumnarTool<CM>& columnarTool, const std::string& name, const ColumnInfo& info)
88  {
89  resetAccessor (std::get<Index>(m_accessors), columnarTool, name, ColumnInfo(info));
90  if constexpr (Index + 1 < CI::numVariants)
91  internalInit<Index + 1>(columnarTool, name, info);
92  }
93 
94  template<unsigned Index>
95  decltype(auto) internalGet (const ObjectId<CI,CM>& id) const noexcept
96  {
97  if (id.getVariantIndex() == Index)
98  {
99  using CI2 = std::tuple_element_t<Index,std::tuple<CIList...>>;
100  ObjectId<CI2,CM> objId {id.getData(), id.getObjectIndex()};
101  return std::get<Index>(m_accessors)(objId);
102  } else if constexpr (Index+1 < CI::numVariants)
103  return internalGet<Index + 1>(id);
104  else
105  {
106  std::cerr << "Invalid variant index: " << id.getVariantIndex() << std::endl;
107  std::abort ();
108  }
109  }
110 
111  template<unsigned Index>
112  bool internalIsAvailable (const ObjectId<CI,CM>& id) const noexcept
113  {
114  if (id.getVariantIndex() == Index)
115  {
116  using CI2 = std::tuple_element_t<Index,std::tuple<CIList...>>;
117  ObjectId<CI2,CM> objId {id.getData(), id.getObjectIndex()};
118  return std::get<Index>(m_accessors).isAvailable(objId);
119  } else if constexpr (Index+1 < CI::numVariants)
120  return internalIsAvailable<Index + 1>(id);
121  else
122  {
123  std::cerr << "Invalid variant index: " << id.getVariantIndex() << std::endl;
124  std::abort ();
125  }
126  }
127  };
128 }
129 
130 #endif
columnar::VariantContainerId
a "variant" ContainerId
Definition: VariantDef.h:98
VariantDef.h
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::m_accessors
AccessorTuple m_accessors
Definition: VariantAccessor.h:84
columnar::operator=
AccessorTemplate & operator=(AccessorTemplate &&that)
Definition: VectorColumn.h:88
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::reset
void reset(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
Definition: VariantAccessor.h:62
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
Index
IndexedConstituentUserInfo::Index Index
Definition: IndexedConstituentUserInfo.cxx:12
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::internalInit
void internalInit(ColumnarTool< CM > &columnarTool, const std::string &name, const ColumnInfo &info)
Definition: VariantAccessor.h:87
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate(AccessorTemplate &&that)
Definition: VariantAccessor.h:47
ColumnAccessor.h
columnar::ColumnAccessMode
ColumnAccessMode
an enum for the different access modes for a column
Definition: ColumnInfo.h:19
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTuple
std::tuple< AccessorTemplate< CIList, CT, CAM, CM >... > AccessorTuple
Definition: VariantAccessor.h:35
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:176
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate() noexcept=default
python.CaloAddPedShiftConfig.default
default
Definition: CaloAddPedShiftConfig.py:43
columnar::CT
CT
Definition: ColumnAccessor.h:160
columnar::ContainerIdConcept
concept ContainerIdConcept
concept for a container id
Definition: ContainerId.h:171
columnar
Definition: ClusterDef.h:16
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::ColumnType
typename ColumnAccessModeTraits< CAM >::template ColumnType< typename ColumnTypeTraits< CT, ColumnarModeArray >::ColumnType > ColumnType
Definition: VariantAccessor.h:34
columnar::requires
requires requires
Definition: VariantAccessor.h:23
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::internalIsAvailable
bool internalIsAvailable(const ObjectId< CI, CM > &id) const noexcept
Definition: VariantAccessor.h:112
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
columnar::resetAccessor
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
Definition: ColumnAccessor.h:210
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::AccessorTemplate
AccessorTemplate(const AccessorTemplate &)=delete
columnar::ColumnAccessModeTraits
Definition: ColumnAccessor.h:24
columnar::AccessorTemplate< VariantContainerId< CIBase, CIList... >, CT, CAM, ColumnarModeArray >::isAvailable
bool isAvailable(ObjectId< CI, CM > id) const noexcept
Definition: VariantAccessor.h:75
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87