The Gaudi Framework  v30r3 (a5ef0a68)
IUpdateManagerSvc.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_IUPDATEMANAGERSVC_H
2 #define GAUDIKERNEL_IUPDATEMANAGERSVC_H 1
3 
4 // Include files
5 // from STL
6 #include <string>
7 #include <typeinfo>
8 
9 // from Gaudi
10 #include "GaudiKernel/IInterface.h"
11 
12 // forward declarations
13 class DataObject;
14 class ValidDataObject;
15 class IUpdateManagerSvc;
16 class IDataProviderSvc;
17 class IDetDataSvc;
18 namespace Gaudi
19 {
20  class Time;
21 }
22 
31 {
32 public:
34  virtual ~BaseObjectMemberFunction() = default;
35 
36  virtual StatusCode operator()() const = 0;
37 
38  virtual BaseObjectMemberFunction* makeCopy() const = 0;
39 
40  virtual const std::type_info& type() const = 0;
41 
42  virtual bool match( BaseObjectMemberFunction* ) const = 0;
43 
44  virtual DataObject* castToDataObject() const = 0;
45  virtual ValidDataObject* castToValidDataObject() const = 0;
46  virtual void* castToVoid() const = 0;
47 };
48 
56 template <class CallerClass>
58 {
59 public:
61  typedef StatusCode ( CallerClass::*MemberFunctionType )();
62 
65  StatusCode operator()() const override
66  {
67  return m_memberFunction ? ( m_instance->*m_memberFunction )() : StatusCode::SUCCESS;
68  }
69 
73  {
74  return new ObjectMemberFunction<CallerClass>( m_instance, m_memberFunction );
75  }
76 
78  const std::type_info& type() const override { return typeid( CallerClass ); }
79 
81  bool match( BaseObjectMemberFunction* bmf ) const override
82  {
83  if ( bmf == (BaseObjectMemberFunction*)this ) return true;
84  if ( type() == bmf->type() ) {
85  ObjectMemberFunction* mf = dynamic_cast<ObjectMemberFunction*>( bmf );
86  return m_instance == mf->m_instance && m_memberFunction == mf->m_memberFunction;
87  }
88  return false;
89  }
90 
92  DataObject* castToDataObject() const override { return dynamic_cast<DataObject*>( m_instance ); }
93 
95  ValidDataObject* castToValidDataObject() const override { return dynamic_cast<ValidDataObject*>( m_instance ); }
96 
98  void* castToVoid() const override { return dynamic_cast<void*>( m_instance ); }
99 
100 protected:
102  ObjectMemberFunction( CallerClass* instance, const MemberFunctionType& mf )
103  : m_instance( instance ), m_memberFunction( mf )
104  {
105  }
106 
108  CallerClass* m_instance;
109 
111  MemberFunctionType m_memberFunction;
112 
113  friend class IUpdateManagerSvc;
114 };
115 
124 {
125 public:
127  virtual ~BasePtrSetter() = default;
129  virtual void set( DataObject* ) = 0;
131  virtual bool isNull() = 0;
132 };
133 
141 class GAUDI_API IUpdateManagerSvc : virtual public IInterface
142 {
143 private:
148  template <class ActualType>
149  class PtrSetter final : public BasePtrSetter
150  {
151  public:
152  using dest_type = ActualType;
153  PtrSetter( dest_type*& dest ) : m_storage( &dest ) { *m_storage = nullptr; }
154  void set( DataObject* obj ) override { *m_storage = dynamic_cast<dest_type*>( obj ); }
155  bool isNull() override { return *m_storage == nullptr; }
156 
157  private:
160  };
161 
162 public:
165 
167  virtual IDataProviderSvc* dataProvider() const = 0;
168 
170  virtual IDetDataSvc* detDataSvc() const = 0;
171 
178  template <class CallerClass>
179  inline void registerCondition( CallerClass* instance, const std::string& condition = "",
181  {
182  i_registerCondition( condition, new ObjectMemberFunction<CallerClass>( instance, mf ) );
183  }
184 
185  template <class CallerClass, class CondType>
186  inline void registerCondition( CallerClass* instance, const std::string& condition,
188  CondType*& condPtrDest )
189  {
190  i_registerCondition( condition, new ObjectMemberFunction<CallerClass>( instance, mf ),
191  new PtrSetter<CondType>( condPtrDest ) );
192  }
193 
195  template <class CallerClass>
196  inline void registerCondition( CallerClass* instance, const char* condition,
198  {
199  i_registerCondition( std::string( condition ), new ObjectMemberFunction<CallerClass>( instance, mf ) );
200  }
201 
205  template <class CallerClass, class ObjectClass>
206  inline void registerCondition( CallerClass* instance, ObjectClass* obj,
208  {
209  i_registerCondition( dynamic_cast<void*>( obj ), new ObjectMemberFunction<CallerClass>( instance, mf ) );
210  }
211 
215  template <class CallerClass>
216  inline void unregister( CallerClass* instance )
217  {
218  i_unregister( dynamic_cast<void*>( instance ) );
219  }
220 
223  template <class CallerClass>
224  inline void invalidate( CallerClass* instance )
225  {
226  i_invalidate( dynamic_cast<void*>( instance ) );
227  }
228 
231  virtual bool getValidity( const std::string path, Gaudi::Time& since, Gaudi::Time& until,
232  bool path_to_db = false ) = 0;
233 
238  virtual void setValidity( const std::string path, const Gaudi::Time& since, const Gaudi::Time& until,
239  bool path_to_db = false ) = 0;
240 
242  virtual StatusCode newEvent() = 0;
246  virtual StatusCode newEvent( const Gaudi::Time& ) = 0;
247 
250  template <class CallerClass>
251  inline StatusCode update( CallerClass* instance )
252  {
253  return i_update( dynamic_cast<void*>( instance ) );
254  }
255 
257  virtual void dump() = 0;
258 
260  virtual void acquireLock() = 0;
262  virtual void releaseLock() = 0;
263 
267  virtual void purge() = 0;
268 
273  class PythonHelper;
274 
275 protected:
276  // virtual StatusCode i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf) = 0;
277  virtual void i_registerCondition( const std::string& condition, BaseObjectMemberFunction* mf,
278  BasePtrSetter* ptr_dest = nullptr ) = 0;
279  virtual void i_registerCondition( void* obj, BaseObjectMemberFunction* mf ) = 0;
280  virtual StatusCode i_update( void* instance ) = 0;
281  virtual void i_unregister( void* instance ) = 0;
282  virtual void i_invalidate( void* instance ) = 0;
283 
284  friend class PythonHelper;
285 };
286 #endif // GAUDIKERNEL_IUPDATEMANAGERSVC_H
MemberFunctionType m_memberFunction
Pointer to the member function.
Base class to set the pointer to an object of a class derived from DataObject in a generic way...
const std::type_info & type() const override
Returns the type_info of the CallerClass.
void invalidate(CallerClass *instance)
Invalidate the given object in the dependency network.
Templated specialization of BasePtrSetter.
bool isNull() override
tells if the internal pointer is nullptr.
ValidDataObject * castToValidDataObject() const override
Cast the object to ValidDataObject.
void unregister(CallerClass *instance)
Generic objects can be unregistered from the UpdateManagerSvc.
Data provider interface definition.
void registerCondition(CallerClass *instance, ObjectClass *obj, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
Like the first version of registerCondition, but instead declaring the dependency on a condition of t...
void * castToVoid() const override
Cast the object to void with dynamic_cast.
BaseObjectMemberFunction * makeCopy() const override
Clone method to be able to copy an ObjectMemberFunction from the BaseObjectMemberFunction interface...
STL class.
CallerClass * m_instance
Pointer to the object.
StatusCode operator()() const override
Calls the member function of the object and returns the StatusCode.
void registerCondition(CallerClass *instance, const std::string &condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf, CondType *&condPtrDest)
Based on seal::Time.
Definition: Time.h:237
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
#define DeclareInterfaceID(iface, major, minor)
Macro to declare the interface ID when using the new mechanism of extending and implementing interfac...
Definition: IInterface.h:13
Definition of the basic interface.
Definition: IInterface.h:277
Helper class implemented in the python dictionary to allow access from python to template member func...
void registerCondition(CallerClass *instance, const std::string &condition="", typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
Register an object (algorithm instance) to the service.
Interface class to the Update Manager service.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
dest_type ** m_storage
pointer to the pointer to fill provided by the user.
StatusCode update(CallerClass *instance)
Update the given instance.
ObjectMemberFunction(CallerClass *instance, const MemberFunctionType &mf)
Standard constructor. Protected so that can be called only by itself or IUpdateManagerSvc.
This class is used by IUpdateManagerSvc to keep pairs made of a member function and a pointer to the ...
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
DataObject * castToDataObject() const override
Cast the object to DataObject.
#define GAUDI_API
Definition: Kernel.h:104
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
virtual const std::type_info & type() const =0
Helper functions to set/get the application return code.
Definition: __init__.py:1
bool match(BaseObjectMemberFunction *bmf) const override
Comparison between two BaseObjectMemberFunction instances.
void registerCondition(CallerClass *instance, const char *condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
See above. Needed to avoid conflicts with the next one.
Base class of ObjectMemberFunction.