00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef DATASVC_SMARTDATAOBJECTPTR_H
00014 #define DATASVC_SMARTDATAOBJECTPTR_H 1
00015
00016
00017 #include <string>
00018
00019
00020 #include "GaudiKernel/Kernel.h"
00021 #include "GaudiKernel/StatusCode.h"
00022
00023
00024 class SmartDataObjectPtr;
00025 class IDataProviderSvc;
00026 class IDataDirectory;
00027 class DataObject;
00028
00056 class SmartDataObjectPtr {
00057 public:
00058 typedef DataObject* (* AccessFunction) (SmartDataObjectPtr* ptr);
00060 class ObjectLoader {
00061 public:
00062 static AccessFunction access();
00063 };
00064
00066 class ObjectFinder {
00067 public:
00068 static AccessFunction access();
00069 };
00070
00071 protected:
00072
00074 mutable IDataProviderSvc* m_dataProvider;
00076 mutable IDataDirectory* m_pDirectory;
00078 mutable DataObject* m_pObject;
00080 std::string m_path;
00082 StatusCode m_status;
00084 AccessFunction m_accessFunc;
00085
00091 StatusCode find(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject);
00092
00098 StatusCode find(const std::string& fullPath, DataObject*& refpObject);
00099
00105 StatusCode retrieve(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject);
00111 StatusCode retrieve(const std::string& fullPath, DataObject*& refpObject);
00112
00117 StatusCode update(IDataDirectory* pDirectory);
00122 StatusCode update(const std::string& fullPath);
00123
00124 public:
00131 SmartDataObjectPtr(AccessFunction access, IDataProviderSvc* pService, IDataDirectory* pDir, const std::string& path)
00132 : m_dataProvider(pService),
00133 m_pDirectory(pDir),
00134 m_pObject(0),
00135 m_path(path),
00136 m_status(StatusCode::SUCCESS),
00137 m_accessFunc(access)
00138 {
00139 }
00143 SmartDataObjectPtr(const SmartDataObjectPtr& copy)
00144 : m_dataProvider(copy.m_dataProvider),
00145 m_pDirectory(copy.m_pDirectory),
00146 m_pObject(copy.m_pObject),
00147 m_path(copy.m_path),
00148 m_status(copy.m_status),
00149 m_accessFunc(copy.m_accessFunc)
00150 {
00151 }
00153 virtual ~SmartDataObjectPtr() {
00154 }
00156 virtual SmartDataObjectPtr& operator=(SmartDataObjectPtr& copy);
00157
00159 operator IDataDirectory*() {
00160 return m_pDirectory;
00161 }
00162
00164 const std::string& path() const {
00165 return m_path;
00166 }
00167
00169 IDataDirectory* directory() {
00170 return m_pDirectory;
00171 }
00172
00174 void setService( IDataProviderSvc* svc ) {
00175 m_dataProvider = svc;
00176 }
00177
00179 IDataProviderSvc* service() {
00180 return m_dataProvider;
00181 }
00182
00184 operator int() {
00185 return 0 != accessData();
00186 }
00187
00189 bool operator !() {
00190 return 0 == accessData();
00191 }
00192
00194 operator void*() {
00195 accessData();
00196 return m_pObject;
00197 }
00198
00200 operator DataObject*&() {
00201 return m_pObject;
00202 }
00203
00205 operator DataObject**() {
00206 return &m_pObject;
00207 }
00208
00210 StatusCode getLastError() const {
00211 return m_status;
00212 }
00213
00215 DataObject* accessData() {
00216 return m_accessFunc(this);
00217 }
00218
00220 static DataObject* retrieve(SmartDataObjectPtr* ptr) {
00221 return (ptr->m_pObject == 0) ? ptr->retrieveObject() : ptr->m_pObject;
00222 }
00223
00225 static DataObject* find(SmartDataObjectPtr* ptr) {
00226 return (ptr->m_pObject == 0) ? ptr->findObject() : ptr->m_pObject;
00227 }
00228
00230 static DataObject* update(SmartDataObjectPtr* ptr) {
00231 return ptr->updateObject();
00232 }
00233
00239 DataObject* retrieveObject();
00240
00246 DataObject* findObject();
00247
00254 DataObject* updateObject();
00255 };
00256
00267 bool operator&& (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2);
00268
00283 bool operator|| (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2);
00284
00285 #endif // DATASVC_SmartDataObjectPtr_H