The Gaudi Framework  v36r1 (3e2fb5a8)
IUpdateManagerSvc.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifndef GAUDIKERNEL_IUPDATEMANAGERSVC_H
12 #define GAUDIKERNEL_IUPDATEMANAGERSVC_H 1
13 
14 // Include files
15 // from STL
16 #include <string>
17 #include <typeinfo>
18 
19 // from Gaudi
20 #include "GaudiKernel/IInterface.h"
21 
22 // forward declarations
23 class DataObject;
24 class ValidDataObject;
25 class IUpdateManagerSvc;
26 class IDataProviderSvc;
27 class IDetDataSvc;
28 namespace Gaudi {
29  class Time;
30 }
31 
40 public:
42  virtual ~BaseObjectMemberFunction() = default;
43 
44  virtual StatusCode operator()() const = 0;
45 
46  virtual BaseObjectMemberFunction* makeCopy() const = 0;
47 
48  virtual const std::type_info& type() const = 0;
49 
50  virtual bool match( BaseObjectMemberFunction* ) const = 0;
51 
52  virtual DataObject* castToDataObject() const = 0;
53  virtual ValidDataObject* castToValidDataObject() const = 0;
54  virtual void* castToVoid() const = 0;
55 };
56 
64 template <class CallerClass>
66 public:
68  typedef StatusCode ( CallerClass::*MemberFunctionType )();
69 
72  StatusCode operator()() const override {
74  }
75 
79 
81  const std::type_info& type() const override { return typeid( CallerClass ); }
82 
84  bool match( BaseObjectMemberFunction* bmf ) const override {
85  if ( bmf == (BaseObjectMemberFunction*)this ) return true;
86  if ( type() == bmf->type() ) {
87  ObjectMemberFunction* mf = dynamic_cast<ObjectMemberFunction*>( bmf );
89  }
90  return false;
91  }
92 
94  DataObject* castToDataObject() const override { return dynamic_cast<DataObject*>( m_instance ); }
95 
97  ValidDataObject* castToValidDataObject() const override { return dynamic_cast<ValidDataObject*>( m_instance ); }
98 
100  void* castToVoid() const override { return dynamic_cast<void*>( m_instance ); }
101 
102 protected:
104  ObjectMemberFunction( CallerClass* instance, const MemberFunctionType& mf )
105  : m_instance( instance ), m_memberFunction( mf ) {}
106 
108  CallerClass* m_instance;
109 
112 
113  friend class IUpdateManagerSvc;
114 };
115 
124 public:
126  virtual ~BasePtrSetter() = default;
128  virtual void set( DataObject* ) = 0;
130  virtual bool isNull() = 0;
131 };
132 
140 class GAUDI_API IUpdateManagerSvc : virtual public IInterface {
141 private:
146  template <class ActualType>
147  class PtrSetter final : public BasePtrSetter {
148  public:
149  using dest_type = ActualType;
150  PtrSetter( dest_type*& dest ) : m_storage( &dest ) { *m_storage = nullptr; }
151  void set( DataObject* obj ) override { *m_storage = dynamic_cast<dest_type*>( obj ); }
152  bool isNull() override { return *m_storage == nullptr; }
153 
154  private:
157  };
158 
159 public:
162 
164  virtual IDataProviderSvc* dataProvider() const = 0;
165 
167  virtual IDetDataSvc* detDataSvc() const = 0;
168 
175  template <class CallerClass>
176  inline void registerCondition( CallerClass* instance, const std::string& condition = "",
178  i_registerCondition( condition, new ObjectMemberFunction{instance, mf} );
179  }
180 
181  template <class CallerClass, class CondType>
182  inline void registerCondition( CallerClass* instance, const std::string& condition,
184  CondType*& condPtrDest ) {
185  i_registerCondition( condition, new ObjectMemberFunction{instance, mf}, new PtrSetter{condPtrDest} );
186  }
187 
189  template <class CallerClass>
190  inline void registerCondition( CallerClass* instance, const char* condition,
192  i_registerCondition( std::string( condition ), new ObjectMemberFunction{instance, mf} );
193  }
194 
198  template <class CallerClass, class ObjectClass>
199  inline void registerCondition( CallerClass* instance, ObjectClass* obj,
201  i_registerCondition( dynamic_cast<void*>( obj ), new ObjectMemberFunction{instance, mf} );
202  }
203 
207  template <class CallerClass>
208  inline void unregister( CallerClass* instance ) {
209  i_unregister( dynamic_cast<void*>( instance ) );
210  }
211 
214  template <class CallerClass>
215  inline void invalidate( CallerClass* instance ) {
216  i_invalidate( dynamic_cast<void*>( instance ) );
217  }
218 
221  virtual bool getValidity( const std::string path, Gaudi::Time& since, Gaudi::Time& until,
222  bool path_to_db = false ) = 0;
223 
228  virtual void setValidity( const std::string path, const Gaudi::Time& since, const Gaudi::Time& until,
229  bool path_to_db = false ) = 0;
230 
232  virtual StatusCode newEvent() = 0;
236  virtual StatusCode newEvent( const Gaudi::Time& ) = 0;
237 
240  template <class CallerClass>
241  inline StatusCode update( CallerClass* instance ) {
242  return i_update( dynamic_cast<void*>( instance ) );
243  }
244 
246  virtual void dump() = 0;
247 
249  virtual void acquireLock() = 0;
251  virtual void releaseLock() = 0;
252 
256  virtual void purge() = 0;
257 
262  class PythonHelper;
263 
264 protected:
265  // virtual StatusCode i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf) = 0;
266  virtual void i_registerCondition( const std::string& condition, BaseObjectMemberFunction* mf,
267  BasePtrSetter* ptr_dest = nullptr ) = 0;
268  virtual void i_registerCondition( void* obj, BaseObjectMemberFunction* mf ) = 0;
269  virtual StatusCode i_update( void* instance ) = 0;
270  virtual void i_unregister( void* instance ) = 0;
271  virtual void i_invalidate( void* instance ) = 0;
272 
273  friend class PythonHelper;
274 };
275 #endif // GAUDIKERNEL_IUPDATEMANAGERSVC_H
IUpdateManagerSvc::newEvent
virtual StatusCode newEvent(const Gaudi::Time &)=0
Start an update loop using the give event time.
ObjectMemberFunction::castToValidDataObject
ValidDataObject * castToValidDataObject() const override
Cast the object to ValidDataObject.
Definition: IUpdateManagerSvc.h:97
BasePtrSetter::~BasePtrSetter
virtual ~BasePtrSetter()=default
Empty virtual destructor.
IUpdateManagerSvc::setValidity
virtual void setValidity(const std::string path, const Gaudi::Time &since, const Gaudi::Time &until, bool path_to_db=false)=0
Change the interval of validity of the given item to the specified values, updating parents if needed...
std::string
STL class.
ObjectMemberFunction::match
bool match(BaseObjectMemberFunction *bmf) const override
Comparison between two BaseObjectMemberFunction instances.
Definition: IUpdateManagerSvc.h:84
ObjectMemberFunction::m_memberFunction
MemberFunctionType m_memberFunction
Pointer to the member function.
Definition: IUpdateManagerSvc.h:111
IUpdateManagerSvc::dataProvider
virtual IDataProviderSvc * dataProvider() const =0
Give access to the data provider.
BasePtrSetter::set
virtual void set(DataObject *)=0
sets the internal pointer to the provided data object (with a dynamic_cast).
ObjectMemberFunction::operator()
StatusCode operator()() const override
Calls the member function of the object and returns the StatusCode.
Definition: IUpdateManagerSvc.h:72
IUpdateManagerSvc::PtrSetter::PtrSetter
PtrSetter(dest_type *&dest)
Definition: IUpdateManagerSvc.h:150
IUpdateManagerSvc::PtrSetter::m_storage
dest_type ** m_storage
pointer to the pointer to fill provided by the user.
Definition: IUpdateManagerSvc.h:156
IUpdateManagerSvc::i_invalidate
virtual void i_invalidate(void *instance)=0
IDetDataSvc
Definition: IDetDataSvc.h:32
BaseObjectMemberFunction
Definition: IUpdateManagerSvc.h:39
std::type_info
IUpdateManagerSvc::releaseLock
virtual void releaseLock()=0
Let the update manager service enter the newEvent loop.
IUpdateManagerSvc::dump
virtual void dump()=0
Debug method: it dumps the dependency network through the message service (not very readable,...
BasePtrSetter
Definition: IUpdateManagerSvc.h:123
BaseObjectMemberFunction::~BaseObjectMemberFunction
virtual ~BaseObjectMemberFunction()=default
Virtual destructor.
BaseObjectMemberFunction::type
virtual const std::type_info & type() const =0
ObjectMemberFunction::m_instance
CallerClass * m_instance
Pointer to the object.
Definition: IUpdateManagerSvc.h:108
IUpdateManagerSvc::i_unregister
virtual void i_unregister(void *instance)=0
IUpdateManagerSvc::newEvent
virtual StatusCode newEvent()=0
Start an update loop using the event time given by the detector data service.
IUpdateManagerSvc::i_registerCondition
virtual void i_registerCondition(void *obj, BaseObjectMemberFunction *mf)=0
Gaudi::Time
Definition: Time.h:241
ObjectMemberFunction::MemberFunctionType
StatusCode(CallerClass::* MemberFunctionType)()
MemberFunctionType is the type for a pointer to a member function of class CallerClass.
Definition: IUpdateManagerSvc.h:68
BaseObjectMemberFunction::castToDataObject
virtual DataObject * castToDataObject() const =0
BaseObjectMemberFunction::castToValidDataObject
virtual ValidDataObject * castToValidDataObject() const =0
ObjectMemberFunction::makeCopy
BaseObjectMemberFunction * makeCopy() const override
Clone method to be able to copy an ObjectMemberFunction from the BaseObjectMemberFunction interface.
Definition: IUpdateManagerSvc.h:78
BasePtrSetter::isNull
virtual bool isNull()=0
tells if the internal pointer is nullptr.
IUpdateManagerSvc::invalidate
void invalidate(CallerClass *instance)
Invalidate the given object in the dependency network.
Definition: IUpdateManagerSvc.h:215
IUpdateManagerSvc::registerCondition
void registerCondition(CallerClass *instance, const std::string &condition="", typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
Register an object (algorithm instance) to the service.
Definition: IUpdateManagerSvc.h:176
StatusCode
Definition: StatusCode.h:65
IInterface.h
IUpdateManagerSvc::update
StatusCode update(CallerClass *instance)
Update the given instance.
Definition: IUpdateManagerSvc.h:241
IUpdateManagerSvc::registerCondition
void registerCondition(CallerClass *instance, const std::string &condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf, CondType *&condPtrDest)
Definition: IUpdateManagerSvc.h:182
GaudiPython.HistoUtils.path
path
Definition: HistoUtils.py:943
IUpdateManagerSvc::i_update
virtual StatusCode i_update(void *instance)=0
IUpdateManagerSvc::purge
virtual void purge()=0
Remove all the items referring to objects present in the transient store.
IUpdateManagerSvc::detDataSvc
virtual IDetDataSvc * detDataSvc() const =0
Give access to the detector data service interface (usualy of the data provider itself).
IUpdateManagerSvc::unregister
void unregister(CallerClass *instance)
Generic objects can be unregistered from the UpdateManagerSvc.
Definition: IUpdateManagerSvc.h:208
ObjectMemberFunction::ObjectMemberFunction
ObjectMemberFunction(CallerClass *instance, const MemberFunctionType &mf)
Standard constructor. Protected so that can be called only by itself or IUpdateManagerSvc.
Definition: IUpdateManagerSvc.h:104
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
IUpdateManagerSvc::registerCondition
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...
Definition: IUpdateManagerSvc.h:199
gaudirun.dest
dest
Definition: gaudirun.py:213
IUpdateManagerSvc::i_registerCondition
virtual void i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf, BasePtrSetter *ptr_dest=nullptr)=0
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
IUpdateManagerSvc::PtrSetter
Definition: IUpdateManagerSvc.h:147
ObjectMemberFunction::castToDataObject
DataObject * castToDataObject() const override
Cast the object to DataObject.
Definition: IUpdateManagerSvc.h:94
IUpdateManagerSvc::DeclareInterfaceID
DeclareInterfaceID(IUpdateManagerSvc, 2, 0)
InterfaceID.
ObjectMemberFunction
Definition: IUpdateManagerSvc.h:65
IUpdateManagerSvc
Definition: IUpdateManagerSvc.h:140
IUpdateManagerSvc::PtrSetter::isNull
bool isNull() override
tells if the internal pointer is nullptr.
Definition: IUpdateManagerSvc.h:152
BaseObjectMemberFunction::castToVoid
virtual void * castToVoid() const =0
IInterface
Definition: IInterface.h:237
IUpdateManagerSvc::PtrSetter::dest_type
ActualType dest_type
Definition: IUpdateManagerSvc.h:149
IUpdateManagerSvc::registerCondition
void registerCondition(CallerClass *instance, const char *condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
See above. Needed to avoid conflicts with the next one.
Definition: IUpdateManagerSvc.h:190
IUpdateManagerSvc::acquireLock
virtual void acquireLock()=0
Force the update manager service to wait before entering the newEvent loop.
DataObject
Definition: DataObject.h:40
ObjectMemberFunction::castToVoid
void * castToVoid() const override
Cast the object to void with dynamic_cast.
Definition: IUpdateManagerSvc.h:100
BaseObjectMemberFunction::operator()
virtual StatusCode operator()() const =0
IDataProviderSvc
Definition: IDataProviderSvc.h:53
IUpdateManagerSvc::PtrSetter::set
void set(DataObject *obj) override
sets the internal pointer to the provided data object (with a dynamic_cast).
Definition: IUpdateManagerSvc.h:151
ObjectMemberFunction::type
const std::type_info & type() const override
Returns the type_info of the CallerClass.
Definition: IUpdateManagerSvc.h:81
BaseObjectMemberFunction::match
virtual bool match(BaseObjectMemberFunction *) const =0
PythonHelper
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:81
IUpdateManagerSvc::getValidity
virtual bool getValidity(const std::string path, Gaudi::Time &since, Gaudi::Time &until, bool path_to_db=false)=0
Retrieve the interval of validity (in the UpdateManagerSvc) of the given item.
BaseObjectMemberFunction::makeCopy
virtual BaseObjectMemberFunction * makeCopy() const =0