2 * Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration.
5 * @file AthContainers/Decorator.icc
6 * @author scott snyder <snyder@bnl.gov>
8 * @brief Helper class to provide type-safe access to aux data.
12 #include "AthContainers/AuxTypeRegistry.h"
13 #include "AthContainers/exceptions.h"
21 * @param name Name of this aux variable.
23 * The name -> auxid lookup is done here.
25 template <class T, class ALLOC>
27 Decorator<T, ALLOC>::Decorator (const std::string& name)
28 : Decorator (name, "", SG::AuxVarFlags::None)
30 // cppcheck-suppress missingReturn
36 * @param name Name of this aux variable.
37 * @param clsname The name of its associated class. May be blank.
39 * The name -> auxid lookup is done here.
41 template <class T, class ALLOC>
43 Decorator<T, ALLOC>::Decorator (const std::string& name,
44 const std::string& clsname)
45 : Decorator (name, clsname, SG::AuxVarFlags::None)
51 * @brief Constructor taking an auxid directly.
52 * @param auxid ID for this auxiliary variable.
54 * Will throw @c SG::ExcAuxTypeMismatch if the types don't match.
56 template <class T, class ALLOC>
58 Decorator<T, ALLOC>::Decorator (const SG::auxid_t auxid)
59 : Decorator (auxid, SG::AuxVarFlags::None)
61 // cppcheck-suppress missingReturn; false positive
67 * @param name Name of this aux variable.
68 * @param clsname The name of its associated class. May be blank.
69 * @param flags Optional flags qualifying the type. See AuxTypeRegsitry.
71 * The name -> auxid lookup is done here.
73 template <class T, class ALLOC>
75 Decorator<T, ALLOC>::Decorator
76 (const std::string& name,
77 const std::string& clsname,
78 const SG::AuxVarFlags flags)
79 : m_auxid (SG::AuxTypeRegistry::instance().getAuxID<T, ALLOC> (name, clsname, flags))
85 * @brief Constructor taking an auxid directly.
86 * @param auxid ID for this auxiliary variable.
87 * @param flags Optional flags qualifying the type. See AuxTypeRegistry.
89 * Will throw @c SG::ExcAuxTypeMismatch if the types don't match.
91 template <class T, class ALLOC>
93 Decorator<T, ALLOC>::Decorator (const SG::auxid_t auxid,
94 const SG::AuxVarFlags flags)
97 SG::AuxTypeRegistry::instance().checkAuxID<T, ALLOC> (auxid, flags);
102 * @brief Fetch the variable for one element, as a non-const reference.
103 * @param e The element for which to fetch the variable.
105 * If the container is locked, this will allow fetching only variables
106 * that do not yet exist (in which case they will be marked as decorations)
107 * or variables already marked as decorations.
109 template <class T, class ALLOC>
111 ATH_REQUIRES( IsConstAuxElement<ELT> )
113 typename Decorator<T, ALLOC>::reference_type
114 Decorator<T, ALLOC>::operator() (const ELT& e) const
116 assert (e.container() != 0);
117 return e.container()->template getDecoration<T> (m_auxid, e.index());
121 * @brief Fetch the variable for one element, as a non-const reference.
122 * @param container The container from which to fetch the variable.
123 * @param index The index of the desired element.
125 * This allows retrieving aux data by container / index.
126 * Looping over the index via this method will be faster then
127 * looping over the elements of the container.
129 * If the container is locked, this will allow fetching only variables
130 * that do not yet exist (in which case they will be marked as decorations)
131 * or variables already marked as decorations.
133 template <class T, class ALLOC>
135 typename Decorator<T, ALLOC>::reference_type
136 Decorator<T, ALLOC>::operator() (const AuxVectorData& container,
139 return container.template getDecoration<T> (m_auxid, index);
144 * @brief Set the variable for one element.
145 * @param e The element for which to fetch the variable.
146 * @param x The variable value to set.
148 template <class T, class ALLOC>
150 ATH_REQUIRES( IsConstAuxElement<ELT> )
152 void Decorator<T, ALLOC>::set (const ELT& e,
153 const element_type& x) const
160 * @brief Get a pointer to the start of the auxiliary data array.
161 * @param container The container from which to fetch the variable.
163 template <class T, class ALLOC>
165 typename Decorator<T, ALLOC>::const_container_pointer_type
166 Decorator<T, ALLOC>::getDataArray (const AuxVectorData& container) const
168 return reinterpret_cast<const_container_pointer_type>
169 (container.getDataArray (m_auxid));
174 * @brief Get a pointer to the start of the auxiliary data array.
175 * @param container The container from which to fetch the variable.
177 * If the container is locked, this will allow fetching only variables
178 * that do not yet exist (in which case they will be marked as decorations)
179 * or variables already marked as decorations.
181 template <class T, class ALLOC>
183 typename Decorator<T, ALLOC>::container_pointer_type
184 Decorator<T, ALLOC>::getDecorationArray (const AuxVectorData& container) const
186 return reinterpret_cast<container_pointer_type>
187 (container.getDecorationArray (m_auxid));
192 * @brief Get a span over the auxilary data array.
193 * @param container The container from which to fetch the variable.
195 template <class T, class ALLOC>
197 typename Decorator<T, ALLOC>::const_span
198 Decorator<T, ALLOC>::getDataSpan (const AuxVectorData& container) const
200 auto beg = reinterpret_cast<const_container_pointer_type>
201 (container.getDataArray (m_auxid));
202 return const_span (beg, container.size_v());
207 * @brief Get a span over the auxilary data array.
208 * @param container The container from which to fetch the variable.
210 * If the container is locked, this will allow fetching only variables
211 * that do not yet exist (in which case they will be marked as decorations)
212 * or variables already marked as decorations.
214 template <class T, class ALLOC>
216 typename Decorator<T, ALLOC>::span
217 Decorator<T, ALLOC>::getDecorationSpan (const AuxVectorData& container) const
219 auto beg = reinterpret_cast<container_pointer_type>
220 (container.getDecorationArray (m_auxid));
221 return span (beg, container.size_v());
226 * @brief Test to see if this variable exists in the store.
227 * @param e An element of the container in which to test the variable.
229 template <class T, class ALLOC>
231 ATH_REQUIRES( IsConstAuxElement<ELT> )
234 Decorator<T, ALLOC>::isAvailable (const ELT& e) const
236 return e.container() && e.container()->isAvailable (m_auxid);
240 * @brief Test to see if this variable exists in the store and is writable.
241 * @param e An element of the container in which to test the variable.
243 template <class T, class ALLOC>
245 ATH_REQUIRES( IsConstAuxElement<ELT> )
248 Decorator<T, ALLOC>::isAvailableWritable (const ELT& e) const
250 return e.container() && e.container()->isAvailableWritableAsDecoration (m_auxid);
255 * @brief Test to see if this variable exists in the store.
256 * @param c The container in which to test the variable.
258 template <class T, class ALLOC>
261 Decorator<T, ALLOC>::isAvailable (const AuxVectorData& c) const
263 return c.isAvailable (m_auxid);
267 * @brief Test to see if this variable exists in the store and is writable.
268 * @param c The container in which to test the variable.
270 template <class T, class ALLOC>
273 Decorator<T, ALLOC>::isAvailableWritable (const AuxVectorData& c) const
275 return c.isAvailableWritableAsDecoration (m_auxid);
280 * @brief Return the aux id for this variable.
282 template <class T, class ALLOC>
285 Decorator<T, ALLOC>::auxid() const