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)
35 * @param name Name of this aux variable.
36 * @param clsname The name of its associated class. May be blank.
38 * The name -> auxid lookup is done here.
40 template <class T, class ALLOC>
42 Decorator<T, ALLOC>::Decorator (const std::string& name,
43 const std::string& clsname)
44 : Decorator (name, clsname, SG::AuxVarFlags::None)
50 * @brief Constructor taking an auxid directly.
51 * @param auxid ID for this auxiliary variable.
53 * Will throw @c SG::ExcAuxTypeMismatch if the types don't match.
55 template <class T, class ALLOC>
57 Decorator<T, ALLOC>::Decorator (const SG::auxid_t auxid)
58 : Decorator (auxid, SG::AuxVarFlags::None)
65 * @param name Name of this aux variable.
66 * @param clsname The name of its associated class. May be blank.
67 * @param flags Optional flags qualifying the type. See AuxTypeRegsitry.
69 * The name -> auxid lookup is done here.
71 template <class T, class ALLOC>
73 Decorator<T, ALLOC>::Decorator
74 (const std::string& name,
75 const std::string& clsname,
76 const SG::AuxVarFlags flags)
77 : m_auxid (SG::AuxTypeRegistry::instance().getAuxID<T, ALLOC> (name, clsname, flags))
83 * @brief Constructor taking an auxid directly.
84 * @param auxid ID for this auxiliary variable.
85 * @param flags Optional flags qualifying the type. See AuxTypeRegistry.
87 * Will throw @c SG::ExcAuxTypeMismatch if the types don't match.
89 template <class T, class ALLOC>
91 Decorator<T, ALLOC>::Decorator (const SG::auxid_t auxid,
92 const SG::AuxVarFlags flags)
95 SG::AuxTypeRegistry::instance().checkAuxID<T, ALLOC> (auxid, flags);
100 * @brief Fetch the variable for one element, as a non-const reference.
101 * @param e The element for which to fetch the variable.
103 * If the container is locked, this will allow fetching only variables
104 * that do not yet exist (in which case they will be marked as decorations)
105 * or variables already marked as decorations.
107 template <class T, class ALLOC>
109 ATH_REQUIRES( IsConstAuxElement<ELT> )
111 typename Decorator<T, ALLOC>::reference_type
112 Decorator<T, ALLOC>::operator() (const ELT& e) const
114 assert (e.container() != 0);
115 return e.container()->template getDecoration<T> (m_auxid, e.index());
119 * @brief Fetch the variable for one element, as a non-const reference.
120 * @param container The container from which to fetch the variable.
121 * @param index The index of the desired element.
123 * This allows retrieving aux data by container / index.
124 * Looping over the index via this method will be faster then
125 * looping over the elements of the container.
127 * If the container is locked, this will allow fetching only variables
128 * that do not yet exist (in which case they will be marked as decorations)
129 * or variables already marked as decorations.
131 template <class T, class ALLOC>
133 typename Decorator<T, ALLOC>::reference_type
134 Decorator<T, ALLOC>::operator() (const AuxVectorData& container,
137 return container.template getDecoration<T> (m_auxid, index);
142 * @brief Set the variable for one element.
143 * @param e The element for which to fetch the variable.
144 * @param x The variable value to set.
146 template <class T, class ALLOC>
148 ATH_REQUIRES( IsConstAuxElement<ELT> )
150 void Decorator<T, ALLOC>::set (const ELT& e,
151 const element_type& x) const
158 * @brief Get a pointer to the start of the auxiliary data array.
159 * @param container The container from which to fetch the variable.
161 template <class T, class ALLOC>
163 typename Decorator<T, ALLOC>::const_container_pointer_type
164 Decorator<T, ALLOC>::getDataArray (const AuxVectorData& container) const
166 return reinterpret_cast<const_container_pointer_type>
167 (container.getDataArray (m_auxid));
172 * @brief Get a pointer to the start of the auxiliary data array.
173 * @param container The container from which to fetch the variable.
175 * If the container is locked, this will allow fetching only variables
176 * that do not yet exist (in which case they will be marked as decorations)
177 * or variables already marked as decorations.
179 template <class T, class ALLOC>
181 typename Decorator<T, ALLOC>::container_pointer_type
182 Decorator<T, ALLOC>::getDecorationArray (const AuxVectorData& container) const
184 return reinterpret_cast<container_pointer_type>
185 (container.getDecorationArray (m_auxid));
190 * @brief Get a span over the auxilary data array.
191 * @param container The container from which to fetch the variable.
193 template <class T, class ALLOC>
195 typename Decorator<T, ALLOC>::const_span
196 Decorator<T, ALLOC>::getDataSpan (const AuxVectorData& container) const
198 auto beg = reinterpret_cast<const_container_pointer_type>
199 (container.getDataArray (m_auxid));
200 return const_span (beg, container.size_v());
205 * @brief Get a span over the auxilary data array.
206 * @param container The container from which to fetch the variable.
208 * If the container is locked, this will allow fetching only variables
209 * that do not yet exist (in which case they will be marked as decorations)
210 * or variables already marked as decorations.
212 template <class T, class ALLOC>
214 typename Decorator<T, ALLOC>::span
215 Decorator<T, ALLOC>::getDecorationSpan (const AuxVectorData& container) const
217 auto beg = reinterpret_cast<container_pointer_type>
218 (container.getDecorationArray (m_auxid));
219 return span (beg, container.size_v());
224 * @brief Test to see if this variable exists in the store.
225 * @param e An element of the container which to test the variable.
227 template <class T, class ALLOC>
229 ATH_REQUIRES( IsConstAuxElement<ELT> )
232 Decorator<T, ALLOC>::isAvailable (const ELT& e) const
234 return e.container() && e.container()->isAvailable (m_auxid);
238 * @brief Test to see if this variable exists in the store and is writable.
239 * @param e An element of the container which to test the variable.
241 template <class T, class ALLOC>
243 ATH_REQUIRES( IsConstAuxElement<ELT> )
246 Decorator<T, ALLOC>::isAvailableWritable (const ELT& e) const
248 return e.container() && e.container()->isAvailableWritableAsDecoration (m_auxid);
252 * @brief Return the aux id for this variable.
254 template <class T, class ALLOC>
257 Decorator<T, ALLOC>::auxid() const