Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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  template <typename Container>
15  std::vector<Gaudi::DataHandle*> handles( Container& c, Gaudi::DataHandle::Mode mode ) {
18  [&]( const Gaudi::DataHandle* hndl ) -> bool { return hndl->mode() & mode; } );
19  return h;
20  }
21 } // namespace
22 
23 template <class BASE>
24 class GAUDI_API DataHandleHolderBase : public extends<BASE, IDataHandleHolder> {
25 public:
27 
29  return handles( m_handles, Gaudi::DataHandle::Reader );
30  }
32  return handles( m_handles, Gaudi::DataHandle::Writer );
33  }
34 
35  virtual const DataObjIDColl& extraInputDeps() const override { return m_extInputDataObjs; }
36  virtual const DataObjIDColl& extraOutputDeps() const override { return m_extOutputDataObjs; }
37 
38  void declare( Gaudi::DataHandle& handle ) override {
39  if ( !handle.owner() ) handle.setOwner( this );
40 
41  if ( handle.owner() != this ) {
42  throw GaudiException( "Attempt to declare foreign handle with algorithm!", this->name(), StatusCode::FAILURE );
43  }
44 
45  m_handles.insert( &handle );
46  }
47 
48  void renounce( Gaudi::DataHandle& handle ) override {
49  if ( handle.owner() != this ) {
50  throw GaudiException( "Attempt to renounce foreign handle with algorithm!", this->name(), StatusCode::FAILURE );
51  }
52  m_handles.erase( &handle );
53  }
54 
55  const DataObjIDColl& inputDataObjs() const override { return m_inputDataObjs; }
56  const DataObjIDColl& outputDataObjs() const override { return m_outputDataObjs; }
57 
58  void addDependency( const DataObjID& id, const Gaudi::DataHandle::Mode& mode ) override {
59  if ( mode & Gaudi::DataHandle::Reader ) m_inputDataObjs.emplace( id );
60  if ( mode & Gaudi::DataHandle::Writer ) m_outputDataObjs.emplace( id );
61  }
62 
63 private:
64 protected:
68  for ( auto h : m_handles ) h->init();
69  }
70 
71  DataObjIDColl m_inputDataObjs, m_outputDataObjs;
72 
73 private:
75 
76  Gaudi::Property<DataObjIDColl> m_extInputDataObjs{this, "ExtraInputs", DataObjIDColl{}};
77  Gaudi::Property<DataObjIDColl> m_extOutputDataObjs{this, "ExtraOutputs", DataObjIDColl{}};
78 };
79 
80 #endif // !GAUDIKERNEL_DATAHANDLEHOLDERBASE
T copy_if(T...args)
Define general base for Gaudi exception.
virtual void setOwner(IDataHandleHolder *o)
Definition: DataHandle.h:39
Implementation of property with value of concrete type.
Definition: Property.h:352
const DataObjIDColl & outputDataObjs() const override
virtual Mode mode() const
Definition: DataHandle.h:42
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)
constexpr static const auto FAILURE
Definition: StatusCode.h:86
#define GAUDI_API
Definition: Kernel.h:71
virtual const DataObjIDColl & extraInputDeps() const override
DataObjIDColl m_outputDataObjs
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
std::unordered_set< Gaudi::DataHandle * > m_handles