2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5/// @author Nils Krumnack
8#include <ColumnarCore/VectorConvertView.h>
9#include <AthContainers/DataVector.h>
15 // the xAOD specialization for native types
16 template<typename CT,ColumnAccessMode CAM>
17 requires (MemoryAccessor<CT,ColumnarModeXAOD>::isDefined)
18 class ContainerFreeAccessor<CT,CAM,ColumnarModeXAOD> final
20 /// Common Public Members
21 /// =====================
24 using CM = ColumnarModeXAOD;
26 static_assert (CAM == ColumnAccessMode::input || MemoryAccessor<CT,CM>::viewIsReference || MemoryAccessor<CT,CM>::hasSetter, "output access not supported for this type");
28 static constexpr bool isDefined = true;
29 static constexpr bool viewIsReference = MemoryAccessor<CT,ColumnarModeXAOD>::viewIsReference;
30 static constexpr bool allowRead = true;
32 static_assert (!std::is_const_v<CT>, "CT must not be const");
34 using ColumnValueType = typename MemoryAccessor<CT,ColumnarModeXAOD>::MemoryType;
35 using ColumnType = std::conditional_t<CAM==ColumnAccessMode::input,const ColumnValueType,ColumnValueType>;
36 using MemoryType = ColumnValueType;
37 using AccessorType = typename ColumnAccessModeTraits<CAM>::template XAODAccessor<ColumnValueType>;
39 ContainerFreeAccessor () = default;
41 ContainerFreeAccessor (ColumnarTool<CM>& /*columnBase*/, const std::string& name, ColumnAccessorOptions&& options)
44 if (options.addMTDependency)
45 throw std::runtime_error ("adding MT dependencies not yet supported for individual decorations");
46 if (!options.replacesColumn.empty())
47 m_accessor = options.replacesColumn;
50 ContainerFreeAccessor (ContainerFreeAccessor&& that)
51 : m_accessor (that.m_accessor)
53 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name();
56 ContainerFreeAccessor& operator = (ContainerFreeAccessor&& that)
60 m_accessor = that.m_accessor;
61 that.m_accessor = std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name();
66 ContainerFreeAccessor (const ContainerFreeAccessor&) = delete;
67 ContainerFreeAccessor& operator = (const ContainerFreeAccessor&) = delete;
69 [[nodiscard]] ColumnType& operator () (const SG::AuxElement& element) const
70 requires (viewIsReference && CAM != ColumnAccessMode::update)
72 return m_accessor(element);
75 [[nodiscard]] ColumnType& operator () (SG::AuxElement& element) const
76 requires (viewIsReference && CAM == ColumnAccessMode::update)
78 return m_accessor(element);
81 [[nodiscard]] auto operator () (const SG::AuxElement& element) const
82 requires (!viewIsReference && CAM == ColumnAccessMode::input)
84 void **dataPtr = nullptr;
85 return MemoryAccessor<CT,CM>::makeViewer(dataPtr)(m_accessor(element));
88 [[nodiscard]] static auto& makeView (auto&& value) noexcept
89 requires (viewIsReference)
94 [[nodiscard]] static auto makeView (auto&& value) noexcept
95 requires (!viewIsReference && CAM == ColumnAccessMode::input)
97 void **dataPtr = nullptr;
98 return MemoryAccessor<CT,CM>::makeViewer(dataPtr)(value);
101 [[nodiscard]] std::span<ColumnType> operator () (const DataVector<SG::AuxElement>& container) const
102 requires (viewIsReference)
104 if (container.empty())
105 return std::span<ColumnType> ();
106 return std::span<ColumnType> (&m_accessor (*container[0]), container.size());
109 [[nodiscard]] auto operator () (const DataVector<SG::AuxElement>& container) const
110 requires (!viewIsReference && CAM == ColumnAccessMode::input)
112 std::span<ColumnType> mySpan;
113 if (!container.empty())
114 mySpan = std::span<ColumnType> (&m_accessor (*container[0]), container.size());
115 void **dataPtr = nullptr;
116 return detail::VectorConvertView (MemoryAccessor<CT,CM>::make_viewer(dataPtr), std::span (mySpan));
120 requires (!viewIsReference && CAM == ColumnAccessMode::output)
121 // requires (!viewIsReference && CAM == ColumnAccessMode::output && requires(MemoryType memory, T value) {MemoryAccessor<CT,CM>::makeSetter(nullptr)(memory, value);})
122 void set (const SG::AuxElement& element, T&& value) const
124 void **dataPtr = nullptr;
125 MemoryAccessor<CT,CM>::makeSetter(dataPtr)(m_accessor(element), std::forward<T>(value));
128 [[nodiscard]] bool isAvailable (const SG::AuxElement& element) const
130 return m_accessor.isAvailable (element);
137 AccessorType m_accessor {std::string("UNDEFINED_ACCESSOR_") + typeid (ColumnType).name()};
143 // the xAOD specialization for native types
144 template<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM>
145 requires (detail::ContainerFreeAccessor<CT,CAM,ColumnarModeXAOD>::isDefined)
146 class AccessorTemplate<CI,CT,CAM,ColumnarModeXAOD> final
148 /// Common Public Members
149 /// =====================
152 static_assert (!std::is_const_v<CT>, "CT must not be const");
154 using CM = ColumnarModeXAOD;
156 AccessorTemplate () = default;
158 AccessorTemplate (ColumnarTool<CM>& columnBase,
159 const std::string& name, ColumnAccessorOptions&& options = {})
160 : m_accessor(columnBase, name, std::move (options))
163 AccessorTemplate (AccessorTemplate&&) = default;
164 AccessorTemplate& operator = (AccessorTemplate&&) = default;
165 AccessorTemplate (const AccessorTemplate&) = delete;
166 AccessorTemplate& operator = (const AccessorTemplate&) = delete;
168 [[nodiscard]] decltype(auto) operator () (ObjectId<CI,CM> id) const
170 return m_accessor(id.getXAODObjectNoexcept());
173 [[nodiscard]] decltype(auto) operator () (ObjectRange<CI,CM> range) const
175 return m_accessor(range.getXAODObjectNoexcept());
179 requires requires(T value) {std::declval<detail::ContainerFreeAccessor<CT,CAM,CM>>().set (std::declval<SG::AuxElement>(), value);}
180 void set (ObjectId<CI,CM> id, T&& value) const noexcept
182 m_accessor.set (id.getXAODObjectNoexcept(), std::forward<T>(value));
185 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
187 return m_accessor.isAvailable (id.getXAODObjectNoexcept());
190 [[nodiscard]] auto getOptional (ObjectId<CI,CM> id) const
192 std::optional<std::decay_t<decltype(std::declval<detail::ContainerFreeAccessor<CT,CAM,CM>>()(std::declval<const SG::AuxElement>()))>> result;
193 if (m_accessor.isAvailable (id.getXAODObjectNoexcept()))
194 result = m_accessor (id.getXAODObjectNoexcept());
202 detail::ContainerFreeAccessor<CT,CAM,CM> m_accessor;