Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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>
13 #include <exception>
14 
15 namespace columnar
16 {
18  template<ContainerId CI,typename CM=ColumnarModeDefault> class ObjectRange;
19 
20 
21 
22 
23  template<ContainerId CI> class ObjectRangeIteratorXAODContainer;
24 
25  template<ContainerId CI> class ObjectRange<CI,ColumnarModeXAOD> final
26  {
29  public:
30 
31  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
32 
35 
36  ObjectRange (xAODContainer& val_container) noexcept
37  : m_container (&val_container)
38  {}
39 
40  [[nodiscard]] xAODContainer& getXAODObject () const noexcept {
41  return *m_container;}
42 
43  auto begin () const noexcept {
44  return ObjectRangeIteratorXAODContainer<CI> (m_container->begin());}
45  auto end () const noexcept {
46  return ObjectRangeIteratorXAODContainer<CI> (m_container->end());}
47 
48  [[nodiscard]] bool empty () const noexcept {
49  return m_container->empty();}
50 
51  [[nodiscard]] std::size_t size () const noexcept {
52  return m_container->size();}
53 
54  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t index) const noexcept {
55  return ObjectId<CI,CM> (*(*m_container)[index]);}
56 
57  template<typename Acc,typename... Args>
58  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeXAOD>,Args...>
59  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
60  return acc (*this, std::forward<Args> (args)...);}
61 
62 
63 
66  private:
67 
68  xAODContainer *m_container = nullptr;
69  };
70 
71  template<ContainerId CI> class ObjectRangeIteratorXAODContainer final
72  {
73  public:
74 
75  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
76 
78  using XAODIterator = decltype (std::declval<typename ContainerIdTraits<CI>::xAODObjectRangeType>().begin());
79 
81  : m_iterator (std::move (val_iterator)) {}
82 
84  return ObjectId<CI,CM> (**m_iterator);
85  }
86 
88  ++ m_iterator; return *this;}
89 
90  bool operator == (const ObjectRangeIteratorXAODContainer<CI>& that) const noexcept {
91  return m_iterator == that.m_iterator;}
92  bool operator != (const ObjectRangeIteratorXAODContainer<CI>& that) const noexcept {
93  return m_iterator != that.m_iterator;}
94 
95  private:
97  };
98 
99 
100 
101  template<ContainerId CI> class ObjectRangeIteratorXAODSinglet;
102 
103  // template specialization for EventInfo objects (and potentially other singlet objects)
104  template<ContainerId CI>
107  {
110  public:
111 
112  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
113 
116 
117  ObjectRange (xAODContainer& val_singlet) noexcept
118  : m_singlet (&val_singlet)
119  {}
120 
121  [[nodiscard]] xAODContainer& getXAODObject () const noexcept {
122  return *m_singlet;}
123 
124  auto begin () const noexcept {
126  auto end () const noexcept {
127  return ObjectRangeIteratorXAODSinglet<CI> (nullptr);}
128 
129  [[nodiscard]] bool empty () const noexcept {
130  return false;}
131 
132  [[nodiscard]] std::size_t size () const noexcept {
133  return 1;}
134 
135  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t /*index*/) const noexcept {
136  return ObjectId<CI,CM> (*m_singlet);
137  }
138 
139  template<typename Acc,typename... Args>
140  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeXAOD>,Args...>
141  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
142  return acc (*this, std::forward<Args> (args)...);}
143 
144 
145 
148  private:
149 
151  };
152 
153  template<ContainerId CI> class ObjectRangeIteratorXAODSinglet final
154  {
155  public:
156 
157  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
158 
161 
163  : m_object (val_object) {}
164 
166  return *m_object;}
167 
169  m_object = nullptr; return *this;}
170 
171  bool operator == (const ObjectRangeIteratorXAODSinglet<CI>& that) const noexcept {
172  return m_object == that.m_object;}
173  bool operator != (const ObjectRangeIteratorXAODSinglet<CI>& that) const noexcept {
174  return m_object != that.m_object;}
175 
176  private:
178  };
179 
180 
181 
182 
183  template<ContainerId CI> class ObjectRangeIteratorArray;
184 
185  template<ContainerId CI> class ObjectRange<CI,ColumnarModeArray> final
186  {
189  public:
190 
191  static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
192 
195 
197  return ObjectRangeIteratorArray<CI> (m_data, m_beginIndex);}
199  return ObjectRangeIteratorArray<CI> (m_data, m_endIndex);}
200 
201  [[nodiscard]] std::size_t beginIndex () const noexcept {
202  return m_beginIndex;}
203  [[nodiscard]] std::size_t endIndex () const noexcept {
204  return m_endIndex;}
205 
206  ObjectRange (const xAODContainer& /*val_container*/)
207  {
208  throw std::logic_error ("can't call xAOD function in columnar mode");
209  }
210 
211  [[nodiscard]] bool empty () const noexcept {
212  return m_beginIndex == m_endIndex;}
213 
214  [[nodiscard]] std::size_t size () const noexcept {
215  return m_endIndex - m_beginIndex;}
216 
217  [[nodiscard]] xAODContainer& getXAODObject () const {
218  throw std::logic_error ("can't call xAOD function in columnar mode");}
219 
220  [[nodiscard]] ObjectId<CI,CM> operator [] (std::size_t index) const noexcept {
221  return ObjectId<CI,CM> (m_data, index + m_beginIndex);
222  }
223 
224  template<typename Acc,typename... Args>
225  requires std::invocable<Acc,ObjectRange<CI,ColumnarModeArray>,Args...>
226  [[nodiscard]] decltype(auto) operator() (Acc& acc, Args&&... args) const {
227  return acc (*this, std::forward<Args> (args)...);}
228 
229 
230 
233  public:
234 
235  explicit ObjectRange (void **val_data, std::size_t val_beginIndex,
236  std::size_t val_endIndex) noexcept
237  : m_data (val_data), m_beginIndex (val_beginIndex), m_endIndex (val_endIndex)
238  {}
239 
240  [[nodiscard]] void **getData () const noexcept {
241  return m_data;}
242 
243 
244 
247  private:
248 
249  void **m_data = nullptr;
250  std::size_t m_beginIndex = 0u;
251  std::size_t m_endIndex = 0u;
252  };
253 
257 
258  template<ContainerId CI> class ObjectRangeIteratorArray final
259  {
260  public:
261 
263 
264  ObjectRangeIteratorArray (void **val_data, std::size_t val_index) noexcept
265  : m_data (val_data), m_index (val_index) {}
266 
268  return ObjectId<CI,CM> (m_data, m_index);
269  }
270 
272  ++ m_index; return *this;}
273 
274  bool operator == (const ObjectRangeIteratorArray<CI>& that) const noexcept {
275  return m_index == that.m_index;}
276  bool operator != (const ObjectRangeIteratorArray<CI>& that) const noexcept {
277  return m_index != that.m_index;}
278 
279  private:
280  void **m_data = nullptr;
281  std::size_t m_index = 0u;
282  };
283 
300 }
301 
302 #endif
columnar::ObjectRange< CI, ColumnarModeXAOD >::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:40
columnar::ContainerIdTraits
Definition: ContainerId.h:97
columnar::ObjectRangeIteratorArray::m_index
std::size_t m_index
Definition: ObjectRange.h:281
columnar::ObjectRange< CI, ColumnarModeXAOD >::end
auto end() const noexcept
Definition: ObjectRange.h:45
columnar::ObjectRangeIteratorXAODSinglet::m_object
XAODObjectType * m_object
Definition: ObjectRange.h:177
columnar::ObjectRangeIteratorArray::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:267
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:45
columnar::ObjectRangeIteratorXAODSinglet::operator!=
bool operator!=(const ObjectRangeIteratorXAODSinglet< CI > &that) const noexcept
Definition: ObjectRange.h:173
columnar::ObjectRange< CI, ColumnarModeArray >::size
std::size_t size() const noexcept
Definition: ObjectRange.h:214
index
Definition: index.py:1
columnar::ObjectRangeIteratorXAODSinglet::operator++
ObjectRangeIteratorXAODSinglet< CI > & operator++() noexcept
Definition: ObjectRange.h:168
m_data
std::vector< T > m_data
Definition: TrackTruthMatchingBaseAlg.cxx:660
columnar::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:121
columnar::ObjectRangeIteratorXAODContainer::m_iterator
XAODIterator m_iterator
Definition: ObjectRange.h:96
columnar::ObjectRange< CI, ColumnarModeArray >::ObjectRange
ObjectRange(const xAODContainer &)
Definition: ObjectRange.h:206
columnar::ObjectRangeIteratorXAODContainer::ObjectRangeIteratorXAODContainer
ObjectRangeIteratorXAODContainer(XAODIterator &&val_iterator) noexcept
Definition: ObjectRange.h:80
columnar::ObjectRange< CI, ColumnarModeArray >::empty
bool empty() const noexcept
Definition: ObjectRange.h:211
columnar::ObjectRangeIteratorXAODContainer::operator==
bool operator==(const ObjectRangeIteratorXAODContainer< CI > &that) const noexcept
Definition: ObjectRange.h:90
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
Args
Definition: test_lwtnn_fastgraph.cxx:12
columnar::ObjectRangeIteratorXAODContainer::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:83
columnar::ObjectRange
a class representing a continuous sequence of objects (a.k.a. a container)
Definition: ObjectRange.h:18
columnar::ObjectRangeIteratorArray::operator!=
bool operator!=(const ObjectRangeIteratorArray< CI > &that) const noexcept
Definition: ObjectRange.h:276
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
columnar::ObjectRangeIteratorXAODContainer::operator++
ObjectRangeIteratorXAODContainer< CI > & operator++() noexcept
Definition: ObjectRange.h:87
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
columnar::ObjectRange< CI, ColumnarModeXAOD >::size
std::size_t size() const noexcept
Definition: ObjectRange.h:51
columnar::ObjectRange< CI, ColumnarModeArray >::getData
void ** getData() const noexcept
Definition: ObjectRange.h:240
columnar::ObjectRangeIteratorArray
an iterator over objects in an ObjectRange
Definition: ObjectRange.h:183
columnar::size
std::size_t size() const noexcept
Definition: ObjectRange.h:132
columnar::ObjectRange< CI, ColumnarModeXAOD >::empty
bool empty() const noexcept
Definition: ObjectRange.h:48
columnar::ObjectRangeIteratorArray::ObjectRangeIteratorArray
ObjectRangeIteratorArray(void **val_data, std::size_t val_index) noexcept
Definition: ObjectRange.h:264
columnar::ObjectRange
ObjectRange(xAODContainer &val_singlet) noexcept
Definition: ObjectRange.h:117
columnar::ObjectRangeIteratorXAODContainer::operator!=
bool operator!=(const ObjectRangeIteratorXAODContainer< CI > &that) const noexcept
Definition: ObjectRange.h:92
columnar::xAODContainer
typename ContainerIdTraits< CI >::xAODObjectRangeType xAODContainer
Definition: ObjectRange.h:114
columnar::ObjectRange< CI, ColumnarModeArray >::beginIndex
std::size_t beginIndex() const noexcept
Definition: ObjectRange.h:201
columnar::begin
auto begin() const noexcept
Definition: ObjectRange.h:124
columnar::requires
requires((std::is_integral_v< CT >||std::is_floating_point_v< CT >) &&!std::is_same_v< CT, bool >) struct ColumnTypeTraits< CT
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ObjectId.h:18
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::operator[]
ObjectId< CI, CM > operator[](std::size_t) const noexcept
Definition: ObjectRange.h:135
columnar::ObjectRange< CI, ColumnarModeArray >::xAODContainer
typename ContainerIdTraits< CI >::xAODObjectRangeType xAODContainer
Definition: ObjectRange.h:193
columnar::ObjectRangeIteratorArray::m_data
void ** m_data
Definition: ObjectRange.h:280
ObjectId.h
columnar::ObjectRange< CI, ColumnarModeXAOD >::xAODContainer
typename ContainerIdTraits< CI >::xAODObjectRangeType xAODContainer
Definition: ObjectRange.h:33
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::ObjectRange< CI, ColumnarModeArray >::getXAODObject
xAODContainer & getXAODObject() const
Definition: ObjectRange.h:217
columnar::empty
bool empty() const noexcept
Definition: ObjectRange.h:129
columnar::ObjectRange< CI, ColumnarModeXAOD >::begin
auto begin() const noexcept
Definition: ObjectRange.h:43
columnar
Definition: ClusterDef.h:16
ContainerId.h
columnar::ObjectRangeIteratorXAODSinglet::XAODObjectType
typename ContainerIdTraits< CI >::xAODObjectIdType XAODObjectType
Definition: ObjectRange.h:160
columnar::ObjectRangeIteratorXAODContainer::XAODIterator
decltype(std::declval< typename ContainerIdTraits< CI >::xAODObjectRangeType >().begin()) XAODIterator
Definition: ObjectRange.h:78
columnar::ObjectRangeIteratorXAODSinglet::operator==
bool operator==(const ObjectRangeIteratorXAODSinglet< CI > &that) const noexcept
Definition: ObjectRange.h:171
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
columnar::end
auto end() const noexcept
Definition: ObjectRange.h:126
columnar::ObjectRangeIteratorXAODSinglet::ObjectRangeIteratorXAODSinglet
ObjectRangeIteratorXAODSinglet(XAODObjectType *val_object) noexcept
Definition: ObjectRange.h:162
columnar::ObjectRangeIteratorXAODContainer
Definition: ObjectRange.h:23
columnar::ObjectRange< CI, ColumnarModeArray >::end
ObjectRangeIteratorArray< CI > end() const noexcept
Definition: ObjectRange.h:198
columnar::ObjectRange< CI, ColumnarModeXAOD >::ObjectRange
ObjectRange(xAODContainer &val_container) noexcept
Definition: ObjectRange.h:36
columnar::m_singlet
xAODContainer * m_singlet
Definition: ObjectRange.h:150
columnar::ObjectRange< CI, ColumnarModeArray >::ObjectRange
ObjectRange(void **val_data, std::size_t val_beginIndex, std::size_t val_endIndex) noexcept
Definition: ObjectRange.h:235
columnar::ContainerIdTraits::isDefined
static constexpr bool isDefined
Definition: ContainerId.h:98
columnar::ObjectRangeIteratorXAODSinglet::operator*
ObjectId< CI, CM > operator*() const noexcept
Definition: ObjectRange.h:165
columnar::ObjectRangeIteratorArray::operator++
ObjectRangeIteratorArray< CI > & operator++() noexcept
Definition: ObjectRange.h:271
columnar::ObjectRangeIteratorArray::operator==
bool operator==(const ObjectRangeIteratorArray< CI > &that) const noexcept
Definition: ObjectRange.h:274
columnar::ObjectRange< CI, ColumnarModeArray >::endIndex
std::size_t endIndex() const noexcept
Definition: ObjectRange.h:203
columnar::ObjectRange< CI, ColumnarModeArray >::begin
ObjectRangeIteratorArray< CI > begin() const noexcept
Definition: ObjectRange.h:196
columnar::ObjectRangeIteratorXAODSinglet
Definition: ObjectRange.h:101