Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
SG::WriteHandle< T > Class Template Reference

#include <WriteHandle.h>

Inheritance diagram for SG::WriteHandle< T >:
Collaboration diagram for SG::WriteHandle< T >:

Public Types

typedef T * pointer_type
 
typedef const T * const_pointer_type
 
typedef T & reference_type
 
typedef const T & const_reference_type
 

Public Member Functions

 WriteHandle ()
 Default constructor. More...
 
 WriteHandle (const std::string &sgkey, const std::string &storename=StoreID::storeName(StoreID::EVENT_STORE))
 Constructor specifying the key as a string. More...
 
 WriteHandle (const std::string &sgkey, const EventContext &ctx)
 Constructor specifying the key as a string, with context. More...
 
 WriteHandle (const std::string &sgkey, const std::string &storename, const EventContext &ctx)
 Constructor specifying the key as a string, with context. More...
 
 WriteHandle (const WriteHandleKey< T > &key)
 Constructor from a WriteHandleKey. More...
 
 WriteHandle (const WriteHandleKey< T > &key, const EventContext &ctx)
 Constructor from a WriteHandleKey and an explicit event context. More...
 
 WriteHandle (SG::WriteHandleKey< T > &&key)=delete
 
 WriteHandle (SG::WriteHandleKey< T > &&key, const EventContext &ctx)=delete
 
 WriteHandle (const WriteHandle &rhs)
 Copy constructor. More...
 
 WriteHandle (WriteHandle &&rhs)
 Move constructor. More...
 
WriteHandleoperator= (const WriteHandle &rhs)
 Assignment operator. More...
 
WriteHandleoperator= (WriteHandle &&rhs)
 Move operator. More...
 
 ~WriteHandle ()
 Destructor. More...
 
pointer_type operator-> ()
 Dereference the pointer. More...
 
reference_type operator* ()
 Dereference the pointer. More...
 
const_pointer_type cptr () const
 Dereference the pointer. More...
 
pointer_type ptr ()
 Dereference the pointer. More...
 
pointer_type cachedPtr ()
 Return the cached pointer directly; no lookup. More...
 
virtual bool isValid () override final
 Can the handle be successfully dereferenced? More...
 
StatusCode record (std::unique_ptr< T > data)
 Record a const object to the store. More...
 
StatusCode recordNonConst (std::unique_ptr< T > data)
 Record a non-const object to the store. More...
 
template<class AUXSTORE >
StatusCode record (std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > store)
 Record a const object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
StatusCode recordNonConst (std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > store)
 Record a non-const object and its auxiliary store to the store. More...
 
StatusCode record (SG::DataObjectSharedPtr< T > data)
 Record a const shared DataObject to the store. More...
 
StatusCode recordNonConst (SG::DataObjectSharedPtr< T > data)
 Record a non-const shared DataObject to the store. More...
 
