Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v38r0 (2143aa4c)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 ( !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 <Gaudi::DataHandle::Mode, 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>
80  };
81  template <typename T, typename U>
84  };
85 
86  template <Gaudi::DataHandle::Mode mode, typename T, typename U = T>
88 
89 } // namespace details
90 
91 //---------------------------------------------------------------------------
92 
103 //---------------------------------------------------------------------------
104 
105 template <typename T>
106 class DataObjectHandle : public DataObjectHandleBase {
107 public:
109 
113  T* get() const { return get( true ); }
114 
119  T* getIfExists() const { return get( false ); }
120 
124  bool exist() const { return get( false ) != nullptr; }
125 
129  T* getOrCreate() const;
130 
134  T* put( std::unique_ptr<T> object ) const;
135 
136  [[deprecated( "please pass a std::unique_ptr instead of a raw pointer" )]] T* put( T* object ) const {
137  return put( std::unique_ptr<T>( object ) );
138  }
139 
140  std::string pythonRepr() const override {
141  auto repr = DataObjectHandleBase::pythonRepr();
142  boost::replace_all( repr, default_type, System::typeinfoName( typeid( T ) ) );
143  return repr;
144  }
145 
146 private:
147  T* get( bool mustExist ) const;
148  mutable bool m_goodType = false;
149 };
150 
151 //---------------------------------------------------------------------------
152 //
160 template <typename T>
161 T* DataObjectHandle<T>::get( bool mustExist ) const {
162  auto dataObj = fetch();
163  if ( !dataObj ) {
164  if ( mustExist ) { // Problems in getting from the store
165  throw GaudiException( "Cannot retrieve \'" + objKey() + "\' from transient store.",
166  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
167  }
168  return nullptr;
169  }
170  if ( !m_goodType ) m_goodType = ::details::verifyType<T>( dataObj );
171  return static_cast<T*>( dataObj );
172 }
173 
174 //---------------------------------------------------------------------------
175 template <typename T>
177  assert( m_init );
178  StatusCode sc = m_EDS->registerObject( objKey(), objectp.get() );
179  if ( !sc.isSuccess() ) { throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<T>::put", sc ); }
180  return objectp.release();
181 }
182 
183 //---------------------------------------------------------------------------
184 template <typename T>
186  T* obj = get( false );
187  return obj ? obj : put( std::make_unique<T>() );
188 }
189 
190 //---------------------------------------------------------------------------
192 
193 template <typename T>
194 class DataObjectHandle<Gaudi::Range_<T>> : public DataObjectHandleBase {
195 public:
196  using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
198 
200 
204  Range get() const;
205 
206  std::string pythonRepr() const override {
207  auto repr = DataObjectHandleBase::pythonRepr();
208  boost::replace_all( repr, default_type, System::typeinfoName( typeid( Gaudi::Range_<T> ) ) );
209  return repr;
210  }
211 
212 private:
213  mutable ::details::Converter_t<Range> m_converter = nullptr;
214 };
215 
216 template <typename ValueType>
217 auto DataObjectHandle<Gaudi::Range_<ValueType>>::get() const -> Range {
218  auto dataObj = fetch();
219  if ( !dataObj ) {
220  throw GaudiException( "Cannot retrieve \'" + objKey() + "\' from transient store.",
221  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
222  }
223  if ( !m_converter ) {
224  m_converter = ::details::select_range_converter<ValueType>( dataObj );
225  if ( !m_converter ) {
226  throw GaudiException( "The type requested for " + objKey() + " (" + System::typeinfoName( typeid( ValueType ) ) +
227  ")" + " cannot be obtained from object in event store" + " (" +
228  System::typeinfoName( typeid( *dataObj ) ) + ").",
229  "Wrong DataObjectType", StatusCode::FAILURE );
230  }
231  }
232  return ( *m_converter )( dataObj );
233 }
234 
235 //---------------------------------------------------------------------------
237 
238 template <typename T>
239 class DataObjectHandle<Gaudi::NamedRange_<T>> : public DataObjectHandleBase {
240 public:
241  using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
243 
245 
249  Range get() const;
250 
251  std::string pythonRepr() const override {
252  auto repr = DataObjectHandleBase::pythonRepr();
253  boost::replace_all( repr, default_type, System::typeinfoName( typeid( Gaudi::NamedRange_<T> ) ) );
254  return repr;
255  }
256 
257 private:
258  mutable ::details::Converter_t<Range> m_converter = nullptr;
259 };
260 
261 template <typename ValueType>
263  auto dataObj = fetch();
264  if ( !dataObj ) {
265  throw GaudiException( "Cannot retrieve \'" + objKey() + "\' from transient store.",
266  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
267  }
268  if ( !m_converter ) {
269  m_converter = ::details::select_range_converter<ValueType, Range>( dataObj );
270  if ( !m_converter ) {
271  throw GaudiException( "The type requested for " + objKey() + " (" + System::typeinfoName( typeid( ValueType ) ) +
272  ")" + " cannot be obtained from object in event store" + " (" +
273  System::typeinfoName( typeid( *dataObj ) ) + ").",
274  "Wrong DataObjectType", StatusCode::FAILURE );
275  }
276  }
277  return ( *m_converter )( dataObj );
278 }
279 
280 //---------------------------------------------------------------------------
282 template <typename T>
284 public:
286 
290  T* get() const { return &_get( true )->getData(); }
291  T* getIfExists() const {
292  auto data = _get( false );
293  return data ? &data->getData() : nullptr;
294  }
295 
299  const T* put( T&& obj ) const {
300  assert( m_init );
301  auto objectp = std::make_unique<AnyDataWrapper<T>>( std::move( obj ) );
302  if ( auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
303  throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<AnyDataWrapper<T>>::put", sc );
304  }
305  return &objectp.release()->getData();
306  }
307 
311  std::optional<std::size_t> size() const { return _get()->size(); }
312 
313  std::string pythonRepr() const override {
314  auto repr = DataObjectHandleBase::pythonRepr();
315  boost::replace_all( repr, default_type, System::typeinfoName( typeid( T ) ) );
316  return repr;
317  }
318 
319 private:
320  AnyDataWrapper<T>* _get( bool mustExist ) const {
321  auto obj = fetch();
322  if ( !obj ) {
323  if ( mustExist ) {
324  throw GaudiException( "Cannot retrieve \'" + objKey() + "\' from transient store.",
325  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
326 
327  } else {
328  return nullptr;
329  }
330  }
331  if ( !m_goodType ) m_goodType = ::details::verifyType<AnyDataWrapper<T>>( obj );
332  return static_cast<AnyDataWrapper<T>*>( obj );
333  }
334  mutable bool m_goodType = false;
335 };
336 
337 //---------------------------------------------------------------------------
339 template <typename View, typename Owned>
341 public:
343 
347  View* get() const { return &_get( true )->getData(); }
348  View* getIfExists() const {
349  auto data = _get( false );
350  return data ? &data->getData() : nullptr;
351  }
352 
357  assert( m_init );
358  if ( auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
359  throw GaudiException( "Error in put of " + objKey(), "DataObjectHandle<AnyDataWithViewWrapper<T>::put", sc );
360  }
361  return &objectp.release()->getData();
362  }
363  const View* put( Owned&& obj ) const {
364  return put( std::make_unique<AnyDataWithViewWrapper<View, Owned>>( std::move( obj ) ) );
365  }
366 
370  std::optional<std::size_t> size() const { return _get()->size(); }
371 
372  std::string pythonRepr() const override {
373  auto repr = DataObjectHandleBase::pythonRepr();
374  boost::replace_all( repr, default_type, System::typeinfoName( typeid( View ) ) );
375  return repr;
376  }
377 
378 private:
379  AnyDataWithViewWrapper<View, Owned>* _get( bool mustExist ) const {
380  auto obj = fetch();
381  if ( !obj ) {
382  if ( mustExist ) {
383  throw GaudiException( "Cannot retrieve \'" + objKey() + "\' from transient store.",
384  m_owner ? owner()->name() : "no owner", StatusCode::FAILURE );
385 
386  } else {
387  return nullptr;
388  }
389  }
390  if ( !m_goodType ) m_goodType = ::details::verifyType<AnyDataWithViewWrapper<View, Owned>>( obj );
391  return static_cast<AnyDataWithViewWrapper<View, Owned>*>( obj );
392  }
393  mutable bool m_goodType = false;
394 };
395 
396 //---------------------------- user-facing interface ----------
397 namespace details {
398  template <typename T, typename U = T>
400  template <typename T, typename U = T>
402 } // namespace details
403 
404 template <typename T>
406  template <typename... Args, std::size_t... Is>
407  DataObjectReadHandle( std::tuple<Args...>&& args, std::index_sequence<Is...> )
408  : DataObjectReadHandle( std::get<Is>( std::move( args ) )... ) {}
409 
410 public:
412  : ::details::ReadHandle<T>{ k, Gaudi::DataHandle::Reader, owner } {}
413 
416  template <typename OWNER, typename K, typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
417  DataObjectReadHandle( OWNER* owner, std::string propertyName, K key = {}, std::string doc = "" )
419  std::move( doc ) ) {}
420 
421  template <typename... Args>
423  : DataObjectReadHandle( std::move( args ), std::index_sequence_for<Args...>{} ) {}
424 };
425 
426 template <typename T, typename U = T>
428  template <typename... Args, std::size_t... Is>
429  DataObjectWriteHandle( std::tuple<Args...>&& args, std::index_sequence<Is...> )
430  : DataObjectWriteHandle( std::get<Is>( std::move( args ) )... ) {}
431 
432 public:
434  : ::details::WriteHandle<T, U>{ k, Gaudi::DataHandle::Writer, owner } {}
435 
438  template <typename OWNER, typename K, typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
439  DataObjectWriteHandle( OWNER* owner, std::string propertyName, K key = {}, std::string doc = "" )
441  std::move( doc ) ) {}
442 
443  template <typename... Args>
445  : DataObjectWriteHandle( std::move( args ), std::index_sequence_for<Args...>{} ) {}
446 };
IDataHandleHolder
Definition: IDataHandleHolder.h:24
GaudiAlg.Algs._get
def _get(self, location)
Definition: Algs.py:415
details::WriteHandle
DataObjectHandle< Payload_t< Gaudi::DataHandle::Writer, T, U > > WriteHandle
Definition: DataObjectHandle.h:399
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(OWNER *owner, std::string propertyName, K key={}, std::string doc="")
Autodeclaring constructor with property name, mode, key and documentation.
Definition: DataObjectHandle.h:439
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:372
DataObjectWriteHandle
Definition: DataObjectHandle.h:427
DataObjectHandle< Gaudi::Range_< T > >::ValueType
std::remove_cv_t< std::remove_pointer_t< typename T::value_type > > ValueType
Definition: DataObjectHandle.h:196
std::string
STL class.
AnyDataWrapper.h
DataObjectHandle::m_goodType
bool m_goodType
Definition: DataObjectHandle.h:148
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(std::tuple< Args... > &&args, std::index_sequence< Is... >)
Definition: DataObjectHandle.h:429
Gaudi::NamedRange_
Definition: NamedRange.h:52
std::move
T move(T... args)
bug_34121.name
name
Definition: bug_34121.py:20
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
DataObjectHandle::getOrCreate
T * getOrCreate() const
Get object from store or create a new one if it doesn't exist.
Definition: DataObjectHandle.h:185
GaudiException.h
DataObjectHandle< Gaudi::NamedRange_< T > >::ValueType
std::remove_cv_t< std::remove_pointer_t< typename T::value_type > > ValueType
Definition: DataObjectHandle.h:241
GaudiException
Definition: GaudiException.h:31
GaudiPartProp.decorators.get
get
decorate the vector of properties
Definition: decorators.py:282
NamedRange.h
DataObjectHandle< AnyDataWrapper< T > >::put
const T * put(T &&obj) const
Register object in transient store.
Definition: DataObjectHandle.h:299
NewInputWrite.fetch
fetch
Definition: NewInputWrite.py:45
std::unique_ptr::get
T get(T... args)
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(OWNER *owner, std::string propertyName, K key={}, std::string doc="")
Autodeclaring constructor with property name, mode, key and documentation.
Definition: DataObjectHandle.h:417
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:525
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:313
details::Payload_helper
Definition: DataObjectHandle.h:71
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:124
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::getIfExists
View * getIfExists() const
Definition: DataObjectHandle.h:348
DataObjectHandle< AnyDataWrapper< T > >::get
T * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:290
GaudiPluginService.cpluginsvc.registry
def registry()
Definition: cpluginsvc.py:83
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::get
T * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:113
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:379
DataObjectHandle::put
T * put(T *object) const
Definition: DataObjectHandle.h:136
DataObjectHandleBase
DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h.
Definition: DataObjectHandleBase.h:35
DataObjectReadHandle
Definition: DataObjectHandle.h:405
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:161
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(const DataObjID &k, IDataHandleHolder *owner)
Definition: DataObjectHandle.h:411
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:433
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:311
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:313
Gaudi::Range_
Definition: Range.h:95
DataObjectWriteHandle::DataObjectWriteHandle
DataObjectWriteHandle(std::tuple< Args... > &&args)
Definition: DataObjectHandle.h:444
DataObjectHandle::put
T * put(std::unique_ptr< T > object) const
Register object in transient store.
Definition: DataObjectHandle.h:176
gaudirun.args
args
Definition: gaudirun.py:336
IDataHandleHolder.h
std::begin
T begin(T... args)
Tuples::Type
Type
Definition: TupleObj.h:91
std
STL namespace.
details::Payload_t
typename Payload_helper< mode, T, U >::type Payload_t
Definition: DataObjectHandle.h:87
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
DataObjectHandleBase::DataObjectHandleBase
DataObjectHandleBase(DataObjID k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)
Definition: DataObjectHandleBase.cpp:47
std::size_t
IProperty.h
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::get
View * get() const
Retrieve object from transient data store.
Definition: DataObjectHandle.h:347
std::end
T end(T... args)
DataObjectHandle::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:140
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:119
DataObjectHandle< AnyDataWrapper< T > >::getIfExists
T * getIfExists() const
Definition: DataObjectHandle.h:291
DataObjectHandle< AnyDataWrapper< T > >::_get
AnyDataWrapper< T > * _get(bool mustExist) const
Definition: DataObjectHandle.h:320
details::ReadHandle
DataObjectHandle< Payload_t< Gaudi::DataHandle::Reader, T, U > > ReadHandle
Definition: DataObjectHandle.h:401
DataObjectHandle< AnyDataWithViewWrapper< View, Owned > >::put
const View * put(std::unique_ptr< AnyDataWithViewWrapper< View, Owned >> objectp) const
Register object in transient store.
Definition: DataObjectHandle.h:356
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:363
std::unique_ptr
STL class.
ProduceConsume.key
key
Definition: ProduceConsume.py:81
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:82
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(std::tuple< Args... > &&args, std::index_sequence< Is... >)
Definition: DataObjectHandle.h:407
DataObjectReadHandle::DataObjectReadHandle
DataObjectReadHandle(std::tuple< Args... > &&args)
Definition: DataObjectHandle.h:422
compareOutputFiles.Reader
Reader
Definition: compareOutputFiles.py:488
Gaudi::Functional::details::put
auto put(const DataObjectHandle< Out1 > &out_handle, Out2 &&out)
Definition: details.h:169
DataObjectHandle< Gaudi::NamedRange_< T > >::pythonRepr
std::string pythonRepr() const override
Definition: DataObjectHandle.h:251
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:370
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:206