ATLAS Offline Software
ColumnAccessorXAOD.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /// @author Nils Krumnack
6 
7 
8 namespace columnar
9 {
10  // the xAOD specialization for native types
11  template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM>
12  requires (ColumnTypeTraits<CT,ColumnarModeXAOD>::isNativeType)
13  class AccessorTemplate<CI,CT,CAM,ColumnarModeXAOD> final
14  {
15  /// Common Public Members
16  /// =====================
17  public:
18 
19  static_assert (!std::is_const_v<CT>, "CT must not be const");
20 
21  using CM = ColumnarModeXAOD;
22  using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeXAOD>::ColumnType>;
23  using AccessorType = typename ColumnAccessModeTraits<CAM>::template XAODAccessor<typename ColumnTypeTraits<CT,ColumnarModeXAOD>::ColumnType>;
24 
25  AccessorTemplate () = default;
26 
27  AccessorTemplate (ColumnarTool<CM>& columnBase,
28  const std::string& name, ColumnInfo&& info = {})
29  : m_accessor(name)
30  {
31  ColumnTypeTraits<CT,ColumnarModeXAOD>::updateColumnInfo (columnBase, info);
32  if (!info.replacesColumn.empty())
33  m_accessor = info.replacesColumn;
34  }
35 
36  AccessorTemplate (AccessorTemplate&& that)
37  : m_accessor (that.m_accessor)
38  {
39  that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name();
40  }
41 
42  AccessorTemplate& operator = (AccessorTemplate&& that)
43  {
44  if (this != &that)
45  {
46  m_accessor = that.m_accessor;
47  that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name();
48  }
49  return *this;
50  }
51 
52  AccessorTemplate (const AccessorTemplate&) = delete;
53  AccessorTemplate& operator = (const AccessorTemplate&) = delete;
54 
55  [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const
56  {
57  return m_accessor(id.getXAODObjectNoexcept());
58  }
59 
60  [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const
61  {
62  if (range.getXAODObjectNoexcept().empty())
63  return std::span<ColumnType> ();
64  return std::span<ColumnType> (&m_accessor (*range.getXAODObjectNoexcept()[0]), range.getXAODObjectNoexcept().size());
65  }
66 
67  [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
68  {
69  return m_accessor.isAvailable (id.getXAODObjectNoexcept());
70  }
71 
72  [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
73  {
74  if (m_accessor.isAvailable (id.getXAODObjectNoexcept()))
75  return m_accessor (id.getXAODObjectNoexcept());
76  else
77  return std::nullopt;
78  }
79 
80  /// Private Members
81  /// ===============
82  private:
83 
84  AccessorType m_accessor {std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name()};
85  };
86 }