Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

SmartDataObjectPtr.h

Go to the documentation of this file.
00001 //      ====================================================================
00002 //      SmartDataObjectPtr.h
00003 //      --------------------------------------------------------------------
00004 //
00005 //      Package    : Gaudi/DataSvc ( The LHCb Offline System)
00006 //
00007 //  Description: Implementation of the "worker" part of the 
00008 //               smart pointer classes used to access
00009 //               easily (and efficiently) data stores.
00010 //
00011 //      Author     : M.Frank
00012 //      ====================================================================
00013 #ifndef DATASVC_SMARTDATAOBJECTPTR_H
00014 #define DATASVC_SMARTDATAOBJECTPTR_H 1
00015 
00016 // STL include files
00017 #include <string>
00018 
00019 // Framework include files
00020 #include "GaudiKernel/Kernel.h"
00021 #include "GaudiKernel/StatusCode.h"
00022 
00023 // Forward declarations
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

Generated at Wed Nov 21 12:22:05 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000