2 * Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration.
5 * @file AthContainers/ConstAccessor.icc
6 * @author scott snyder <snyder@bnl.gov>
8 * @brief Helper class to provide constant 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 ConstAccessor<T, ALLOC>::ConstAccessor (const std::string& name)
28 : ConstAccessor (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 ConstAccessor<T, ALLOC>::ConstAccessor
43 (const std::string& name, const std::string& clsname)
44 : ConstAccessor (name, clsname, SG::AuxVarFlags::None)
46 // cppcheck-suppress missingReturn; false positive
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 ConstAccessor<T, ALLOC>::ConstAccessor (const SG::auxid_t auxid)
59 : ConstAccessor (auxid, SG::AuxVarFlags::None)
66 * @param name Name of this aux variable.
67 * @param clsname The name of its associated class. May be blank.
68 * @param flags Optional flags qualifying the type. See AuxTypeRegistry.
70 * The name -> auxid lookup is done here.
72 template <class T, class ALLOC>
74 ConstAccessor<T, ALLOC>::ConstAccessor
75 (const std::string& name,
76 const std::string& clsname,
77 const SG::AuxVarFlags flags)
78 : m_auxid (SG::AuxTypeRegistry::instance().getAuxID<T, ALLOC> (name, clsname, flags))
84 * @brief Constructor taking an auxid directly.
85 * @param auxid ID for this auxiliary variable.
87 * Will throw @c SG::ExcAuxTypeMismatch if the types don't match.
89 template <class T, class ALLOC>
91 ConstAccessor<T, ALLOC>::ConstAccessor (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 const reference.
101 * @param e The element for which to fetch the variable.
103 template <class T, class ALLOC>
105 ATH_REQUIRES( IsConstAuxElement<ELT> )
107 typename ConstAccessor<T, ALLOC>::const_reference_type
108 ConstAccessor<T, ALLOC>::operator() (const ELT& e) const
110 assert (e.container() != 0);
111 return e.container()->template getData<T> (m_auxid, e.index());
116 * @brief Fetch the variable for one element, as a const reference.
117 * @param container The container from which to fetch the variable.
118 * @param index The index of the desired element.
120 * This allows retrieving aux data by container / index.
121 * Looping over the index via this method will be faster then
122 * looping over the elements of the container.
124 template <class T, class ALLOC>
126 typename ConstAccessor<T, ALLOC>::const_reference_type
127 ConstAccessor<T, ALLOC>::operator()
128 (const AuxVectorData& container,
131 return container.template getData<T> (m_auxid, index);
136 * @brief Fetch the variable for one element, as a const reference,
138 * @param e The element for which to fetch the variable.
139 * @param deflt Default value.
141 * If this variable is not available, then return @c deflt instead.
143 template <class T, class ALLOC>
145 ATH_REQUIRES( IsConstAuxElement<ELT> )
147 typename ConstAccessor<T, ALLOC>::const_reference_type
148 ConstAccessor<T, ALLOC>::withDefault (const ELT& e, const T& deflt) const
150 if (!e.container() || !e.container()->isAvailable (m_auxid)) return deflt;
151 return e.container()->template getData<T> (m_auxid, e.index());
156 * @brief Fetch the variable for one element, as a const reference.
157 * @param container The container from which to fetch the variable.
158 * @param index The index of the desired element.
159 * @param deflt Default value.
161 * This allows retrieving aux data by container / index.
162 * Looping over the index via this method will be faster then
163 * looping over the elements of the container.
164 * If this variable is not available, then return @c deflt instead.
166 template <class T, class ALLOC>
168 typename ConstAccessor<T, ALLOC>::const_reference_type
169 ConstAccessor<T, ALLOC>::withDefault
170 (const AuxVectorData& container,
172 const T& deflt) const
174 if (!container.isAvailable (m_auxid)) return deflt;
175 return container.template getData<T> (m_auxid, index);
180 * @brief Get a pointer to the start of the auxiliary data array.
181 * @param container The container from which to fetch the variable.
183 template <class T, class ALLOC>
185 typename ConstAccessor<T, ALLOC>::const_container_pointer_type
186 ConstAccessor<T, ALLOC>::getDataArray (const AuxVectorData& container) const
188 return reinterpret_cast<const_container_pointer_type>
189 (container.getDataArray (m_auxid));
194 * @brief Get a span over the auxilary data array.
195 * @param container The container from which to fetch the variable.
197 template <class T, class ALLOC>
199 typename ConstAccessor<T, ALLOC>::const_span
200 ConstAccessor<T, ALLOC>::getDataSpan (const AuxVectorData& container) const
202 auto beg = reinterpret_cast<const_container_pointer_type>
203 (container.getDataArray (m_auxid));
204 return const_span (beg, container.size_v());
209 * @brief Test to see if this variable exists in the store.
210 * @param e An element of the container which to test the variable.
212 template <class T, class ALLOC>
214 ATH_REQUIRES( IsConstAuxElement<ELT> )
217 ConstAccessor<T, ALLOC>::isAvailable (const ELT& e) const
219 return e.container() && e.container()->isAvailable (m_auxid);
224 * @brief Return the aux id for this variable.
226 template <class T, class ALLOC>
229 ConstAccessor<T, ALLOC>::auxid() const