2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 /// @author Nils Krumnack
10 // the xAOD specialization for native types
11 template<ContainerId CI,typename CT,ColumnAccessMode CAM>
12 requires (ColumnTypeTraits<CT,ColumnarModeXAOD>::isNativeType)
13 class AccessorTemplate<CI,CT,CAM,ColumnarModeXAOD> final
15 /// Common Public Members
16 /// =====================
19 static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
20 static_assert (!std::is_const_v<CT>, "CT must not be const");
22 using CM = ColumnarModeXAOD;
23 using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeXAOD>::ColumnType>;
24 using AccessorType = typename ColumnAccessModeTraits<CAM>::template XAODAccessor<typename ColumnTypeTraits<CT,ColumnarModeXAOD>::ColumnType>;
26 AccessorTemplate () = default;
28 AccessorTemplate (ColumnarTool<CM>& columnBase,
29 const std::string& name, ColumnInfo&& info = {})
32 ColumnTypeTraits<CT,ColumnarModeXAOD>::updateColumnInfo (columnBase, info);
33 if (!info.replacesColumn.empty())
34 m_accessor = info.replacesColumn;
37 AccessorTemplate (AccessorTemplate&& that)
39 m_accessor = that.m_accessor;
40 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name();
43 AccessorTemplate& operator = (AccessorTemplate&& that)
47 m_accessor = that.m_accessor;
48 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name();
53 AccessorTemplate (const AccessorTemplate&) = delete;
54 AccessorTemplate& operator = (const AccessorTemplate&) = delete;
56 [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const noexcept
58 return m_accessor(id.getXAODObject());
61 [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const noexcept
63 if (range.getXAODObject().empty())
64 return std::span<ColumnType> ();
65 return std::span<ColumnType> (&m_accessor (*range.getXAODObject()[0]), range.getXAODObject().size());
68 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
70 return m_accessor.isAvailable (id.getXAODObject());
73 [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
75 if (m_accessor.isAvailable (id.getXAODObject()))
76 return m_accessor (id.getXAODObject());
85 AccessorType m_accessor {std::string("UNDEFINED_ACCESSOR_") + typeid (typename ColumnTypeTraits<CT,CM>::ColumnType).name()};