The Gaudi Framework  v33r0 (d5ea422b)
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 
78  BaseObjectMemberFunction* makeCopy() const override {
80  }
81 
83  const std::type_info& type() const override { return typeid( CallerClass ); }
84 
86  bool match( BaseObjectMemberFunction* bmf ) const override {
87  if ( bmf == (BaseObjectMemberFunction*)this ) return true;
88  if ( type() == bmf->type() ) {
89  ObjectMemberFunction* mf = dynamic_cast<ObjectMemberFunction*>( bmf );
91  }
92  return false;
93  }
94 
96  DataObject* castToDataObject() const override { return dynamic_cast<DataObject*>( m_instance ); }
97 
99  ValidDataObject* castToValidDataObject() const override { return dynamic_cast<ValidDataObject*>( m_instance ); }
100 
102  void* castToVoid() const override { return dynamic_cast<void*>( m_instance ); }
103 
104 protected:
106  ObjectMemberFunction( CallerClass* instance, const MemberFunctionType& mf )
107  : m_instance( instance ), m_memberFunction( mf ) {}
108 
110  CallerClass* m_instance;
111 
114 
115  friend class IUpdateManagerSvc;
116 };
117 
126 public:
128  virtual ~BasePtrSetter() = default;
130  virtual void set( DataObject* ) = 0;
132  virtual bool isNull() = 0;
133 };
134 
142 class GAUDI_API IUpdateManagerSvc : virtual public IInterface {
143 private:
148  template <class ActualType>
149  class PtrSetter final : public BasePtrSetter {
150  public:
151  using dest_type = ActualType;
152  PtrSetter( dest_type*& dest ) : m_storage( &dest ) { *m_storage = nullptr; }
153  void set( DataObject* obj ) override { *m_storage = dynamic_cast<dest_type*>( obj ); }
154  bool isNull() override { return *m_storage == nullptr; }
155 
156  private:
159  };
160 
161 public:
164 
166  virtual IDataProviderSvc* dataProvider() const = 0;
167 
169  virtual IDetDataSvc* detDataSvc() const = 0;
170 
177  template <class CallerClass>
178  inline void registerCondition( CallerClass* instance, const std::string& condition = "",
180  i_registerCondition( condition, new ObjectMemberFunction<CallerClass>( instance, mf ) );
181  }
182 
183  template <class CallerClass, class CondType>
184  inline void registerCondition( CallerClass* instance, const std::string& condition,
186  CondType*& condPtrDest ) {
187  i_registerCondition( condition, new ObjectMemberFunction<CallerClass>( instance, mf ),
188  new PtrSetter<CondType>( condPtrDest ) );
189  }
190 
192  template <class CallerClass>
193  inline void registerCondition( CallerClass* instance, const char* condition,
195  i_registerCondition( std::string( condition ), new ObjectMemberFunction<CallerClass>( instance, mf ) );
196  }
197 
201  template <class CallerClass, class ObjectClass>
202  inline void registerCondition( CallerClass* instance, ObjectClass* obj,
204  i_registerCondition( dynamic_cast<void*>( obj ), new ObjectMemberFunction<CallerClass>( instance, mf ) );
205  }
206 
210  template <class CallerClass>
211  inline void unregister( CallerClass* instance ) {
212  i_unregister( dynamic_cast<void*>( instance ) );
213  }
214 
217  template <class CallerClass>
218  inline void invalidate( CallerClass* instance ) {
219  i_invalidate( dynamic_cast<void*>( instance ) );
220  }
221 
224  virtual bool getValidity( const std::string path, Gaudi::Time& since, Gaudi::Time& until,
225  bool path_to_db = false ) = 0;
226 
231  virtual void setValidity( const std::string path, const Gaudi::Time& since, const Gaudi::Time& until,
232  bool path_to_db = false ) = 0;
233 
235  virtual StatusCode newEvent() = 0;
239  virtual StatusCode newEvent( const Gaudi::Time& ) = 0;
240 
243  template <class CallerClass>
244  inline StatusCode update( CallerClass* instance ) {
245  return i_update( dynamic_cast<void*>( instance ) );
246  }
247 
249  virtual void dump() = 0;
250 
252  virtual void acquireLock() = 0;
254  virtual void releaseLock() = 0;
255 
259  virtual void purge() = 0;
260 
265  class PythonHelper;
266 
267 protected:
268  // virtual StatusCode i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf) = 0;
269  virtual void i_registerCondition( const std::string& condition, BaseObjectMemberFunction* mf,
270  BasePtrSetter* ptr_dest = nullptr ) = 0;
271  virtual void i_registerCondition( void* obj, BaseObjectMemberFunction* mf ) = 0;
272  virtual StatusCode i_update( void* instance ) = 0;
273  virtual void i_unregister( void* instance ) = 0;
274  virtual void i_invalidate( void* instance ) = 0;
275 
276  friend class PythonHelper;
277 };
278 #endif // GAUDIKERNEL_IUPDATEMANAGERSVC_H
virtual DataObject * castToDataObject() const =0
MemberFunctionType m_memberFunction
Pointer to the member function.
virtual bool isNull()=0
tells if the internal pointer is nullptr.
ValidDataObject * castToValidDataObject() const override
Cast the object to ValidDataObject.
Base class to set the pointer to an object of a class derived from DataObject in a generic way.
virtual void * castToVoid() const =0
bool match(BaseObjectMemberFunction *bmf) const override
Comparison between two BaseObjectMemberFunction instances.
void invalidate(CallerClass *instance)
Invalidate the given object in the dependency network.
Templated specialization of BasePtrSetter.
Abstract interface for a DataSvc manipulating condition data (i.e.
Definition: IDetDataSvc.h:32
bool isNull() override
tells if the internal pointer is nullptr.
constexpr static const auto SUCCESS
Definition: StatusCode.h:96
void set(DataObject *obj) override
sets the internal pointer to the provided data object (with a dynamic_cast).
BaseObjectMemberFunction * makeCopy() const override
Clone method to be able to copy an ObjectMemberFunction from the BaseObjectMemberFunction interface.
void unregister(CallerClass *instance)
Generic objects can be unregistered from the UpdateManagerSvc.
virtual bool match(BaseObjectMemberFunction *) const =0
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...
virtual BaseObjectMemberFunction * makeCopy() const =0
STL class.
virtual StatusCode operator()() const =0
CallerClass * m_instance
Pointer to the object.
void registerCondition(CallerClass *instance, const std::string &condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf, CondType *&condPtrDest)
Based on seal::Time.
Definition: Time.h:241
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
StatusCode(CallerClass::* MemberFunctionType)()
MemberFunctionType is the type for a pointer to a member function of class CallerClass.
Definition of the basic interface.
Definition: IInterface.h:254
Helper class implemented in the python dictionary to allow access from python to template member func...
virtual void set(DataObject *)=0
sets the internal pointer to the provided data object (with a dynamic_cast).
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.
virtual const std::type_info & type() const =0
dest_type ** m_storage
pointer to the pointer to fill provided by the user.
#define DeclareInterfaceID(iface, major, minor)
Macro to declare the interface ID when using the new mechanism of extending and implementing interfac...
Definition: IInterface.h:23
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 ~BasePtrSetter()=default
Empty virtual destructor.
virtual ~BaseObjectMemberFunction()=default
Virtual destructor.
DataObject * castToDataObject() const override
Cast the object to DataObject.
void * castToVoid() const override
Cast the object to void with dynamic_cast.
#define GAUDI_API
Definition: Kernel.h:81
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:40
virtual ValidDataObject * castToValidDataObject() const =0
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
void registerCondition(CallerClass *instance, const char *condition, typename ObjectMemberFunction< CallerClass >::MemberFunctionType mf=nullptr)
See above. Needed to avoid conflicts with the next one.
const std::type_info & type() const override
Returns the type_info of the CallerClass.
StatusCode operator()() const override
Calls the member function of the object and returns the StatusCode.
Base class of ObjectMemberFunction.