const_pointer_type put (std::unique_ptr< T > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (std::unique_ptr< const T > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (std::unique_ptr< const ConstDataVector< T > > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (const EventContext &ctx, std::unique_ptr< const ConstDataVector< T > > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (const EventContext &ctx, std::unique_ptr< T > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (const EventContext &ctx, std::unique_ptr< const T > data, bool returnExisting=false) const
 Record an object to the store. More...
 
const_pointer_type put (SG::DataObjectSharedPtr< T > data) const
 Record an object to the store. More...
 
const_pointer_type put (const EventContext &ctx, SG::DataObjectSharedPtr< T > data) const
 Record an object to the store. More...
 
template<class AUXSTORE >
const_pointer_type put (std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > auxstore) const
 Record an object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
const_pointer_type put (std::unique_ptr< const T > data, std::unique_ptr< const AUXSTORE > auxstore) const
 Record an object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
const_pointer_type put (const EventContext &ctx, std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > auxstore) const
 Record an object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
const_pointer_type put (const EventContext &ctx, std::unique_ptr< const T > data, std::unique_ptr< const AUXSTORE > auxstore) const
 Record an object and its auxiliary store to the store. More...
 
WriteHandleoperator= (std::unique_ptr< T > data)
 Alternate notation for record. More...
 
StatusCode alias (const WriteHandleKey< T > &key)
 Make an alias. More...
 
template<class U >
StatusCode symLink (const WriteHandleKey< U > &key)
 Make an explicit link. More...
 
virtual const std::string & key () const override final
 Return the StoreGate ID for the referenced object. More...
 
const std::string & name () const
 Return the StoreGate ID for the referenced object. More...
 
std::string store () const
 Return the name of the store holding the object we are proxying. More...
 
bool isPresent () const
 Is the referenced object present in SG? More...
 
bool isInitialized () const
 Has a proxy been retrieved from SG? More...
 
virtual bool isSet () const override final
 Has a proxy been retrieved from SG? More...
 
bool isConst () const
 True if this handle has a proxy, and the proxy is const. More...
 
StatusCode initialize (bool used=true)
 Verify that the handle has been configured properly. More...
 
StatusCode setState ()
 Retrieve and cache all information managed by a handle. More...
 
virtual StatusCode setProxyDict (IProxyDict *store)
 Explicitly set the event store. More...
 
virtual void reset (bool hard) override
 Reset this handle. More...
 
virtual void finalReset () override final
 Reset this handle at the end of processing. More...
 
StatusCode setConst ()
 Set the 'const' bit for the bound proxy in the store. More...
 
CLID clid () const
 Return the class ID for the referenced object. More...
 
const ServiceHandle< IProxyDict > & storeHandle () const
 Return handle to the referenced store. More...
 
Gaudi::DataHandle::Mode mode () const
 Return the mode (read/write/update) for this handle. More...
 
const std::string & objKey () const
 Return the key string of the underlying DataObjID. More...
 
const DataObjID & fullKey () const
 Return the key as a DataObjID. More...
 
SG::VarHandleKeyvhKey ()
 Return a non-const reference to the HandleKey. More...
 
StatusCode assign (const std::string &sgkey)
 Update the underlying key from a string. More...
 

Protected Member Functions

StatusCode setState (SG::DataProxy *proxy)
 Set the state of the handle to a given proxy. More...
 
StatusCode setState (IProxyDict *store, const std::string &name)
 Set the state of a handle from a store and a key name. More...
 
StatusCode record_impl (std::unique_ptr< DataObject > dobj, void *dataPtr, bool allowMods, bool returnExisting)
 Helper to record an object in the event store. More...
 
const void * put_impl (const EventContext *ctx, std::unique_ptr< DataObject > dobj, const void *dataPtr, bool allowMods, bool returnExisting, IProxyDict *&store) const
 Helper to record an object in the event store. More...
 
void * typeless_dataPointer_impl (bool quiet)
 Retrieve an object from StoreGate. More...
 
void * typeless_dataPointer (bool quiet=defaultQuiet)
 Retrieve an object from StoreGate. More...
 
const void * typeless_cptr ()
 Retrieve an object from StoreGate as a const pointer. More...
 
void * typeless_ptr (bool quiet=defaultQuiet)
 Retrieve an object from StoreGate as non-const pointer. More...
 
const void * get_impl (const EventContext *ctx, bool quiet=defaultQuiet) const
 
StatusCode symLink_impl (CLID newClid, const std::string &newKey)
 Make a symlink or alias to the object currently referenced by this handle. More...
 
bool isPresent_impl (const std::string &key) const
 Is the referenced object present in SG? More...
 

Protected Attributes

void * m_ptr
 The object to which we are bound. More...
 
SG::DataProxym_proxy
 Proxy holding the object to which we are bound. More...
 
IProxyDictm_store
 Pointer to the store that owns the object. More...
 
bool m_storeWasSet
 True if the store was set explicitly via setProxyDict. More...
 

Private Member Functions

pointer_type checkedCachedPtr ()
 Return the cached pointer directly. More...
 
template<class U >
StatusCode doRecord (U data, bool isConst, bool returnExisting)
 Helper for record. More...
 
template<class U >
const_pointer_type doPut (const EventContext *ctx, U data, bool returnExisting, IProxyDict *&store) const
 Helper for put. More...
 
template<class AUXSTORE >
WriteHandle< T >::const_pointer_type doPut (const EventContext *ctx, std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > auxstore) const
 Helper for recording an object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
WriteHandle< T >::const_pointer_type doPut (const EventContext *ctx, std::unique_ptr< const T > data, std::unique_ptr< const AUXSTORE > auxstore) const
 Helper for recording an object and its auxiliary store to the store. More...
 
template<class AUXSTORE >
StatusCode record (std::unique_ptr< T > data, std::unique_ptr< AUXSTORE > auxstore, bool isConst)
 Record an object and its auxiliary store to the store. More...
 
IProxyDictstoreFromHandle (const EventContext *ctx) const
 Return the store instance to use. More...
 
bool setStoreFromHandle (const EventContext *ctx)
 Initialize the store pointer from the store handle. More...
 
void resetProxy ()
 Clear the m_proxy field and release the old proxy. More...
 
void setProxy (SG::DataProxy *proxy)
 Set a new proxy. More...
 
void * typeless_dataPointer_fromProxy (SG::DataProxy *proxy, bool quiet) const
 Retrieve a pointer from a proxy. More...
 

Private Attributes

SG::DataProxym_lockAuxPending = nullptr
 If non-null, then we need to lock the associated aux store object when we're deleted. More...
 
std::unique_ptr< VarHandleKeym_ownedKey
 An owned VarHandleKey. More...
 
const VarHandleKeym_key
 The associated key object. More...
 

Detailed Description

template<class T>
class SG::WriteHandle< T >

Definition at line 71 of file StoreGate/StoreGate/WriteHandle.h.

Member Typedef Documentation

◆ const_pointer_type

template<class T >
typedef const T* SG::WriteHandle< T >::const_pointer_type

Definition at line 76 of file StoreGate/StoreGate/WriteHandle.h.

◆ const_reference_type

template<class T >
typedef const T& SG::WriteHandle< T >::const_reference_type

Definition at line 78 of file StoreGate/StoreGate/WriteHandle.h.

◆ pointer_type

template<class T >
typedef T* SG::WriteHandle< T >::pointer_type

Definition at line 75 of file StoreGate/StoreGate/WriteHandle.h.

◆ reference_type

template<class T >
typedef T& SG::WriteHandle< T >::reference_type

Definition at line 77 of file StoreGate/StoreGate/WriteHandle.h.

Constructor & Destructor Documentation

◆ WriteHandle() [1/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( )

Default constructor.

The handle will not be usable until a non-blank key is assigned.

◆ WriteHandle() [2/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const std::string &  sgkey,
const std::string &  storename = StoreID::storeName(StoreID::EVENT_STORE) 
)
explicit

Constructor specifying the key as a string.

Parameters
sgkeyStoreGate key of the referenced object.
storenameName of the referenced event store.

◆ WriteHandle() [3/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const std::string &  sgkey,
const EventContext &  ctx 
)
explicit

Constructor specifying the key as a string, with context.

Parameters
sgkeyStoreGate key of the referenced object.
ctxThe event context.

◆ WriteHandle() [4/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const std::string &  sgkey,
const std::string &  storename,
const EventContext &  ctx 
)
explicit

Constructor specifying the key as a string, with context.

Parameters
sgkeyStoreGate key of the referenced object.
storenameName of the referenced event store.
ctxThe event context.

◆ WriteHandle() [5/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const WriteHandleKey< T > &  key)
explicit

Constructor from a WriteHandleKey.

Parameters
keyThe key object holding the clid/key/store.

This will raise an exception if the StoreGate key is blank, or if the event store cannot be found.

◆ WriteHandle() [6/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const WriteHandleKey< T > &  key,
const EventContext &  ctx 
)
explicit

Constructor from a WriteHandleKey and an explicit event context.

Parameters
keyThe key object holding the clid/key.
ctxThe event context.

This will raise an exception if the StoreGate key is blank, or if the event store cannot be found.

If the default event store has been requested, then the thread-specific store from the event context will be used.

◆ WriteHandle() [7/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( SG::WriteHandleKey< T > &&  key)
explicitdelete

◆ WriteHandle() [8/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( SG::WriteHandleKey< T > &&  key,
const EventContext &  ctx 
)
explicitdelete

◆ WriteHandle() [9/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( const WriteHandle< T > &  rhs)

Copy constructor.

◆ WriteHandle() [10/10]

template<class T >
SG::WriteHandle< T >::WriteHandle ( WriteHandle< T > &&  rhs)

Move constructor.

◆ ~WriteHandle()

template<class T >
SG::WriteHandle< T >::~WriteHandle ( )

Destructor.

Lock an aux object if m_lockAuxPending is set.

Member Function Documentation

◆ alias()

template<class T >
StatusCode SG::WriteHandle< T >::alias ( const WriteHandleKey< T > &  key)

Make an alias.

Parameters
keyAlternate key by which the referenced object should be known.

The current handle should be valid and referencing an object (i.e., record should have been called on it).

The object will also be known by the name given in key.

◆ assign()

StatusCode SG::VarHandleBase::assign ( const std::string &  sgkey)
inherited

Update the underlying key from a string.

If this handle was initialized from a HandleKey, then this doesn't work (since the HandleKey is const). ExcNonConstHandleKey will be thrown in that case.

See VarHandleKey::assign.

Definition at line 648 of file StoreGate/src/VarHandleBase.cxx.

649  {
650  return vhKey().assign (sgkey);
651  }

◆ cachedPtr()

template<class T >
pointer_type SG::WriteHandle< T >::cachedPtr ( )

Return the cached pointer directly; no lookup.

◆ checkedCachedPtr()

template<class T >
pointer_type SG::WriteHandle< T >::checkedCachedPtr ( )
private

Return the cached pointer directly.

If it is null, throw ExcNullWriteHandle.

◆ clid()

CLID SG::VarHandleBase::clid ( ) const
inherited

Return the class ID for the referenced object.

◆ cptr()

template<class T >
const_pointer_type SG::WriteHandle< T >::cptr ( ) const

Dereference the pointer.

Returns the cached pointer.

◆ doPut() [1/3]

template<class T >
template<class AUXSTORE >
WriteHandle<T>::const_pointer_type SG::WriteHandle< T >::doPut ( const EventContext *  ctx,
std::unique_ptr< const T >  data,
std::unique_ptr< const AUXSTORE >  auxstore 
) const
private

Helper for recording an object and its auxiliary store to the store.

Parameters
ctxThe event context, or nullptr to use the current context.
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

◆ doPut() [2/3]

template<class T >
template<class AUXSTORE >
WriteHandle<T>::const_pointer_type SG::WriteHandle< T >::doPut ( const EventContext *  ctx,
std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  auxstore 
) const
private

Helper for recording an object and its auxiliary store to the store.

Parameters
ctxThe event context, or nullptr to use the current context.
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

◆ doPut() [3/3]

template<class T >
template<class U >
const_pointer_type SG::WriteHandle< T >::doPut ( const EventContext *  ctx,
data,
bool  returnExisting,
IProxyDict *&  store 
) const
private

Helper for put.

Parameters
ctxThe event context, or nullptr to use the current context.
dataThe object to record.
returnExistingAllow an existing object.
[out]storeThe store being used.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ doRecord()

template<class T >
template<class U >
StatusCode SG::WriteHandle< T >::doRecord ( data,
bool  isConst,
bool  returnExisting 
)
private

Helper for record.

Parameters
dataThe object to record.
isConstIf true, record the object as const.
returnExistingAllow an existing object.

◆ finalReset()

void SG::VarHandleBase::finalReset ( )
finaloverridevirtualinherited

Reset this handle at the end of processing.

hard If true, anything depending on the event store is cleared.

Same as reset(true);

Reimplemented from IResetable.

Definition at line 601 of file StoreGate/src/VarHandleBase.cxx.

601  {
602 #ifdef DEBUG_VHB
603  dbg::print(stderr, "::VHB::finalReset {} with proxy={}, key={}, store={}\n", dbg::ptr(this), dbg::proxy(m_proxy), this->key(), dbg::store(this->m_store));
604 #endif
605  reset (true);
606  }

◆ fullKey()

const DataObjID& SG::VarHandleBase::fullKey ( ) const
inherited

Return the key as a DataObjID.

◆ get_impl()

const void * SG::VarHandleBase::get_impl ( const EventContext *  ctx,
bool  quiet = defaultQuiet 
) const
protectedinherited

Definition at line 882 of file StoreGate/src/VarHandleBase.cxx.

884  {
885  if (this->mode() != Gaudi::DataHandle::Reader) {
886  if (!quiet)
887  REPORT_ERROR (StatusCode::FAILURE)
888  << "get_impl called for a non-read handle.";
889  return nullptr;
890  }
891 
892  if (this->key().empty()) {
893  if (!quiet)
894  REPORT_ERROR (StatusCode::FAILURE)
895  << "Cannot initialize a Read/Write/Update handle with a null key.";
896  return nullptr;
897  }
898 
900  if (!store) {
901  if (!quiet)
902  REPORT_ERROR (StatusCode::FAILURE) << "No store.";
903  return nullptr;
904  }
905 
906  SG::DataProxy* proxy = store->proxy_exact(m_key->hashedKey());
907  if (!proxy) {
908  proxy = store->proxy(this->clid(), this->key());
909  if (!proxy) {
910  if (!quiet)
911  REPORT_ERROR (StatusCode::FAILURE)
912  << "Cannot find proxy for "
913  << this->clid() << "/" << this->key();
914  return nullptr;
915  }
916  }
917 
918  return typeless_dataPointer_fromProxy (proxy, quiet);
919  }

◆ initialize()

StatusCode SG::VarHandleBase::initialize ( bool  used = true)
inherited

Verify that the handle has been configured properly.

Parameters
usedIf false, then this handle is not to be used. Instead of normal initialization, the key will be cleared.

This will return failure if the key is blank or if the event store cannot be found.

Definition at line 458 of file StoreGate/src/VarHandleBase.cxx.

459  {
460  if (!used) {
461  if (m_ownedKey) {
462  CHECK( m_ownedKey->initialize (used) );
463  }
464  return StatusCode::SUCCESS;
465  }
466 
467  if (!m_store) {
468  if (m_ownedKey) {
469  CHECK( m_ownedKey->initialize() );
470  }
471  m_store = &*(this->storeHandle());
472  m_storeWasSet = false;
473  }
474 
475  if (!m_store) {
476  return StatusCode::FAILURE;
477  }
478 
479  return StatusCode::SUCCESS;
480  }

◆ isConst()

bool SG::VarHandleBase::isConst ( ) const
inherited

True if this handle has a proxy, and the proxy is const.

Refers to the state of the proxy, not of the handle.

Definition at line 438 of file StoreGate/src/VarHandleBase.cxx.

439  {
440 #ifdef DEBUG_VHB
441  dbg::print(stderr, "::VHB::isConst({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(m_proxy));
442 #endif
443  return 0 != m_proxy
444  ? m_proxy->isConst()
445  : false;
446  }

◆ isInitialized()

bool SG::VarHandleBase::isInitialized ( ) const
inherited

Has a proxy been retrieved from SG?

(Weaker test than isValid, but does not touch the disk.)

Definition at line 412 of file StoreGate/src/VarHandleBase.cxx.

413  {
414 #ifdef DEBUG_VHB
415  dbg::print(stderr, "::VHB::isInitialized({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(m_proxy));
416 #endif
417  return (0 != m_proxy);
418  }

◆ isPresent()

bool SG::VarHandleBase::isPresent ( ) const
inherited

Is the referenced object present in SG?

Const method; the handle does not change as a result of this.

Definition at line 400 of file StoreGate/src/VarHandleBase.cxx.

401  {
402  return isPresent_impl (key());
403  }

◆ isPresent_impl()

bool SG::VarHandleBase::isPresent_impl ( const std::string &  key) const
protectedinherited

Is the referenced object present in SG?

Parameters
keySG key to test.

Const method; the handle does not change as a result of this.

Definition at line 1107 of file StoreGate/src/VarHandleBase.cxx.

1108  {
1109  const DataProxy* proxy = m_proxy;
1110  if (!proxy) {
1111  const IProxyDict* store = m_store;
1112  if (!store)
1113  store = this->storeHandle().get();
1114  if (store)
1115  proxy = store->proxy(this->clid(), key);
1116  }
1117  if (proxy) {
1118  return proxy->isValid();
1119  }
1120  return false;
1121  }

◆ isSet()

bool SG::VarHandleBase::isSet ( ) const
finaloverridevirtualinherited

Has a proxy been retrieved from SG?

Same as isInitialized; this is an interface required by IResetable.

Implements IResetable.

Definition at line 426 of file StoreGate/src/VarHandleBase.cxx.

427  {
428  return isInitialized();
429  }

◆ isValid()

template<class T >
virtual bool SG::WriteHandle< T >::isValid ( )
finaloverridevirtual

Can the handle be successfully dereferenced?

Implements SG::VarHandleBase.

◆ key()

const std::string & SG::VarHandleBase::key ( ) const
finaloverridevirtualinherited

Return the StoreGate ID for the referenced object.

This is defined in VarHandleKey. We need to redefine it here because it's also in IResetable. (Otherwise there would be an ambiguity.)

Implements IResetable.

Definition at line 64 of file AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx.

65  {
66  return m_key->key();
67  }

◆ mode()

Gaudi::DataHandle::Mode SG::VarHandleBase::mode ( ) const
inherited

Return the mode (read/write/update) for this handle.

◆ name()

const std::string & SG::VarHandleBase::name ( ) const
inherited

Return the StoreGate ID for the referenced object.

A synonym for key().

Definition at line 75 of file AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx.

76  {
77  return this->key();
78  }

◆ objKey()

const std::string& SG::VarHandleBase::objKey ( ) const
inherited

Return the key string of the underlying DataObjID.

Compared to key(), this will be prefixed with the store name.

◆ operator*()

template<class T >
reference_type SG::WriteHandle< T >::operator* ( )

Dereference the pointer.

Returns the cached pointer. Throws ExcNullWriteHandle if null.

◆ operator->()

template<class T >
pointer_type SG::WriteHandle< T >::operator-> ( )

Dereference the pointer.

Returns the cached pointer. Throws ExcNullWriteHandle if null.

◆ operator=() [1/3]

template<class T >
WriteHandle& SG::WriteHandle< T >::operator= ( const WriteHandle< T > &  rhs)

Assignment operator.

◆ operator=() [2/3]

template<class T >
WriteHandle& SG::WriteHandle< T >::operator= ( std::unique_ptr< T >  data)

Alternate notation for record.

Records a non-const object.

Parameters
dataObject to record.

Throws an exception on failure.

◆ operator=() [3/3]

template<class T >
WriteHandle& SG::WriteHandle< T >::operator= ( WriteHandle< T > &&  rhs)

Move operator.

◆ ptr()

template<class T >
pointer_type SG::WriteHandle< T >::ptr ( )

Dereference the pointer.

Returns the cached pointer.

◆ put() [1/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
SG::DataObjectSharedPtr< T >  data 
) const

Record an object to the store.

Parameters
ctxThe event context to use.
dataThe object to record.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error.

The event store takes shared ownership of the object.

◆ put() [2/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
std::unique_ptr< const ConstDataVector< T > >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
ctxThe event context to use.
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [3/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
std::unique_ptr< const T >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
ctxThe event context to use.
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [4/12]

template<class T >
template<class AUXSTORE >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
std::unique_ptr< const T >  data,
std::unique_ptr< const AUXSTORE >  auxstore 
) const

Record an object and its auxiliary store to the store.

Parameters
ctxThe event context to use.
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

Unlike the version taking unique_ptr<T>, this does not alter the store pointer of data.

◆ put() [5/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
std::unique_ptr< T >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
ctxThe event context to use.
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [6/12]

template<class T >
template<class AUXSTORE >
const_pointer_type SG::WriteHandle< T >::put ( const EventContext &  ctx,
std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  auxstore 
) const

Record an object and its auxiliary store to the store.

Parameters
ctxThe event context to use.
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

◆ put() [7/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( SG::DataObjectSharedPtr< T >  data) const

Record an object to the store.

Parameters
dataThe object to record.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error.

The event store takes shared ownership of the object.

◆ put() [8/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( std::unique_ptr< const ConstDataVector< T > >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [9/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( std::unique_ptr< const T >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [10/12]

template<class T >
template<class AUXSTORE >
const_pointer_type SG::WriteHandle< T >::put ( std::unique_ptr< const T >  data,
std::unique_ptr< const AUXSTORE >  auxstore 
) const

Record an object and its auxiliary store to the store.

Parameters
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

Unlike the version taking unique_ptr<T>, this does not alter the store pointer of data.

◆ put() [11/12]

template<class T >
const_pointer_type SG::WriteHandle< T >::put ( std::unique_ptr< T >  data,
bool  returnExisting = false 
) const

Record an object to the store.

Parameters
dataThe object to record.
returnExistingAllow an existing object?

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, data is destroyed.

◆ put() [12/12]

template<class T >
template<class AUXSTORE >
const_pointer_type SG::WriteHandle< T >::put ( std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  auxstore 
) const

Record an object and its auxiliary store to the store.

Parameters
dataThe object to record.
auxstoreAuxiliary store object.

Unlike record(), this does not change the handle object. That means that one will not be able to get the object back by dereferencing the handle. Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, and the objects passed in are destroyed.

◆ put_impl()

const void * SG::VarHandleBase::put_impl ( const EventContext *  ctx,
std::unique_ptr< DataObject >  dobj,
const void *  dataPtr,
bool  allowMods,
bool  returnExisting,
IProxyDict *&  store 
) const
protectedinherited

Helper to record an object in the event store.

Unlike record, put does not change the handle and does not cache the pointer in the handle.

Parameters
ctxThe event context, or nullptr to use the current context.
dobjThe wrapped data object (DataBucket) to record.
dataPtrPointer to the transient object itself.
allowModsIf false, record the object as const.
returnExistingAllow an existing object.
[out]storeThe store being used.

Returns the object placed in the store, or nullptr if there was an error. If there was already an object in the store with the given key, then return null, unless returnExisting is true, in which case return success. In either case, dobj is destroyed.

Definition at line 788 of file StoreGate/src/VarHandleBase.cxx.

794  {
795  if (this->name().empty()) {
796  REPORT_ERROR (StatusCode::FAILURE) << "Attempt to record an object with a null key";
797  return nullptr;
798  }
799 
800  store = storeFromHandle (ctx);
801  if (!store) {
802  REPORT_ERROR (StatusCode::FAILURE) << "No store.";
803  return nullptr;
804  }
805 
806  SG::DataObjectSharedPtr<DataObject> sptr (std::move (dobj));
807  unsigned int initRefCount = sptr->refCount();
808  SG::DataProxy* new_proxy =
809  store->recordObject (sptr, this->name(), allowMods, returnExisting);
810  if (!new_proxy) {
811  REPORT_ERROR (StatusCode::FAILURE) << "recordObject failed";
812  return nullptr;
813  }
814 
815  if (new_proxy && initRefCount == sptr->refCount() && new_proxy->isValid()) {
816  // If the reference count hasn't changed, then we've returned an existing
817  // object rather than recording a new one. Retrieve the pointer.
818  dataPtr = typeless_dataPointer_fromProxy (new_proxy, true);
819  }
820 
821  return dataPtr;
822  }

◆ record() [1/4]

template<class T >
StatusCode SG::WriteHandle< T >::record ( SG::DataObjectSharedPtr< T >  data)

Record a const shared DataObject to the store.

Parameters
dataThe object to record.

The event store takes shared ownership of the object.

◆ record() [2/4]

template<class T >
StatusCode SG::WriteHandle< T >::record ( std::unique_ptr< T >  data)

Record a const object to the store.

Parameters
dataThe object to record.

◆ record() [3/4]

template<class T >
template<class AUXSTORE >
StatusCode SG::WriteHandle< T >::record ( std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  auxstore,
bool  isConst 
)
private

Record an object and its auxiliary store to the store.

Parameters
dataThe object to record.
auxstoreAuxiliary store object.
isConstIf true, record the objects as const.

◆ record() [4/4]

template<class T >
template<class AUXSTORE >
StatusCode SG::WriteHandle< T >::record ( std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  store 
)

Record a const object and its auxiliary store to the store.

Parameters
dataThe object to record.
auxstoreAuxiliary store object.

◆ record_impl()

StatusCode SG::VarHandleBase::record_impl ( std::unique_ptr< DataObject >  dobj,
void *  dataPtr,
bool  allowMods,
bool  returnExisting 
)
protectedinherited

Helper to record an object in the event store.

Parameters
Thewrapped data object (DataBucket) to record.
dataPtrPointer to the transient object itself.
allowModsIf false, record the object as const.
returnExistingAllow an existing object.

If there is already an existing object with our key, then return failure, unless returnExisting is true, in which case return success. In either case, dobj is destroyed.

Definition at line 719 of file StoreGate/src/VarHandleBase.cxx.

723  {
724  if (!m_store) {
725  if (m_ownedKey) {
726  CHECK (m_ownedKey->initialize());
727  }
728  m_store = &*(this->storeHandle());
729  m_storeWasSet = false;
730  }
731 
732  if (this->name().empty()) {
733  REPORT_ERROR (StatusCode::FAILURE) << "Attempt to record an object with a null key";
734  return StatusCode::FAILURE;
735  }
736 
737  SG::DataObjectSharedPtr<DataObject> sptr (dobj.release());
738  unsigned int initRefCount = sptr->refCount();
739  SG::DataProxy* new_proxy =
740  m_store->recordObject (sptr, this->name(), allowMods, returnExisting);
741  if (!new_proxy) {
742  REPORT_ERROR (StatusCode::FAILURE) << "recordObject failed";
743  resetProxy();
744  return StatusCode::FAILURE;
745  }
746  if (m_proxy != new_proxy) {
747  CHECK (this->setState (new_proxy));
748  }
749 
750  if (new_proxy && initRefCount == sptr->refCount() && new_proxy->isValid()) {
751  // If the reference count hasn't changed, then we've returned an existing
752  // object rather than recording a new one. Retrieve the pointer, making
753  // sure that it isn't const.
754  if (m_proxy->isConst()) {
755  REPORT_ERROR (StatusCode::FAILURE)
756  << "Found an existing const object from recordOrRetrieve.";
757  return StatusCode::FAILURE;
758  }
760  if (!allowMods)
761  CHECK( setConst() );
762  }
763  else
764  m_ptr=(void*)dataPtr;
765 
766  return StatusCode::SUCCESS;
767  }

◆ recordNonConst() [1/3]

template<class T >
StatusCode SG::WriteHandle< T >::recordNonConst ( SG::DataObjectSharedPtr< T >  data)

Record a non-const shared DataObject to the store.

Parameters
dataThe object to record.

The event store takes shared ownership of the object.

◆ recordNonConst() [2/3]

template<class T >
StatusCode SG::WriteHandle< T >::recordNonConst ( std::unique_ptr< T >  data)

Record a non-const object to the store.

Parameters
dataThe object to record.

◆ recordNonConst() [3/3]

template<class T >
template<class AUXSTORE >
StatusCode SG::WriteHandle< T >::recordNonConst ( std::unique_ptr< T >  data,
std::unique_ptr< AUXSTORE >  store 
)

Record a non-const object and its auxiliary store to the store.

Parameters
dataThe object to record.
auxstoreAuxiliary store object.

◆ reset()

void SG::VarHandleBase::reset ( bool  hard)
overridevirtualinherited

Reset this handle.

Parameters
hardIf true, anything depending on the event store is cleared.

If the handle stays associated with a given event store, then hard=false. In that case, we clear the cached pointer; the proxy is also dropped if it is reset only. If hard=true, then we always drop the proxy and in addition clear the cached pointer to the event store.

Implements IResetable.

Reimplemented in SG::UpdateHandle< T >.

Definition at line 576 of file StoreGate/src/VarHandleBase.cxx.

576  {
577 #ifdef DEBUG_VHB
578  dbg::print(stderr, "::VHB::reset {} with proxy={}, key={}, store={} (hard={})\n", dbg::ptr(this), dbg::proxy(m_proxy), this->key(), dbg::store(this->m_store), hard);
579 #endif
580  m_ptr = 0;
581 
582  if (hard) {
583  m_store = 0;
584  m_storeWasSet = false;
585  }
586 
587  //if the proxy is not resetOnly then release it as it will become invalid
588  // Also release on a hard reset.
589  if (0 != m_proxy && (!m_proxy->isResetOnly() || hard)) {
590  resetProxy();
591  }
592  }

◆ resetProxy()

void SG::VarHandleBase::resetProxy ( )
privateinherited

Clear the m_proxy field and release the old proxy.

Definition at line 1010 of file StoreGate/src/VarHandleBase.cxx.

1011  {
1012  if (m_proxy) {
1013  if (m_ownedKey) {
1014  m_proxy->unbindHandle(this);
1015  m_proxy->release();
1016  }
1017  m_proxy = nullptr;
1018  }
1019  }

◆ setConst()

StatusCode SG::VarHandleBase::setConst ( )
inherited

Set the 'const' bit for the bound proxy in the store.

Definition at line 612 of file StoreGate/src/VarHandleBase.cxx.

613  {
614  if (typeless_dataPointer()) {
615  m_proxy->setConst();
616  return StatusCode::SUCCESS;
617  }
618  return StatusCode::FAILURE;
619  }

◆ setProxy()

void SG::VarHandleBase::setProxy ( SG::DataProxy proxy)
privateinherited

Set a new proxy.

Release any old one first.

Parameters
proxyThe new proxy.

Definition at line 1026 of file StoreGate/src/VarHandleBase.cxx.

1027  {
1028  resetProxy();
1029  if (proxy) {
1030  if (m_ownedKey) {
1031  proxy->addRef();
1032  proxy->bindHandle (this);
1033  }
1034  m_proxy = proxy;
1035  }
1036  }

◆ setProxyDict()

StatusCode SG::VarHandleBase::setProxyDict ( IProxyDict store)
virtualinherited

◆ setState() [1/3]

StatusCode SG::VarHandleBase::setState ( )
inherited

Retrieve and cache all information managed by a handle.

This will retrieve and cache the associated DataProxy.

Note for the case of a WriteHandle that has not yet been written to, the proxy may not exist. We return Success in that case; however, isInitialized will still return false.

Definition at line 493 of file StoreGate/src/VarHandleBase.cxx.

494  {
495  CHECK( initialize() );
496  if (!m_storeWasSet) {
497  IProxyDict* store = storeFromHandle (nullptr);
498  if (store) m_store = store;
499  }
500 
501 #ifdef DEBUG_VHB
502  dbg::print(stderr, "::VHB:: setState() on {} with key={} ({}) and store={} (CLID: {})\n", dbg::ptr(this), this->key(), m_key->hashedKey(), dbg::store(m_store), this->clid());
503 #endif
504 
506  if (!proxy) {
507 #ifdef DEBUG_VHB
508  dbg::print(stderr, "::VHB:: setState() on {} ==> null proxy!\n", dbg::ptr(this));
509 #endif
510  proxy = m_store->proxy(this->clid(), this->key());
511  }
512 
513  if (!proxy) {
514 #ifdef DEBUG_VHB
515  dbg::print(stderr, "::VHB:: setState() on {} ==> STILL null proxy!\n", dbg::ptr(this));
516 #endif
517  }
518  else if (!proxy->isValid()) {
519 #ifdef DEBUG_VHB
520  dbg::print(stderr, "::VHB:: setState() on {} ==> proxy not valid! Dumping Store\n", dbg::ptr(this));
521  if (!m_store) {
522  dbg::print(stderr, "::VHB:: setState() on {} ==> m_store is a nullptr\n", dbg::ptr(this));
523  }
524  else {
525  SGImplSvc* stor = dynamic_cast<SGImplSvc*>(m_store);
526  if (!stor) {
527  dbg::print(stderr, "::VHB:: setState() on {} ==> m_store points not to an SGImplSvc but to a {}\n", dbg::ptr(this), boost::core::demangle(typeid(*m_store).name()));
528  }
529  else {
530  dbg::print(stderr, "\n{}\n", stor->dump());
531  }
532  }
533 #endif
534  }
535  StatusCode sc = this->setState(proxy);
536 
537  // Failure to find the proxy is ok in the case of a @c WriteHandle
538  // that has not yet been written to.
539  if (sc.isFailure() && mode() == Gaudi::DataHandle::Writer && m_ptr == nullptr)
540  return StatusCode::SUCCESS;
541 
542  return sc;
543  }

◆ setState() [2/3]

StatusCode SG::VarHandleBase::setState ( IProxyDict store,
const std::string &  key 
)
protectedinherited

Set the state of a handle from a store and a key name.

Parameters
storeThe event store to access.
nameThe StoreGate key to search for.

Fails if no such object is recorded.

Parameters
storeThe event store to access.
nameThe StoreGate key to search for.

Definition at line 692 of file StoreGate/src/VarHandleBase.cxx.

693  {
694  if (0 == store) {
695  return StatusCode::FAILURE;
696  }
697 #ifdef DEBUG_VHB
698  dbg::print(stderr, "::VHB::setState({}, store={}, key={}) const\n", dbg::ptr(this), dbg::store(store), key);
699 #endif
700  CLID cid = this->clid();
701  SG::DataProxy* proxy = store->proxy(cid, key);
702  // std::cerr << "::VHB:: -- clid=[" << cid << "] proxy=[" << proxy << "]\n";
703  return this->setState(proxy);
704  }

◆ setState() [3/3]

StatusCode SG::VarHandleBase::setState ( SG::DataProxy proxy)
protectedinherited

Set the state of the handle to a given proxy.

Parameters
proxyThe proxy to set.

The proxy must be valid; otherwise FAILURE will be returned.

Definition at line 666 of file StoreGate/src/VarHandleBase.cxx.

667  {
668 #ifdef DEBUG_VHB
669  dbg::print(stderr, "::VHB::setState({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(proxy));
670 #endif
671  if (0 == proxy || !proxy->isValid()) {
672  return StatusCode::FAILURE;
673  }
674 
675  if (m_proxy != proxy) {
676  // We're changing proxies. Release the old and bind to the new.
677  setProxy (proxy);
678  // Clear cached pointer.
679  m_ptr=0;
680  }
681 
682  return StatusCode::SUCCESS;
683  }

◆ setStoreFromHandle()

bool SG::VarHandleBase::setStoreFromHandle ( const EventContext *  ctx)
privateinherited

Initialize the store pointer from the store handle.

Also checks that the key is valid.

Parameters
ctxThe current event context, or nullptr.

Returns true on success.

Definition at line 993 of file StoreGate/src/VarHandleBase.cxx.

994  {
995  if (m_ownedKey) {
996  if (m_ownedKey->initialize().isFailure()) {
997  return false;
998  }
999  }
1000  m_store = storeFromHandle (ctx);
1001  m_storeWasSet = (ctx && m_store ==
1002  Atlas::getExtendedEventContext(*ctx).proxy());
1003  return true;
1004  }

◆ store()

std::string SG::VarHandleBase::store ( ) const
inherited

Return the name of the store holding the object we are proxying.

Definition at line 382 of file StoreGate/src/VarHandleBase.cxx.

383  {
384  if (m_store)
385  return m_store->name();
386  return this->storeHandle().name();
387  }

◆ storeFromHandle()

IProxyDict * SG::VarHandleBase::storeFromHandle ( const EventContext *  ctx) const
privateinherited

Return the store instance to use.

Parameters
ctxThe current event context, or nullptr.
ctxThe current event context, or nullptr.

If we're referencing the default event store, pick the specific store to use in this order:

  • Store associated with an explicitly-provided context.
  • A store explicitly set via setProxyDict.
  • Store associated with the current context.

For another store:

  • A store explicitly set via setProxyDict.
  • The store retrieved from the handle, resolved to the current slot if it's a hive store.

Definition at line 963 of file StoreGate/src/VarHandleBase.cxx.

964  {
965  if (m_key->isEventStore()) {
966  if (ctx)
967  return Atlas::getExtendedEventContext(*ctx).proxy();
968  if (m_storeWasSet && m_store) return m_store;
969 
970  if ( Atlas::hasExtendedEventContext (Gaudi::Hive::currentContext()) ) {
971  return Atlas::getExtendedEventContext (Gaudi::Hive::currentContext()).proxy();
972  } else {
973  return nullptr;
974  }
975  }
976 
977  if (m_storeWasSet && m_store) return m_store;
979  if (!store)
980  store = &*this->storeHandle();
981 
982  return store->hiveProxyDict();
983  }

◆ storeHandle()

const ServiceHandle<IProxyDict>& SG::VarHandleBase::storeHandle ( ) const
inherited

Return handle to the referenced store.

◆ symLink()

template<class T >
template<class U >
StatusCode SG::WriteHandle< T >::symLink ( const WriteHandleKey< U > &  key)

Make an explicit link.

Parameters
keyAlternate clid by which the referenced object should be known. The SG key must match the key of the current handle.

You should generally not be using this!

The current handle should be valid and referencing an object (i.e., record should have been called on it).

This makes a symlink: the object will be retrievable as a different type.

Note that if T and @U are related via SG_BASE and/or DATAVECTOR_BASE, then you shouldn't need to explicitly make a symlink; that should happen automatically.

If a U* is not convertable to a T* via C++ rules, then you likely will be, at best, relying on undefined behavior. You will probably get warnings from the undefined behavior sanitizer when if you try to dereference the U*.

This usage is here mainly to assist in migrating some existing patterns to MT. You should think several times before using in new code.

◆ symLink_impl()

StatusCode SG::VarHandleBase::symLink_impl ( CLID  newClid,
const std::string &  newKey 
)
protectedinherited

Make a symlink or alias to the object currently referenced by this handle.

Parameters
newClidCLID of link.
newKeySG key of link.

If newClid matches the existing clid, then make an alias. If newKey matches the existing key, then make a symlink. If neither match, it's an error.

Definition at line 932 of file StoreGate/src/VarHandleBase.cxx.

934  {
935  if (!m_ptr || !m_store) {
936  REPORT_ERROR (StatusCode::FAILURE) << "symlink: Handle not valid.";
937  return StatusCode::FAILURE;
938  }
939 
940  SG::DataObjectSharedPtr<DataObject> obj (new SymlinkDataObject (newClid, m_ptr));
941  SG::DataProxy* prox = m_store->recordObject (obj, newKey, false, true);
942  if (!prox)
943  return StatusCode::FAILURE;
944  return StatusCode::SUCCESS;
945  }

◆ typeless_cptr()

const void* SG::VarHandleBase::typeless_cptr ( )
protectedinherited

Retrieve an object from StoreGate as a const pointer.

Same as typeless_dataPointer with the return value converted to const.

◆ typeless_dataPointer()

void* SG::VarHandleBase::typeless_dataPointer ( bool  quiet = defaultQuiet)
protectedinherited

Retrieve an object from StoreGate.

Parameters
quietIf true, suppress failure messages.

Inline method: first check cached pointer, then call the _impl method.

◆ typeless_dataPointer_fromProxy()

void * SG::VarHandleBase::typeless_dataPointer_fromProxy ( SG::DataProxy proxy,
bool  quiet 
) const
privateinherited

Retrieve a pointer from a proxy.

Parameters
proxyThe proxy object.
quietIf true, suppress failure messages.

Warning — doesn't enforce const rules; the caller must do that.

Definition at line 1047 of file StoreGate/src/VarHandleBase.cxx.

1049  {
1050  if (!proxy || !proxy->isValid()) {
1051  // invalid proxy
1052  if (!quiet) {
1053  REPORT_MESSAGE(MSG::WARNING)
1054  << "Proxy "
1055  << " [" << (proxy != 0 ? proxy->clID() : 0)
1056  << "/" << (proxy != 0
1057  ? proxy->name()
1058  : std::string("<N/A>"))
1059  << "] is in an invalid state";
1060  } //quiet
1061  return nullptr;
1062  }
1063 
1064  DataObject* dobj = proxy->accessData();
1065  if (!dobj) {
1066  // invalid dobj
1067  if (!quiet) {
1068  REPORT_MESSAGE(MSG::WARNING)
1069  << "this proxy " << MSG::hex << proxy
1070  << MSG::dec << " has a NULL data object ptr";
1071  }
1072  return nullptr;
1073  }
1074 
1075  const CLID clid = this->clid();
1076  void* ptr = SG::Storable_cast(dobj, clid, nullptr, true, proxy);
1077  if (ptr)
1078  return ptr;
1079 
1080  // If ptr is null, probably the clid we gave wasn't the clid
1081  // the object was stored with, nor it inherits from it.
1082  // before giving up, let's check its transient CLIDs
1083  DataBucketBase *dbb = 0;
1084  if (proxy->transientID(clid) &&
1085  0 != (dbb = dynamic_cast<DataBucketBase*>(dobj))) {
1086  // it is a symlink after all.
1087  // Let's hard cast (and keep our fingers Xed)
1088  ptr = static_cast<void*>(dbb->object());
1089  } else {
1090  if (!quiet) {
1091  REPORT_MESSAGE(MSG::WARNING)
1092  << "Request for an invalid object; requested CLID = "
1093  << clid
1094  << ", proxy primary ID is " << proxy->clID();
1095  }
1096  } // try symlink -- endif
1097  return ptr;
1098  }

◆ typeless_dataPointer_impl()

void * SG::VarHandleBase::typeless_dataPointer_impl ( bool  quiet)
protectedinherited

Retrieve an object from StoreGate.

Parameters
quietIf true, suppress failure messages.

Definition at line 830 of file StoreGate/src/VarHandleBase.cxx.

831  {
832 #ifdef DEBUG_VHB
833  dbg::print(stderr, "::VHB::typeless_dataPointer_impl({}, ptr={}, proxy={}, key={}, store={})\n", dbg::ptr(this), dbg::ptr(this->m_ptr), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
834 #endif
835 
836  // First check for cached pointer.
837  if (0 != m_ptr)
838  return m_ptr;
839 
840  if (0 == m_proxy) {
841  // No proxy, need to look it up.
842  if (this->setState().isFailure() || !m_proxy) {
843  if (!quiet) {
844  REPORT_MESSAGE(MSG::WARNING)
845  << "could not get proxy for key " << key();
846  if (this->mode() != Gaudi::DataHandle::Reader) {
847  REPORT_MESSAGE(MSG::WARNING)<< " try using a ReadHandle";
848  }
849  } //quiet
850  return 0;
851  } //setstate
852  } //m_proxy
853 
855  return m_ptr;
856  }

◆ typeless_ptr()

void * SG::VarHandleBase::typeless_ptr ( bool  quiet = defaultQuiet)
protectedinherited

Retrieve an object from StoreGate as non-const pointer.

Calls typeless_dataPointer, then raises an exception if the proxy is marked as const.

Definition at line 865 of file StoreGate/src/VarHandleBase.cxx.

866  {
867  void* p = typeless_dataPointer(quiet);
868  if (p != nullptr && isConst())
869  throw SG::ExcConstObject (clid(), key(), store());
870  return p;
871  }

◆ vhKey()

SG::VarHandleKey & SG::VarHandleBase::vhKey ( )
inherited

Return a non-const reference to the HandleKey.

If this handle was initialized from a HandleKey, then this doesn't work (since the HandleKey is const). ExcNonConstHandleKey will be thrown in that case.

Definition at line 629 of file StoreGate/src/VarHandleBase.cxx.

630  {
631  if (!m_ownedKey) {
633  m_key->storeHandle().name());
634  }
635  return *m_ownedKey;
636  }

Member Data Documentation

◆ m_key

const VarHandleKey* SG::VarHandleBase::m_key
privateinherited

The associated key object.

If we were initialized from a key object, then this points at that. Otherwise, it points at the same object as m_ownedKey.

Definition at line 525 of file StoreGate/StoreGate/VarHandleBase.h.

◆ m_lockAuxPending

template<class T >
SG::DataProxy* SG::WriteHandle< T >::m_lockAuxPending = nullptr
private

If non-null, then we need to lock the associated aux store object when we're deleted.

This is set when we record an object along with the associated aux const with the const flag set (the default). Recall that for a const record, we want to support the semantics that you can get a non-const pointer back from the handle as long as it exists, to finish initialization of the object. For an aux store, though, just getting back a non-const pointer is not sufficient, since the store will have been locked at the time of the record, preventing changes to the store.

So if we're meant to record a const aux store object, we don't actually set it const on the record, but instead set this and do the setConst in the destructor.

Definition at line 685 of file StoreGate/StoreGate/WriteHandle.h.

◆ m_ownedKey

std::unique_ptr<VarHandleKey> SG::VarHandleBase::m_ownedKey
privateinherited

An owned VarHandleKey.

This is set in the case where a VarHandle is not initialized from a key object.

Definition at line 520 of file StoreGate/StoreGate/VarHandleBase.h.

◆ m_proxy

SG::DataProxy* SG::VarHandleBase::m_proxy
protectedinherited

Proxy holding the object to which we are bound.

Definition at line 507 of file StoreGate/StoreGate/VarHandleBase.h.

◆ m_ptr

void* SG::VarHandleBase::m_ptr
protectedinherited

The object to which we are bound.

Definition at line 504 of file StoreGate/StoreGate/VarHandleBase.h.

◆ m_store

IProxyDict* SG::VarHandleBase::m_store
protectedinherited

Pointer to the store that owns the object.

Definition at line 510 of file StoreGate/StoreGate/VarHandleBase.h.

◆ m_storeWasSet

bool SG::VarHandleBase::m_storeWasSet
protectedinherited

True if the store was set explicitly via setProxyDict.

Definition at line 513 of file StoreGate/StoreGate/VarHandleBase.h.


The documentation for this class was generated from the following file:
used
SGTest::store
TestStore store
Definition: TestStore.cxx:23
common.sgkey
def sgkey(tool)
Definition: common.py:1028
REPORT_ERROR
#define REPORT_ERROR(SC)
Report an error.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:355
IProxyDict::proxy
virtual SG::DataProxy * proxy(const CLID &id, const std::string &key) const =0
Get proxy with given id and key.
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:395
SG::DataProxy::isConst
bool isConst() const
Check if it is a const object.
SG::VarHandleBase::storeFromHandle
IProxyDict * storeFromHandle(const EventContext *ctx) const
Return the store instance to use.
Definition: StoreGate/src/VarHandleBase.cxx:963
SG::VarHandleBase::m_ownedKey
std::unique_ptr< VarHandleKey > m_ownedKey
An owned VarHandleKey.
Definition: StoreGate/StoreGate/VarHandleBase.h:520
SG::VarHandleBase::typeless_dataPointer
void * typeless_dataPointer(bool quiet=defaultQuiet)
Retrieve an object from StoreGate.
DataBucketBase
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
Definition: DataBucketBase.h:24
quiet
bool quiet
Definition: TrigGlobEffCorrValidation.cxx:190
SG::VarHandleKey::storeHandle
const ServiceHandle< IProxyDict > & storeHandle() const
Return handle to the referenced store.
SG::VarHandleBase::name
const std::string & name() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:75
SG::VarHandleBase::setState
StatusCode setState()
Retrieve and cache all information managed by a handle.
Definition: StoreGate/src/VarHandleBase.cxx:493
DataBucketBase::object
virtual void * object()=0
SG::VarHandleBase::clid
CLID clid() const
Return the class ID for the referenced object.
SG::VarHandleBase::typeless_dataPointer_impl
void * typeless_dataPointer_impl(bool quiet)
Retrieve an object from StoreGate.
Definition: StoreGate/src/VarHandleBase.cxx:830
Atlas::hasExtendedEventContext
bool hasExtendedEventContext(const EventContext &ctx)
Test whether a context object has an extended context installed.
Definition: ExtendedEventContext.cxx:23
get_generator_info.stderr
stderr
Definition: get_generator_info.py:40
SG::DataProxy::isValid
bool isValid() const
called by destructor
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
SG::VarHandleBase::setConst
StatusCode setConst()
Set the 'const' bit for the bound proxy in the store.
Definition: StoreGate/src/VarHandleBase.cxx:612
SG::DataProxy::unbindHandle
void unbindHandle(IResetable *ir)
Definition: DataProxy.cxx:293
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
Atlas::getExtendedEventContext
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition: ExtendedEventContext.cxx:32
IProxyDict::proxy_exact
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const =0
Get proxy given a hashed key+clid.
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
SG::VarHandleBase::resetProxy
void resetProxy()
Clear the m_proxy field and release the old proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1010
SG::VarHandleKey::assign
virtual StatusCode assign(const std::string &sgkey)
Change the key of the object to which we're referring.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:88
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::VarHandleBase::m_key
const VarHandleKey * m_key
The associated key object.
Definition: StoreGate/StoreGate/VarHandleBase.h:525
SG::VarHandleBase::store
std::string store() const
Return the name of the store holding the object we are proxying.
Definition: StoreGate/src/VarHandleBase.cxx:382
DataProxy
DataProxy provides the registry services for StoreGate.
Definition: DataProxy.h:32
LHEF::Reader
Pythia8::Reader Reader
Definition: Prophecy4fMerger.cxx:11
SG::VarHandleKey::isEventStore
bool isEventStore() const
Does this key reference the primary event store?
SGImplSvc
The Athena Transient Store API.
Definition: SGImplSvc.h:111
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
SG::VarHandleBase::m_proxy
SG::DataProxy * m_proxy
Proxy holding the object to which we are bound.
Definition: StoreGate/StoreGate/VarHandleBase.h:507
SG::ExcConstObject
Exception — Tried to retrieve non-const pointer to const object.
Definition: Control/StoreGate/StoreGate/exceptions.h:134
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
SG::VarHandleBase::isInitialized
bool isInitialized() const
Has a proxy been retrieved from SG?
Definition: StoreGate/src/VarHandleBase.cxx:412
SG::DataProxy::release
virtual unsigned long release() override final
release reference to object
Definition: DataProxy.cxx:320
SGImplSvc::dump
std::string dump() const
dump objects in store.
Definition: SGImplSvc.cxx:557
SG::VarHandleBase::mode
Gaudi::DataHandle::Mode mode() const
Return the mode (read/write/update) for this handle.
SG::VarHandleBase::isPresent_impl
bool isPresent_impl(const std::string &key) const
Is the referenced object present in SG?
Definition: StoreGate/src/VarHandleBase.cxx:1107
SG::VarHandleBase::reset
virtual void reset(bool hard) override
Reset this handle.
Definition: StoreGate/src/VarHandleBase.cxx:576
SG::VarHandleBase::typeless_dataPointer_fromProxy
void * typeless_dataPointer_fromProxy(SG::DataProxy *proxy, bool quiet) const
Retrieve a pointer from a proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1047
SG::VarHandleKey::clid
CLID clid() const
Return the class ID for the referenced object.
Definition: StoreGate/src/VarHandleKey.cxx:185
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
SG::throwExcNonConstHandleKey
void throwExcNonConstHandleKey(CLID clid, const std::string &sgkey, const std::string &storename)
Throw a SG::ExcNonConstHandleKey exception.
Definition: Control/StoreGate/src/exceptions.cxx:337
SG::VarHandleBase::storeHandle
const ServiceHandle< IProxyDict > & storeHandle() const
Return handle to the referenced store.
columnar::empty
bool empty() const noexcept
Definition: ObjectRange.h:129
SG::Storable_cast
T * Storable_cast(DataObject *pDObj, bool quiet=true, IRegisterTransient *irt=0, bool isConst=true)
Definition: StorableConversions.h:37
SG::DataProxy::setConst
void setConst()
Mark this object as const.
Definition: DataProxy.cxx:204
SG::VarHandleKey::hashedKey
SG::sgkey_t hashedKey() const
Return the hashed StoreGate key.
SG::VarHandleBase::initialize
StatusCode initialize(bool used=true)
Verify that the handle has been configured properly.
Definition: StoreGate/src/VarHandleBase.cxx:458
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:629
SG::VarHandleBase::m_storeWasSet
bool m_storeWasSet
True if the store was set explicitly via setProxyDict.
Definition: StoreGate/StoreGate/VarHandleBase.h:513
SG::VarHandleBase::m_ptr
void * m_ptr
The object to which we are bound.
Definition: StoreGate/StoreGate/VarHandleBase.h:504
IProxyDict::recordObject
virtual SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting)=0
Record an object in the store.
SG::DataProxy::isResetOnly
bool isResetOnly() const
Check reset only:
dbg::print
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
Definition: SGImplSvc.cxx:70
SG::VarHandleBase::isConst
bool isConst() const
True if this handle has a proxy, and the proxy is const.
Definition: StoreGate/src/VarHandleBase.cxx:438
LHEF::Writer
Pythia8::Writer Writer
Definition: Prophecy4fMerger.cxx:12
SG::DataObjectSharedPtr
Smart pointer to manage DataObject reference counts.
Definition: DataObjectSharedPtr.h:45
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SG::VarHandleBase::m_store
IProxyDict * m_store
Pointer to the store that owns the object.
Definition: StoreGate/StoreGate/VarHandleBase.h:510
SG::DataProxy
Definition: DataProxy.h:45
IProxyDict::hiveProxyDict
virtual IProxyDict * hiveProxyDict() override
Return the current event-slot-specific store.
Definition: IProxyDict.cxx:83
SG::VarHandleBase::setProxy
void setProxy(SG::DataProxy *proxy)
Set a new proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1026