The Gaudi Framework  v36r1 (3e2fb5a8)
DataObjectHandle.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
17 #include "GaudiKernel/IProperty.h"
18 #include "GaudiKernel/IRegistry.h"
19 #include "GaudiKernel/NamedRange.h"
20 #include "boost/algorithm/string/replace.hpp"
21 #include <type_traits>
22 
23 //---------------------------------------------------------------------------
24 //
25 namespace details {
26  template <typename T>
27  using Converter_t = T ( * )( const DataObject* );
28 
29  template <typename Range, typename StorageType>
30  Range make_range( const DataObject* obj ) {
31  auto c = static_cast<const StorageType*>( obj );
32  if ( UNLIKELY( !c ) ) return Range();
33  using std::begin;
34  using std::end;
35  auto first = begin( *c );
36  auto last = end( *c );
37  auto _first = reinterpret_cast<typename Range::const_iterator*>( &first );
38  auto _last = reinterpret_cast<typename Range::const_iterator*>( &last );
39  return Range( *_first, *_last );
40  }
41 
42  template <typename ValueType, typename Range = Gaudi::Range_<typename ValueType::ConstVector>>
44  using Selection = typename ValueType::Selection;
45  auto sel = dynamic_cast<const Selection*>( obj );
46  if ( sel ) return &make_range<Range, typename ValueType::Selection>;
47  auto con = dynamic_cast<std::add_const_t<typename ValueType::Container>*>( obj );
48  if ( con ) return &make_range<Range, typename ValueType::Container>;
49  return nullptr;
50  }
51 
52  template <typename T>
53  bool verifyType( const DataObject* dataObj ) {
54  using Type = std::add_const_t<T>;
55  assert( dataObj != nullptr );
56  auto obj = dynamic_cast<Type*>( dataObj );
57  bool ok = ( obj != nullptr );
58  if ( !ok ) {
59  const auto* registry = dataObj->registry();
60  throw GaudiException( "The type expected for " + registry->identifier() + " is " +
61  System::typeinfoName( typeid( Type ) ) +
62  " and is different from the one of the object in the store which is " +
63  System::typeinfoName( typeid( *dataObj ) ) + ".",
64  "Wrong DataObjectType", StatusCode::FAILURE );
65  }
66  assert( obj == static_cast<Type*>( dataObj ) );
67  return ok;
68  }
69 
70  template <typename T, typename U>
71  struct Payload_helper {
72  using type =
73  std::conditional_t<std::is_base_of_v<DataObject, T> && std::is_same_v<T, U>, T,
74  std::conditional_t<std::is_same_v<T, U>, AnyDataWrapper<std::remove_const_t<T>>,
75  AnyDataWithViewWrapper<std::remove_const_t<T>, std::remove_const_t<U>>>>;
76  };
77  template <typename T, typename U>
78  struct Payload_helper<Gaudi::Range_<T>, U> {
80  };
81  template <typename T, typename U>
82  struct Payload_helper<Gaudi::NamedRange_<T>, U> {
84  };
85 
86  template <typename T, typename U = T>
88 } // namespace details
89 
90 //---------------------------------------------------------------------------
91 
102 //---------------------------------------------------------------------------
103 
104 template <typename T>
105 class DataObjectHandle : public DataObjectHandleBase {
106 public:
108 
112  T* get() const { return get( true ); }
113 
118  T* getIfExists() const { return get( false ); }
119 
123  bool exist() const { return get( false ) != nullptr; }
124 
128  T* getOrCreate() const;
129 
133  T* put( std::unique_ptr<T> object ) const;
134 
135  [[deprecated( "please pass a std::unique_ptr instead of a raw pointer" )]] T* put( T* object ) const {
136  return put( std::unique_ptr<T>( object ) );
137  }
138 
139  std::string pythonRepr() const override {
140  auto repr = DataObjectHandleBase::pythonRepr();
141  boost::replace_all( repr, default_type, System::typeinfoName( typeid( T ) ) );
142  return repr;
143  }
144 
145 private:
146  T* get( bool mustExist ) const;
147  mutable bool m_goodType = false;
148 };
149 
150 //---------------------------------------------------------------------------
151 //
159 template <typename T>
160 T* DataObjectHandle<T>::get( bool mustExist ) const {
161  auto dataObj = fetch();
162  if ( UNLIKELY( !dataObj ) ) {
163  if ( mustExist ) { // Problems in getting from the store
164  throw GaudiException( "Cannot retrieve " + objKey() + " from transient store.",
165  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
166  }
167  return nullptr;
168  }
169  if ( UNLIKELY( !m_goodType ) ) m_goodType = ::details::verifyType<T>( dataObj );
170  return static_cast<T*>( dataObj );
171 }
172 
173 //---------------------------------------------------------------------------
174 template <typename T>
176  assert( m_init );
177  StatusCode sc = m_EDS->registerObject( objKey(), objectp.get() );
178  if ( !sc.isSuccess() ) { throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<T>::put", sc ); }
179  return objectp.release();
180 }
181 
182 //---------------------------------------------------------------------------
183 template <typename T>
185  T* obj = get( false );
186  return obj ? obj : put( std::make_unique<T>() );
187 }
188 
189 //---------------------------------------------------------------------------
191 
192 template <typename T>
193 class DataObjectHandle<Gaudi::Range_<T>> : public DataObjectHandleBase {
194 public:
195  using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
197 
199 
203  Range get() const;
204 
205  std::string pythonRepr() const override {
206  auto repr = DataObjectHandleBase::pythonRepr();
207  boost::replace_all( repr, default_type, System::typeinfoName( typeid( Gaudi::Range_<T> ) ) );
208  return repr;
209  }
210 
211 private:
212  mutable ::details::Converter_t<Range> m_converter = nullptr;
213 };
214 
215 template <typename ValueType>
216 auto DataObjectHandle<Gaudi::Range_<ValueType>>::get() const -> Range {
217  auto dataObj = fetch();
218  if ( UNLIKELY( !dataObj ) ) {
219  throw GaudiException( "Cannot retrieve " + objKey() + " from transient store.",
220  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
221  }
222  if ( UNLIKELY( !m_converter ) ) {
223  m_converter = ::details::select_range_converter<ValueType>( dataObj );
224  if ( !m_converter ) {
225  throw GaudiException( "The type requested for " + objKey() + " (" + System::typeinfoName( typeid( ValueType ) ) +
226  ")" + " cannot be obtained from object in event store" + " (" +
227  System::typeinfoName( typeid( *dataObj ) ) + ").",
228  "Wrong DataObjectType", StatusCode::FAILURE );
229  }
230  }
231  return ( *m_converter )( dataObj );
232 }
233 
234 //---------------------------------------------------------------------------
236 
237 template <typename T>
238 class DataObjectHandle<Gaudi::NamedRange_<T>> : public DataObjectHandleBase {
239 public:
240  using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
242 
244 
248  Range get() const;
249 
250  std::string pythonRepr() const override {
251  auto repr = DataObjectHandleBase::pythonRepr();
252  boost::replace_all( repr, default_type, System::typeinfoName( typeid( Gaudi::NamedRange_<T> ) ) );
253  return repr;
254  }
255 
256 private:
257  mutable ::details::Converter_t<Range> m_converter = nullptr;
258 };
259 
260 template <typename ValueType>
262  auto dataObj = fetch();
263  if ( UNLIKELY( !dataObj ) ) {
264  throw GaudiException( "Cannot retrieve " + objKey() + " from transient store.",
265  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
266  }
267  if ( UNLIKELY( !m_converter ) ) {
268  m_converter = ::details::select_range_converter<ValueType, Range>( dataObj );
269  if ( !m_converter ) {
270  throw GaudiException( "The type requested for " + objKey() + " (" + System::typeinfoName( typeid( ValueType ) ) +
271  ")" + " cannot be obtained from object in event store" + " (" +
272  System::typeinfoName( typeid( *dataObj ) ) + ").",
273  "Wrong DataObjectType", StatusCode::FAILURE );
274  }
275  }
276  return ( *m_converter )( dataObj );
277 }
278 
279 //---------------------------------------------------------------------------
281 template <typename T>
283 public:
285 
289  T* get() const { return &_get( true )->getData(); }
290  T* getIfExists() const {
291  auto data = _get( false );
292  return data ? &data->getData() : nullptr;
293  }
294 
298  const T* put( T&& obj ) const {
299  assert( m_init );
300  auto objectp = std::make_unique<AnyDataWrapper<T>>( std::move( obj ) );
301  if ( auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
302  throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<AnyDataWrapper<T>>::put", sc );
303  }
304  return &objectp.release()->getData();
305  }
306 
310  std::optional<std::size_t> size() const { return _get()->size(); }
311 
312  std::string pythonRepr() const override {
313  auto repr = DataObjectHandleBase::pythonRepr();
314  boost::replace_all( repr, default_type, System::typeinfoName( typeid( T ) ) );
315  return repr;
316  }
317 
318 private:
319  AnyDataWrapper<T>* _get( bool mustExist ) const {
320  auto obj = fetch();
321  if ( UNLIKELY( !obj ) ) {
322  if ( mustExist ) {
323  throw GaudiException( "Cannot retrieve " + objKey() + " from transient store.",
324  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
325 
326  } else {
327  return nullptr;
328  }
329  }
330  if ( UNLIKELY( !m_goodType ) ) m_goodType = ::details::verifyType<AnyDataWrapper<T>>( obj );
331  return static_cast<AnyDataWrapper<T>*>( obj );
332  }
333  mutable bool m_goodType = false;
334 };
335 
336 //---------------------------------------------------------------------------
338 template <typename View, typename Owned>
340 public:
342 
346  View* get() const { return &_get( true )->getData(); }
347  View* getIfExists() const {
348  auto data = _get( false );
349  return data ? &data->getData() : nullptr;
350  }
351 
356  assert( m_init );
357  if ( auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
358  throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<AnyDataWithViewWrapper<T>::put", sc );
359  }
360  return &objectp.release()->getData();
361  }
362  const View* put( Owned&& obj ) const {
363  return put( std::make_unique<AnyDataWithViewWrapper<View, Owned>>( std::move( obj ) ) );
364  }
365 
369  std::optional<std::size_t> size() const { return _get()->size(); }
370 
371  std::string pythonRepr() const override {
372  auto repr = DataObjectHandleBase::pythonRepr();
373  boost::replace_all( repr, default_type, System::typeinfoName( typeid( View ) ) );
374  return repr;
375  }
376 
377 private:
378  AnyDataWithViewWrapper<View, Owned>* _get( bool mustExist ) const {
379  auto obj = fetch();
380  if ( UNLIKELY( !obj ) ) {
381  if ( mustExist ) {
382  throw GaudiException( "Cannot retrieve " + objKey() + " from transient store.",
383  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
384 
385  } else {
386  return nullptr;
387  }
388  }
389  if ( UNLIKELY( !m_goodType ) ) m_goodType = ::details::verifyType<AnyDataWithViewWrapper<View, Owned>>( obj );
390  return static_cast<AnyDataWithViewWrapper<View, Owned>*>( obj );
391  }
392  mutable bool m_goodType = false;
393 };
394 
395 //---------------------------- user-facing interface ----------
396 
397 template <typename T>
398 class DataObjectReadHandle : public DataObjectHandle<::details::Payload_t<T>> {
399  template <typename... Args, std::size_t... Is>
400  DataObjectReadHandle( const std::tuple<Args...>& args, std::index_sequence<Is...> )
401  : DataObjectReadHandle( std::get<Is>( args )... ) {}
402 
403 public:
406 
409  template <typename OWNER, typename K, typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
410  DataObjectReadHandle( OWNER* owner, std::string propertyName, const K& key = {}, std::string doc = "" )
412  std::move( doc ) ) {}
413 
414  template <typename... Args>
416  : DataObjectReadHandle( args, std::index_sequence_for<Args...>{} ) {}
417 };
418 
419 template <typename T, typename U = T>
420 class DataObjectWriteHandle : public DataObjectHandle<::details::Payload_t<T, U>> {
421  template <typename... Args, std::size_t... Is>
422  DataObjectWriteHandle( const std::tuple<Args...>& args, std::index_sequence<Is...> )
423  : DataObjectWriteHandle( std::get<Is>( args )... ) {}
424 
425 public:
428 
431  template <typename OWNER, typename K, typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
432  DataObjectWriteHandle( OWNER* owner, std::string propertyName, const K& key = {}, std::string doc = "" )
434  std::move( doc ) ) {}
435 
436  template <typename... Args>
438  : DataObjectWriteHandle( args, std::index_sequence_for<Args...>{} ) {}
439 };
440 
454 // we disable the deprecated warning due to the call of the non registering
455 // constructor of DataObjectHandleBase
456 #pragma GCC diagnostic push
457 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
458 template <typename T>
460  template <class OWNER, class K, typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
461  DeprecatedDynamicDataObjectHandle( OWNER const* owner, const K& key = {} )
462  : DataObjectHandle<T>( key, const_cast<OWNER*>( owner ) ) {
463  this->init();
464  }
465 };
466 #pragma GCC diagnostic pop
IDataHandleHolder
Definition: IDataHandleHolder.h:24
DataObjectHandle< Gaudi::NamedRange_< T > >::get
Range get() const
Retrieve object from transient data store.
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:371
DataObjectWriteHandle
Definition: DataObjectHandle.h:420
details::Payload_t
typename Payload_helper< T, U >::type Payload_t
Definition: DataObjectHandle.h:87
DataObjectHandle< Gaudi::Range_< T > >::ValueType
std::remove_cv_t< std::remove_pointer_t< typename T::value_type > > ValueType
Definition: DataObjectHandle.h:195
std::string
STL class.
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(const std::tuple< Args... > &args)
Definition: DataObjectHandle.h:415
AnyDataWrapper.h
DataObjectHandle::m_goodType
bool m_goodType
Definition: DataObjectHandle.h:147
Gaudi::NamedRange_
Definition: NamedRange.h:52
std::move
T move(T... args)
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:355
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(const std::tuple< Args... > &args, std::index_sequence< Is... >)
Definition: DataObjectHandle.h:400
DataObjectHandle::getOrCreate
T * getOrCreate() const
Get object from store or create a new one if it doesn't exist.
Definition: DataObjectHandle.h:184
GaudiException.h
DataObjectHandle< Gaudi::NamedRange_< T > >::ValueType
std::remove_cv_t< std::remove_pointer_t< typename T::value_type > > ValueType
Definition: DataObjectHandle.h:240
GaudiException
Definition: GaudiException.h:31
NamedRange.h
DataObjectHandle< AnyDataWrapper< T > >::put
const T * put(T &&obj) const
Register object in transient store.
Definition: DataObjectHandle.h:298
DataObjectHandleBase::DataObjectHandleBase
DataObjectHandleBase(const DataObjID &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)
Definition: DataObjectHandleBase.cpp:55
NewInputWrite.fetch
fetch
Definition: NewInputWrite.py:44
std::unique_ptr::get
T get(T... args)
std::unique_ptr::release
T release(T... args)
std::tuple
details::verifyType
bool verifyType(const DataObject *dataObj)
Definition: DataObjectHandle.h:53
gaudirun.c
c
Definition: gaudirun.py:509
DeprecatedDynamicDataObjectHandle
Transitional class to help moving all code to Handles even if some usage requires 'dynamic' behavior,...
Definition: DataObjectHandle.h:459
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:308
details::Payload_helper
Definition: DataObjectHandle.h:71
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(const std::tuple< Args... > &args)
Definition: DataObjectHandle.h:437
DataObjectHandle
DataObjectHandle.h GaudiKernel/DataObjectHandle.h.
Definition: AlgTool.h:36
Gaudi::DataHandle::Writer
@ Writer
Definition: DataHandle.h:40
DataObjectHandle::exist
bool exist() const
Check the existence of the object in the transient store.
Definition: DataObjectHandle.h:123
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::getIfExists
View * getIfExists() const
Definition: DataObjectHandle.h:347
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(OWNER *owner, std::string propertyName, const K &key={}, std::string doc="")
Autodeclaring constructor with property name, mode, key and documentation.
Definition: DataObjectHandle.h:410
DataObjectHandle< AnyDataWrapper< T > >::get
T * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:289
GaudiPluginService.cpluginsvc.registry
def registry()
Definition: cpluginsvc.py:82
Gaudi::Functional::details::get
auto get(const Handle &handle, const Algo &, const EventContext &) -> decltype(details::deref(handle.get()))
Definition: FunctionalDetails.h:391
DeprecatedDynamicDataObjectHandle::DeprecatedDynamicDataObjectHandle
DeprecatedDynamicDataObjectHandle(OWNER const *owner, const K &key={})
Definition: DataObjectHandle.h:461
DataObjectHandle::get
T * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:112
TimingHistograms.name
name
Definition: TimingHistograms.py:23
StatusCode
Definition: StatusCode.h:65
details
Definition: AnyDataWrapper.h:18
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::_get
AnyDataWithViewWrapper< View, Owned > * _get(bool mustExist) const
Definition: DataObjectHandle.h:378
DataObjectHandle::put
T * put(T *object) const
Definition: DataObjectHandle.h:135
DataObjectHandleBase
DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h.
Definition: DataObjectHandleBase.h:35
DataObjectReadHandle
Definition: DataObjectHandle.h:398
details::make_range
Range make_range(const DataObject *obj)
Definition: DataObjectHandle.h:30
DataObjectHandle::get
T * get(bool mustExist) const
Try to retrieve from the transient store.
Definition: DataObjectHandle.h:160
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:74
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(const std::tuple< Args... > &args, std::index_sequence< Is... >)
Definition: DataObjectHandle.h:422
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(const DataObjID &k, IDataHandleHolder *owner)
Definition: DataObjectHandle.h:404
AnyDataWrapper
Definition: AnyDataWrapper.h:34
details::begin
auto begin(reverse_wrapper< T > &w)
Definition: reverse.h:47
IRegistry.h
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
IOTest.sel
sel
Definition: IOTest.py:104
AnyDataWithViewWrapper
Definition: AnyDataWrapper.h:55
DataObjID
Definition: DataObjID.h:47
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(const DataObjID &k, IDataHandleHolder *owner)
Definition: DataObjectHandle.h:426
DataObjectHandle< AnyDataWrapper< T > >::size
std::optional< std::size_t > size() const
Size of boxed item, if boxed item has a 'size' method.
Definition: DataObjectHandle.h:310
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(OWNER *owner, std::string propertyName, const K &key={}, std::string doc="")
Autodeclaring constructor with property name, mode, key and documentation.
Definition: DataObjectHandle.h:432
details::select_range_converter
Converter_t< Range > select_range_converter(const DataObject *obj)
Definition: DataObjectHandle.h:43
DataObjectHandle< AnyDataWrapper< T > >::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:312
Gaudi::Range_
Definition: Range.h:95
DataObjectHandle::put
T * put(std::unique_ptr< T > object) const
Register object in transient store.
Definition: DataObjectHandle.h:175
gaudirun.args
args
Definition: gaudirun.py:319
IDataHandleHolder.h
std::begin
T begin(T... args)
Tuples::Type
Type
Definition: TupleObj.h:91
std
STL namespace.
Gaudi::DataHandle::pythonRepr
virtual std::string pythonRepr() const
Definition: DataHandle.cpp:19
DataObjectHandleBase.h
DataObject
Definition: DataObject.h:40
Gaudi::DataHandle::Reader
@ Reader
Definition: DataHandle.h:40
details::Converter_t
T(*)(const DataObject *) Converter_t
Definition: DataObjectHandle.h:27
std::size_t
IProperty.h
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::get
View * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:346
std::end
T end(T... args)
details::Payload_helper::type
std::conditional_t< std::is_base_of_v< DataObject, T > &&std::is_same_v< T, U >, T, std::conditional_t< std::is_same_v< T, U >, AnyDataWrapper< std::remove_const_t< T > >, AnyDataWithViewWrapper< std::remove_const_t< T >, std::remove_const_t< U > >> > type
Definition: DataObjectHandle.h:75
DataObjectHandle::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:139
GaudiPython.GaudiAlgs._get
def _get(self, location)
Definition: GaudiAlgs.py:417
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
DataObjectHandle::getIfExists
T * getIfExists() const
Bypass check of existence of object in transient store Only uses main location of the.
Definition: DataObjectHandle.h:118
DataObjectHandle< AnyDataWrapper< T > >::getIfExists
T * getIfExists() const
Definition: DataObjectHandle.h:290
UNLIKELY
#define UNLIKELY(x)
Definition: Kernel.h:106
DataObjectHandle< AnyDataWrapper< T > >::_get
AnyDataWrapper< T > * _get(bool mustExist) const
Definition: DataObjectHandle.h:319
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::put
const View * put(std::unique_ptr< AnyDataWithViewWrapper< View, Owned >> objectp) const
Register object in transient store.
Definition: DataObjectHandle.h:355
DataObjectHandle< Gaudi::Range_< T > >::get
Range get() const
Retrieve object from transient data store.
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::put
const View * put(Owned &&obj) const
Definition: DataObjectHandle.h:362
std::unique_ptr
STL class.
ProduceConsume.key
key
Definition: ProduceConsume.py:52
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:82
Gaudi::Functional::details::put
auto put(const DataObjectHandle< Out1 > &out_handle, Out2 &&out)
Definition: FunctionalDetails.h:147
DataObjectHandle< Gaudi::NamedRange_< T > >::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:250
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::size
std::optional< std::size_t > size() const
Size of boxed item, if boxed item has a 'size' method.
Definition: DataObjectHandle.h:369
details::end
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:52
DataObjectHandle< Gaudi::Range_< T > >::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:205