The Gaudi Framework  v30r4 (9b837755)
EventDataHandle.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_EVENTDATAHANDLE
2 #define GAUDIKERNEL_EVENTDATAHANDLE 1
3 
9 #include <memory>
10 #include <stdexcept>
11 #include <string>
12 
13 //---------------------------------------------------------------------------
14 
24 //---------------------------------------------------------------------------
25 
26 class IDataHandleHolder;
27 
28 namespace Gaudi
29 {
33  {
34  public:
36  void initialize( const IDataHandleHolder& owner ) final override;
37 
38  protected:
39  using AccessMode = DataHandle::AccessMode;
40 
43  {
44  public:
45  // Initialize by specifying which access mode should be used
47 
48  // Identifier for the whiteboard implementation that we use
49  std::string whiteBoard() const final override { return "IDataProviderSvc"; }
50 
51  // Tell what is the access mode
52  AccessMode access() const final override { return m_access; }
53 
54  private:
56  };
57 
58  // Metadata singletons shared by all read and write handles
61 
64  template <typename Owner>
65  EventDataHandle( Owner& owner, const std::string& propertyName, DataObjID&& defaultID, const std::string& docString,
66  const Metadata& metadata )
67  : DataHandle{owner, propertyName, std::move( defaultID ), docString, metadata}
68  {
69  registerToOwner( owner );
70  }
71 
74 
75  private:
77  void registerToOwner( IDataHandleHolder& owner );
78  };
79 
81  template <typename T>
83  {
84  protected:
85  using AccessMode = DataHandle::AccessMode;
86 
87  public:
89  template <typename Owner>
90  EventReadHandle( Owner* owner, const std::string& propertyName, DataObjID defaultID,
91  const std::string& docString = "" )
92  : EventDataHandle{*owner, propertyName, std::move( defaultID ), docString, s_readHandleMetadata}
93  {
94  }
95 
98  decltype( auto ) get( const EventContext& /* ctx */ ) const
99  {
100  // TODO: Introduce and use an EventContext-aware whiteboard interface
101  DataObject* ptr = nullptr;
102  auto sc = m_whiteBoard->retrieveObject( targetKey().key(), ptr );
103  if ( sc.isFailure() ) {
104  throw std::runtime_error( "Failed to read input from whiteboard" );
105  }
106  return HandleDetail::unwrapDataObject<T>( *ptr );
107  }
108  };
109 
111  template <typename T>
113  {
114  protected:
115  using AccessMode = DataHandle::AccessMode;
116 
117  public:
119  template <typename Owner>
120  EventWriteHandle( Owner* owner, const std::string& propertyName, DataObjID defaultID,
121  const std::string& docString = "" )
122  : EventDataHandle{*owner, propertyName, std::move( defaultID ), docString, s_writeHandleMetadata}
123  {
124  }
125 
127  const T& put( const EventContext& ctx, T data ) const
128  {
129  auto ptrAndRef = HandleDetail::wrapDataObject<T>( std::move( data ) );
130  putImpl( ctx, std::move( ptrAndRef.first ) );
131  return ptrAndRef.second;
132  }
133 
140  const T& put( const EventContext& ctx, std::unique_ptr<DataObject> ptr ) const
141  {
142  auto ptrAndRef = HandleDetail::wrapDataObject<T>( std::move( ptr ) );
143  putImpl( ctx, std::move( ptrAndRef.first ) );
144  return ptrAndRef.second;
145  }
146 
147  private:
149  void putImpl( const EventContext& /* ctx */, std::unique_ptr<DataObject>&& ptr ) const
150  {
151  // TODO: Introduce and use an EventContext-aware whiteboard interface
152  auto sc = m_whiteBoard->registerObject( targetKey().key(), ptr.release() );
153  if ( sc.isFailure() ) {
154  throw std::runtime_error( "Failed to write output into whiteboard" );
155  }
156  }
157  };
158 }
159 
160 #endif
std::string whiteBoard() const final override
Identifier of the Whiteboard implementation used by the subclass.
Reentrant write handle for event data.
AccessMode
Tell how the whiteboard class will be accessed.
const DataObjID & targetKey() const
(Configurable) ID of the data being accessed via this handle
Definition: DataHandle.h:133
static const Metadata s_readHandleMetadata
void putImpl(const EventContext &, std::unique_ptr< DataObject > &&ptr) const
Insert a valid DataObject into the transient event store.
Data provider interface definition.
This class represents an entry point to all the event specific data.
Definition: EventContext.h:31
AccessMode access() const final override
EventDataHandle(Owner &owner, const std::string &propertyName, DataObjID &&defaultID, const std::string &docString, const Metadata &metadata)
Handles are constructed like a Gaudi property (and effectively behave as one, which sets the associat...
STL class.
DataHandle subclass metadata for event data handles.
void registerToOwner(IDataHandleHolder &owner)
Register ourselves to the owner (algorithm or tool)
DataHandle(const DataHandle &)=delete
Entity which holds DataHandles and can track the associated data dependencies for the Scheduler...
EventReadHandle(Owner *owner, const std::string &propertyName, DataObjID defaultID, const std::string &docString="")
Create a ReadHandle and set up the associated Gaudi property.
EventWriteHandle(Owner *owner, const std::string &propertyName, DataObjID defaultID, const std::string &docString="")
Create a WriteHandle and set up the associated Gaudi property.
void initialize(const IDataHandleHolder &owner) final override
Initialize the data handle.
Base class to all new-style data handles.
Definition: DataHandle.h:91
virtual StatusCode retrieveObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
Interface to some class-wide metadata of DataHandle subclasses.
T move(T...args)
const T & put(const EventContext &ctx, std::unique_ptr< DataObject > ptr) const
Transfer ownership of heap-allocated data to the store.
StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)
Register object with the data store.
STL class.
const T & put(const EventContext &ctx, T data) const
Move data into the store.
static const Metadata s_writeHandleMetadata
Reentrant read handle for event data.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
Helper functions to set/get the application return code.
Definition: __init__.py:1
IDataProviderSvc * m_whiteBoard
Pointer to the whiteboard, set during initialize()
Base class to all DataHandles interacting with the transient event store.