The Gaudi Framework  v30r3 (a5ef0a68)
DataHandleHolderBase.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_DATAHANDLEHOLDERBASE
2 #define GAUDIKERNEL_DATAHANDLEHOLDERBASE 1
3 
8 #include "GaudiKernel/Property.h"
9 
10 #include <algorithm>
11 #include <unordered_set>
12 
13 namespace
14 {
15  template <typename Container>
17  {
20  [&]( const Gaudi::DataHandle* hndl ) -> bool { return hndl->mode() & mode; } );
21  return h;
22  }
23 }
24 
25 template <class BASE>
26 class GAUDI_API DataHandleHolderBase : public extends<BASE, IDataHandleHolder>
27 {
28 public:
30 
32  {
33  return handles( m_handles, Gaudi::DataHandle::Reader );
34  }
36  {
37  return handles( m_handles, Gaudi::DataHandle::Writer );
38  }
39 
40  virtual const DataObjIDColl& extraInputDeps() const override { return m_extInputDataObjs; }
41  virtual const DataObjIDColl& extraOutputDeps() const override { return m_extOutputDataObjs; }
42 
43  void declare( Gaudi::DataHandle& handle ) override
44  {
45  if ( !handle.owner() ) handle.setOwner( this );
46 
47  if ( handle.owner() != this ) {
48  throw GaudiException( "Attempt to declare foreign handle with algorithm!", this->name(), StatusCode::FAILURE );
49  }
50 
51  m_handles.insert( &handle );
52  }
53 
54  void renounce( Gaudi::DataHandle& handle ) override
55  {
56  if ( handle.owner() != this ) {
57  throw GaudiException( "Attempt to renounce foreign handle with algorithm!", this->name(), StatusCode::FAILURE );
58  }
59  m_handles.erase( &handle );
60  }
61 
62  const DataObjIDColl& inputDataObjs() const override { return m_inputDataObjs; }
63  const DataObjIDColl& outputDataObjs() const override { return m_outputDataObjs; }
64 
65  void addDependency( const DataObjID& id, const Gaudi::DataHandle::Mode& mode ) override
66  {
67  if ( mode & Gaudi::DataHandle::Reader ) m_inputDataObjs.emplace( id );
68  if ( mode & Gaudi::DataHandle::Writer ) m_outputDataObjs.emplace( id );
69  }
70 
71 private:
72 protected:
76  {
77  for ( auto h : m_handles ) h->init();
78  }
79 
80  DataObjIDColl m_inputDataObjs, m_outputDataObjs;
81 
82 private:
84 
85  Gaudi::Property<DataObjIDColl> m_extInputDataObjs{this, "ExtraInputs", DataObjIDColl{}};
86  Gaudi::Property<DataObjIDColl> m_extOutputDataObjs{this, "ExtraOutputs", DataObjIDColl{}};
87 };
88 
89 #endif // !GAUDIKERNEL_DATAHANDLEHOLDERBASE
constexpr static const auto FAILURE
Definition: StatusCode.h:88
T copy_if(T...args)
Define general base for Gaudi exception.
virtual void setOwner(IDataHandleHolder *o)
Definition: DataHandle.h:41
Implementation of property with value of concrete type.
Definition: Property.h:381
const DataObjIDColl & outputDataObjs() const override
virtual Mode mode() const
Definition: DataHandle.h:44
void initDataHandleHolder()
initializes all handles - called by the sysInitialize method of any descendant of this ...
virtual const DataObjIDColl & extraOutputDeps() const override
void renounce(Gaudi::DataHandle &handle) override
T end(T...args)
void declare(Gaudi::DataHandle &handle) override
std::vector< Gaudi::DataHandle * > outputHandles() const override
const DataObjIDColl & inputDataObjs() const override
std::vector< Gaudi::DataHandle * > inputHandles() const override
void addDependency(const DataObjID &id, const Gaudi::DataHandle::Mode &mode) override
STL class.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
T begin(T...args)
T back_inserter(T...args)
#define GAUDI_API
Definition: Kernel.h:104
virtual const DataObjIDColl & extraInputDeps() const override
DataObjIDColl m_outputDataObjs
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:42
std::unordered_set< Gaudi::DataHandle * > m_handles