ATLAS Offline Software
ObjectRange.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 #ifndef COLUMNAR_CORE_OBJECT_RANGE_H
9 #define COLUMNAR_CORE_OBJECT_RANGE_H
10 
12 #include <ColumnarCore/ObjectId.h>
14 #include <exception>
15 
16 namespace columnar
17 {
19  template<ContainerIdConcept CI,typename CM> class ObjectRange;
20 
21 
22 
23 
24  template<ContainerIdConcept CI,typename IteratorType> class ObjectRangeIteratorXAODContainer;
25 
26  template<ContainerIdConcept CI> class ObjectRange<CI,ColumnarModeXAOD> final
27  {
30  public:
31 
32  using xAODContainer = typename CI::xAODObjectRangeType;
34 
35  ObjectRange (xAODContainer& val_container) noexcept
36  : m_container (&val_container)
37  {}
38 
39  [[nodiscard]] xAODContainer& getXAODObject () const noexcept {
40  // This object should ever be held within the context of a
41  // single thread (and generally on the stack), so the associated
42  // check is meaningless.
43  auto *container ATLAS_THREAD_SAFE = m_container;
44  return *container;}
45 
46  // a version of `getXAODObject` that only exists when it is `noexcept`
47  [[nodiscard]] xAODContainer& getXAODObjectNoexcept () const noexcept {
48  // This object should ever be held within the context of a
49  // single thread (and generally on the stack), so the associated
50  // check is meaningless.
51  auto *container ATLAS_THREAD_SAFE = m_container;
52  return *container;}
53 
54  auto begin () const noexcept {
55  // This object should ever be held within the context of a
56  // single thread (and generally on the stack), so the associated
57  // check is meaningless.
58  auto *container ATLAS_THREAD_SAFE = m_container;
59  return ObjectRangeIteratorXAODContainer<CI,decltype(container->begin())> (container->begin());}
60  auto end () const noexcept {
61  // This object should ever be held within the context of a
62  // single thread (and generally on the stack), so the associated
63  // check is meaningless.
64  auto *container ATLAS_THREAD_SAFE = m_container;
65  return ObjectRangeIteratorXAODContainer<CI,decltype(container->end())> (container->end());}
66  auto rbegin () const noexcept {
67  // This object should ever be held within the context of a
68  // single thread (and generally on the stack), so the associated
69  // check is meaningless.
70  auto *container ATLAS_THREAD_SAFE = m_container;
71  return ObjectRangeIteratorXAODContainer<CI,decltype(container->rbegin())> (container->rbegin());}
72  auto rend () const noexcept {
73  // This object should ever be held within the context of a
74  // single thread (and generally on the stack), so the associated
75  // check is meaningless.
76  auto *container ATLAS_THREAD_SAFE = m_container;
77  return ObjectRangeIteratorXAODContainer<CI,decltype(container->rend())> (container->rend());}
78 
79  [[nodiscard]] bool empty () const noexcept {
80  return m_container->empty();}
81 
82  [[nodiscard]] std::size_t size () const noexcept {
83  return m_container->size();}
84 
85  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t index) const noexcept {
86  return ObjectId<CI,CM> (*(*m_container)[index]);}
87 
88  template<typename Acc,typename... Args>
89  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeXAOD>,Args...>
90  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
91  return acc (*this, std::forward<Args> (args)...);}
92 
93 
94 
97  private:
98 
99  xAODContainer *m_container = nullptr;
100  };
101 
102  template<ContainerIdConcept CI,typename IteratorType> class ObjectRangeIteratorXAODContainer final
103  {
104  public:
105 
107 
108  ObjectRangeIteratorXAODContainer (IteratorType&& val_iterator) noexcept
109  : m_iterator (std::move (val_iterator)) {}
110 
112  return ObjectId<CI,CM> (**m_iterator);
113  }
114 
116  ++ m_iterator; return *this;}
117 
119  return m_iterator == that.m_iterator;}
121  return m_iterator != that.m_iterator;}
122 
123  private:
124  IteratorType m_iterator;
125  };
126 
127 
128 
129  template<ContainerIdConcept CI> class ObjectRangeIteratorXAODSinglet;
130 
131  // template specialization for EventInfo objects (and potentially other singlet objects)
132  template<ContainerIdConcept CI>
133  requires (std::is_same_v<typename CI::xAODObjectRangeType,typename CI::xAODObjectIdType>)
135  {
138  public:
139 
140  using xAODContainer = typename CI::xAODObjectRangeType;
142 
143  ObjectRange (xAODContainer& val_singlet) noexcept
144  : m_singlet (&val_singlet)
145  {}
146 
147  [[nodiscard]] xAODContainer& getXAODObject () const noexcept {
148  return *m_singlet;}
149 
150  // a version of `getXAODObject` that only exists when it is `noexcept`
151  [[nodiscard]] xAODContainer& getXAODObjectNoexcept () const noexcept {
152  return *m_singlet;}
153 
154  auto begin () const noexcept {
156  auto end () const noexcept {
157  return ObjectRangeIteratorXAODSinglet<CI> (nullptr);}
158  auto rbegin () const noexcept {
160  auto rend () const noexcept {
161  return ObjectRangeIteratorXAODSinglet<CI> (nullptr);}
162 
163  [[nodiscard]] bool empty () const noexcept {
164  return false;}
165 
166  [[nodiscard]] std::size_t size () const noexcept {
167  return 1;}
168 
169  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t /*index*/) const noexcept {
170  return ObjectId<CI,CM> (*m_singlet);
171  }
172 
173  template<typename Acc,typename... Args>
174  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeXAOD>,Args...>
175  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
176  return acc (*this, std::forward<Args> (args)...);}
177 
178 
179 
182  private:
183 
184  xAODContainer *m_singlet = nullptr;
185  };
186 
187  template<ContainerIdConcept CI> class ObjectRangeIteratorXAODSinglet final
188  {
189  public:
190 
192  using XAODObjectType = typename CI::xAODObjectIdType;
193 
195  : m_object (val_object) {}
196 
198  return *m_object;}
199 
201  m_object = nullptr; return *this;}
202 
203  bool operator == (const ObjectRangeIteratorXAODSinglet<CI>& that) const noexcept {
204  return m_object == that.m_object;}
205  bool operator != (const ObjectRangeIteratorXAODSinglet<CI>& that) const noexcept {
206  return m_object != that.m_object;}
207 
208  private:
210  };
211 
212 
213 
214 
215  template<ContainerIdConcept CI,int stepSize> class ObjectRangeIteratorArray;
216 
217  template<ContainerIdConcept CI> class ObjectRange<CI,ColumnarModeArray> final
218  {
221  public:
222 
223  using xAODContainer = typename CI::xAODObjectRangeType;
225 
227  return ObjectRangeIteratorArray<CI,1> (m_data, m_beginIndex);}
229  return ObjectRangeIteratorArray<CI,1> (m_data, m_endIndex);}
231  // note that as a reverse iterator, the meaning of begin and end
232  // is reversed, and the new "end" can be -1.
233  return ObjectRangeIteratorArray<CI,-1> (m_data, m_endIndex-1);}
235  // note that as a reverse iterator, the meaning of begin and end
236  // is reversed, and the new "end" can be -1.
237  return ObjectRangeIteratorArray<CI,-1> (m_data, m_beginIndex-1);}
238 
239  [[nodiscard]] std::size_t beginIndex () const noexcept {
240  return m_beginIndex;}
241  [[nodiscard]] std::size_t endIndex () const noexcept {
242  return m_endIndex;}
243 
244  // Whatever you do: Do not remove this function. Yes, it will always
245  // throw. It is meant to throw in this template specialization, and
246  // only do something useful in the xAOD mode specialization. If you
247  // remove it you break the columnar mode.
248  ObjectRange (const xAODContainer& /*val_container*/)
249  {
250  throw std::logic_error ("can't call xAOD function in columnar mode");
251  }
252 
253  [[nodiscard]] bool empty () const noexcept {
254  return m_beginIndex == m_endIndex;}
255 
256  [[nodiscard]] std::size_t size () const noexcept {
257  return m_endIndex - m_beginIndex;}
258 
259  // Whatever you do: Do not remove this function. Yes, it will always
260  // throw. It is meant to throw in this template specialization, and
261  // only do something useful in the xAOD mode specialization. If you
262  // remove it you break the columnar mode.
263  [[nodiscard]] xAODContainer& getXAODObject () const {
264  throw std::logic_error ("can't call xAOD function in columnar mode");}
265 
266  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t index) const noexcept {
267  return ObjectId<CI,CM> (m_data, index + m_beginIndex);
268  }
269 
270  template<typename Acc,typename... Args>
271  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeArray>,Args...>
272  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
273  return acc (*this, std::forward<Args> (args)...);}
274 
275 
276 
279  public:
280 
281  explicit ObjectRange (void **val_data, std::size_t val_beginIndex,
282  std::size_t val_endIndex) noexcept
283  : m_data (val_data), m_beginIndex (val_beginIndex), m_endIndex (val_endIndex)
284  {}
285 
286  [[nodiscard]] void **getData () const noexcept {
287  return m_data;}
288 
289 
290 
293  private:
294 
295  void **m_data = nullptr;
296  std::size_t m_beginIndex = 0u;
297  std::size_t m_endIndex = 0u;
298  };
299 
303 
304  template<ContainerIdConcept CI,int stepSize> class ObjectRangeIteratorArray final
305  {
306  public:
307 
309 
310  ObjectRangeIteratorArray (void **val_data, std::size_t val_index) noexcept
311  : m_data (val_data), m_index (val_index) {}
312 
314  return ObjectId<CI,CM> (m_data, m_index);
315  }
316 
318  m_index += stepSize; return *this;}
319 
320  bool operator == (const ObjectRangeIteratorArray<CI,stepSize>& that) const noexcept {
321  return m_index == that.m_index;}
322  bool operator != (const ObjectRangeIteratorArray<CI,stepSize>& that) const noexcept {
323  return m_index != that.m_index;}
324 
325  private:
326  void **m_data = nullptr;
327  std::size_t m_index = 0u;
328  };
329 }
330 
331 #endif
columnar::ObjectRange< CI, ColumnarModeXAOD >::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:39
columnar::ObjectRangeIteratorXAODContainer::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:111
columnar::ObjectRange< CI, ColumnarModeXAOD >::end
auto end() const noexcept
Definition: ObjectRange.h:60
columnar::ObjectRangeIteratorArray::m_data
void ** m_data
Definition: ObjectRange.h:326
columnar::ObjectRangeIteratorXAODContainer::m_iterator
IteratorType m_iterator
Definition: ObjectRange.h:124
columnar::ObjectRangeIteratorXAODSinglet::m_object
XAODObjectType * m_object
Definition: ObjectRange.h:209
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:47
columnar::ObjectRangeIteratorXAODSinglet::operator!=
bool operator!=(const ObjectRangeIteratorXAODSinglet< CI > &that) const noexcept
Definition: ObjectRange.h:205
columnar::ObjectRange< CI, ColumnarModeArray >::size
std::size_t size() const noexcept
Definition: ObjectRange.h:256
index
Definition: index.py:1
columnar::ObjectRangeIteratorXAODSinglet::operator++
ObjectRangeIteratorXAODSinglet< CI > & operator++() noexcept
Definition: ObjectRange.h:200
m_data
std::vector< T > m_data
Definition: TrackTruthMatchingBaseAlg.cxx:660
columnar::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:147
columnar::ObjectRange< CI, ColumnarModeArray >::ObjectRange
ObjectRange(const xAODContainer &)
Definition: ObjectRange.h:248
columnar::getXAODObjectNoexcept
xAODContainer & getXAODObjectNoexcept() const noexcept
Definition: ObjectRange.h:151
columnar::ObjectRangeIteratorXAODContainer::operator!=
bool operator!=(const ObjectRangeIteratorXAODContainer< CI, IteratorType > &that) const noexcept
Definition: ObjectRange.h:120
columnar::ObjectRangeIteratorArray::operator++
ObjectRangeIteratorArray< CI, stepSize > & operator++() noexcept
Definition: ObjectRange.h:317
columnar::ObjectRange< CI, ColumnarModeArray >::empty
bool empty() const noexcept
Definition: ObjectRange.h:253
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
Args
Definition: test_lwtnn_fastgraph.cxx:12
columnar::ObjectRange
a class representing a continuous sequence of objects (a.k.a. a container)
Definition: ContainerId.h:175
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
columnar::ObjectRange< CI, ColumnarModeArray >::begin
ObjectRangeIteratorArray< CI, 1 > begin() const noexcept
Definition: ObjectRange.h:226
columnar::ObjectRangeIteratorArray::operator==
bool operator==(const ObjectRangeIteratorArray< CI, stepSize > &that) const noexcept
Definition: ObjectRange.h:320
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
columnar::ObjectRangeIteratorArray::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:313
columnar::ObjectRange< CI, ColumnarModeArray >::xAODContainer
typename CI::xAODObjectRangeType xAODContainer
Definition: ObjectRange.h:223
columnar::rend
auto rend() const noexcept
Definition: ObjectRange.h:160
columnar::ObjectRangeIteratorXAODContainer::ObjectRangeIteratorXAODContainer
ObjectRangeIteratorXAODContainer(IteratorType &&val_iterator) noexcept
Definition: ObjectRange.h:108
columnar::ObjectRange< CI, ColumnarModeXAOD >::xAODContainer
typename CI::xAODObjectRangeType xAODContainer
Definition: ObjectRange.h:32
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
columnar::ObjectRange< CI, ColumnarModeArray >::end
ObjectRangeIteratorArray< CI, 1 > end() const noexcept
Definition: ObjectRange.h:228
columnar::ObjectRange< CI, ColumnarModeXAOD >::size
std::size_t size() const noexcept
Definition: ObjectRange.h:82
columnar::ObjectRange< CI, ColumnarModeArray >::getData
void ** getData() const noexcept
Definition: ObjectRange.h:286
columnar::ObjectRangeIteratorArray
an iterator over objects in an ObjectRange
Definition: ObjectRange.h:215
columnar::size
std::size_t size() const noexcept
Definition: ObjectRange.h:166
columnar::ObjectRange< CI, ColumnarModeXAOD >::empty
bool empty() const noexcept
Definition: ObjectRange.h:79
columnar::ObjectRange
ObjectRange(xAODContainer &val_singlet) noexcept
Definition: ObjectRange.h:143
columnar::ObjectRangeIteratorArray::ObjectRangeIteratorArray
ObjectRangeIteratorArray(void **val_data, std::size_t val_index) noexcept
Definition: ObjectRange.h:310
columnar::ObjectRange< CI, ColumnarModeArray >::beginIndex
std::size_t beginIndex() const noexcept
Definition: ObjectRange.h:239
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::begin
auto begin() const noexcept
Definition: ObjectRange.h:154
columnar::ObjectRangeIteratorXAODContainer::operator++
ObjectRangeIteratorXAODContainer< CI, IteratorType > & operator++() noexcept
Definition: ObjectRange.h:115
columnar::ObjectRange< CI, ColumnarModeXAOD >::getXAODObjectNoexcept
xAODContainer & getXAODObjectNoexcept() const noexcept
Definition: ObjectRange.h:47
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:176
columnar::ObjectRangeIteratorXAODContainer::operator==
bool operator==(const ObjectRangeIteratorXAODContainer< CI, IteratorType > &that) const noexcept
Definition: ObjectRange.h:118
columnar::ObjectRangeIteratorArray::m_index
std::size_t m_index
Definition: ObjectRange.h:327
columnar::operator[]
ObjectId< CI, CM > operator[](std::size_t) const noexcept
Definition: ObjectRange.h:169
ObjectId.h
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::ObjectRange< CI, ColumnarModeXAOD >::rbegin
auto rbegin() const noexcept
Definition: ObjectRange.h:66
columnar::ObjectRange< CI, ColumnarModeArray >::getXAODObject
xAODContainer & getXAODObject() const
Definition: ObjectRange.h:263
columnar::ObjectRange< CI, ColumnarModeArray >::rbegin
ObjectRangeIteratorArray< CI,-1 > rbegin() const noexcept
Definition: ObjectRange.h:230
columnar::empty
bool empty() const noexcept
Definition: ObjectRange.h:163
columnar::ObjectRange< CI, ColumnarModeXAOD >::begin
auto begin() const noexcept
Definition: ObjectRange.h:54
columnar
Definition: ClusterDef.h:16
ContainerId.h
columnar::ObjectRangeIteratorXAODSinglet::operator==
bool operator==(const ObjectRangeIteratorXAODSinglet< CI > &that) const noexcept
Definition: ObjectRange.h:203
columnar::ObjectRange< CI, ColumnarModeXAOD >::rend
auto rend() const noexcept
Definition: ObjectRange.h:72
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
columnar::end
auto end() const noexcept
Definition: ObjectRange.h:156
columnar::requires
requires requires
Definition: VariantAccessor.h:23
columnar::ObjectRangeIteratorXAODSinglet::ObjectRangeIteratorXAODSinglet
ObjectRangeIteratorXAODSinglet(XAODObjectType *val_object) noexcept
Definition: ObjectRange.h:194
columnar::ObjectRangeIteratorXAODContainer
Definition: ObjectRange.h:24
columnar::ObjectRange< CI, ColumnarModeXAOD >::ObjectRange
ObjectRange(xAODContainer &val_container) noexcept
Definition: ObjectRange.h:35
columnar::m_singlet
xAODContainer * m_singlet
Definition: ObjectRange.h:184
columnar::ObjectRange< CI, ColumnarModeArray >::ObjectRange
ObjectRange(void **val_data, std::size_t val_beginIndex, std::size_t val_endIndex) noexcept
Definition: ObjectRange.h:281
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
columnar::ObjectRangeIteratorXAODSinglet::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:197
checker_macros.h
Define macros for attributes used to control the static checker.
columnar::rbegin
auto rbegin() const noexcept
Definition: ObjectRange.h:158
columnar::ObjectRangeIteratorXAODSinglet::XAODObjectType
typename CI::xAODObjectIdType XAODObjectType
Definition: ObjectRange.h:192
columnar::ObjectRange< CI, ColumnarModeArray >::endIndex
std::size_t endIndex() const noexcept
Definition: ObjectRange.h:241
columnar::ObjectRangeIteratorArray::operator!=
bool operator!=(const ObjectRangeIteratorArray< CI, stepSize > &that) const noexcept
Definition: ObjectRange.h:322
columnar::ObjectRangeIteratorXAODSinglet
Definition: ObjectRange.h:129
columnar::ObjectRange< CI, ColumnarModeArray >::rend
ObjectRangeIteratorArray< CI,-1 > rend() const noexcept
Definition: ObjectRange.h:234