00001
00002 #ifndef GAUDIKERNEL_IUPDATEMANAGERSVC_H
00003 #define GAUDIKERNEL_IUPDATEMANAGERSVC_H 1
00004
00005
00006
00007 #include <string>
00008 #include <typeinfo>
00009
00010
00011 #include "GaudiKernel/IInterface.h"
00012
00013
00014 class DataObject;
00015 class ValidDataObject;
00016 class IUpdateManagerSvc;
00017 class IDataProviderSvc;
00018 class IDetDataSvc;
00019 namespace Gaudi { class Time; }
00020
00021 static const InterfaceID IID_IUpdateManagerSvc ( "IUpdateManagerSvc", 1, 0 );
00022
00030 class BaseObjectMemberFunction {
00031 public:
00033 virtual ~BaseObjectMemberFunction() {};
00034
00035 virtual StatusCode operator() () const = 0;
00036
00037 virtual BaseObjectMemberFunction *makeCopy() const = 0;
00038
00039 virtual const std::type_info &type() const = 0;
00040
00041 virtual bool match(BaseObjectMemberFunction *) const = 0;
00042
00043 virtual DataObject* castToDataObject() const = 0;
00044 virtual ValidDataObject* castToValidDataObject() const = 0;
00045 virtual void* castToVoid() const = 0;
00046 };
00047
00055 template <class CallerClass>
00056 class ObjectMemberFunction: public BaseObjectMemberFunction {
00057 public:
00059 typedef StatusCode (CallerClass::*MemberFunctionType)();
00060
00062 virtual ~ObjectMemberFunction() {};
00063
00066 virtual StatusCode operator() () const {
00067 return (m_memberFunction != NULL)?
00068 (m_instance->*m_memberFunction)() :
00069 StatusCode::SUCCESS;
00070 }
00071
00074 virtual BaseObjectMemberFunction *makeCopy() const {
00075 return new ObjectMemberFunction<CallerClass>(m_instance,m_memberFunction);
00076 }
00077
00079 virtual const std::type_info &type() const { return typeid(CallerClass); }
00080
00082 virtual bool match(BaseObjectMemberFunction *bmf) const {
00083 if ( bmf == (BaseObjectMemberFunction *)this ) return true;
00084 if (type() == bmf->type()) {
00085 ObjectMemberFunction * mf = dynamic_cast<ObjectMemberFunction *>(bmf);
00086 return m_instance == mf->m_instance &&
00087 m_memberFunction == mf->m_memberFunction;
00088 }
00089 return false;
00090 }
00091
00093 virtual DataObject* castToDataObject() const {
00094 return dynamic_cast<DataObject*>(m_instance);
00095 }
00096
00098 virtual ValidDataObject* castToValidDataObject() const {
00099 return dynamic_cast<ValidDataObject*>(m_instance);
00100 }
00101
00103 virtual void* castToVoid() const {
00104 return dynamic_cast<void*>(m_instance);
00105 }
00106
00107 protected:
00108
00110 ObjectMemberFunction(CallerClass *instance, const MemberFunctionType &mf):
00111 m_instance(instance),m_memberFunction(mf){}
00112
00114 CallerClass *m_instance;
00115
00117 MemberFunctionType m_memberFunction;
00118
00119 friend class IUpdateManagerSvc;
00120 };
00121
00129 class BasePtrSetter {
00130 public:
00132 virtual ~BasePtrSetter() {}
00134 virtual void set(DataObject *) = 0;
00136 virtual bool isNull() = 0;
00137 };
00138
00146 template<class ActualType>
00147 class PtrSetter: public BasePtrSetter {
00148 public:
00149 typedef ActualType dest_type;
00150
00152 PtrSetter(dest_type *&dest):m_storage(&dest) {
00153 *m_storage = NULL;
00154 }
00155
00157 virtual ~PtrSetter() {}
00159 virtual void set(DataObject *obj) {
00160 *m_storage = dynamic_cast<dest_type *>(obj);
00161 }
00163 virtual bool isNull() { return *m_storage == NULL; }
00164
00165 private:
00167 dest_type **m_storage;
00168 };
00169
00177 class IUpdateManagerSvc : virtual public IInterface {
00178 public:
00179
00181 static const InterfaceID& interfaceID() { return IID_IUpdateManagerSvc; }
00182
00184 virtual IDataProviderSvc *dataProvider() const = 0;
00185
00187 virtual IDetDataSvc *detDataSvc() const = 0;
00188
00195 template <class CallerClass>
00196 inline void registerCondition(CallerClass *instance, const std::string &condition = "",
00197 typename ObjectMemberFunction<CallerClass>::MemberFunctionType mf = NULL){
00198 i_registerCondition(condition, new ObjectMemberFunction<CallerClass>(instance,mf));
00199 }
00200
00201 template <class CallerClass, class CondType>
00202 inline void registerCondition(CallerClass *instance, const std::string &condition,
00203 typename ObjectMemberFunction<CallerClass>::MemberFunctionType mf,
00204 CondType *&condPtrDest){
00205 i_registerCondition(condition, new ObjectMemberFunction<CallerClass>(instance,mf),
00206 new PtrSetter<CondType>(condPtrDest));
00207 }
00208
00210 template <class CallerClass>
00211 inline void registerCondition(CallerClass *instance, const char *condition,
00212 typename ObjectMemberFunction<CallerClass>::MemberFunctionType mf = NULL){
00213 i_registerCondition(std::string(condition), new ObjectMemberFunction<CallerClass>(instance,mf));
00214 }
00215
00219 template <class CallerClass, class ObjectClass>
00220 inline void registerCondition(CallerClass *instance, ObjectClass *obj,
00221 typename ObjectMemberFunction<CallerClass>::MemberFunctionType mf = NULL){
00222 i_registerCondition(dynamic_cast<void*>(obj), new ObjectMemberFunction<CallerClass>(instance,mf));
00223 }
00224
00228 template <class CallerClass>
00229 inline void unregister(CallerClass *instance) {
00230 i_unregister(dynamic_cast<void*>(instance));
00231 }
00232
00235 template <class CallerClass>
00236 inline void invalidate(CallerClass *instance) {i_invalidate(dynamic_cast<void*>(instance));}
00237
00240 virtual bool getValidity(const std::string path, Gaudi::Time& since, Gaudi::Time &until, bool path_to_db = false) = 0;
00241
00245 virtual void setValidity(const std::string path,
00246 const Gaudi::Time& since, const Gaudi::Time &until,
00247 bool path_to_db = false) = 0;
00248
00250 virtual StatusCode newEvent() = 0;
00254 virtual StatusCode newEvent(const Gaudi::Time &) = 0;
00255
00258 template <class CallerClass>
00259 inline StatusCode update(CallerClass *instance){
00260 return i_update(dynamic_cast<void*>(instance));
00261 }
00262
00264 virtual void dump() = 0;
00265
00267 virtual void acquireLock() = 0;
00269 virtual void releaseLock() = 0;
00270
00274 virtual void purge() = 0;
00275
00280 class PythonHelper;
00281
00282 protected:
00283
00284
00285 virtual void i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf,
00286 BasePtrSetter *ptr_dest = NULL) = 0;
00287 virtual void i_registerCondition(void *obj, BaseObjectMemberFunction *mf) = 0;
00288 virtual StatusCode i_update(void *instance) = 0;
00289 virtual void i_unregister(void *instance) = 0;
00290 virtual void i_invalidate(void *instance) = 0;
00291
00292 friend class PythonHelper;
00293
00294 private:
00295
00296 };
00297 #endif // GAUDIKERNEL_IUPDATEMANAGERSVC_H