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

SmartDataObjectPtr.cpp

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/GaudiKernel/src/Lib/SmartDataObjectPtr.cpp,v 1.1.1.1 2001/04/18 18:14:18 tlindner Exp $
00002 //      ====================================================================
00003 //      SmartDataObjectPtr.cpp
00004 //      --------------------------------------------------------------------
00005 //
00006 //      Package   : 
00007 //
00008 //      Author    : Markus Frank
00009 //
00010 //      ====================================================================
00011 #define DATASVC_SmartDataObjectPtr_CPP 1
00012 
00013 // Framework include files
00014 #include "GaudiKernel/DataObject.h"
00015 #include "GaudiKernel/IDataProviderSvc.h"
00016 #include "GaudiKernel/IDataDirectory.h"
00017 #include "GaudiKernel/SmartDataObjectPtr.h"
00018 
00019 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectLoader::access()   {
00020   return &SmartDataObjectPtr::retrieve;
00021 }
00022 
00023 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectFinder::access()   {
00024   return &SmartDataObjectPtr::find;
00025 }
00026 
00028 SmartDataObjectPtr& SmartDataObjectPtr::operator=(SmartDataObjectPtr& copy)   {
00029   m_path          = copy.m_path;
00030   m_pObject       = copy.m_pObject;
00031   m_pDirectory    = copy.m_pDirectory;
00032   m_dataProvider  = copy.m_dataProvider;
00033   return *this;
00034 }
00035 
00037 StatusCode SmartDataObjectPtr::retrieve(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject)    {
00038   StatusCode status = StatusCode::FAILURE;
00039   if ( 0 != m_dataProvider && 0 != pDirectory )    {
00040     status = m_dataProvider->retrieveObject(pDirectory, path, refpObject);
00041   }
00042   return status;
00043 }
00044 
00046 StatusCode SmartDataObjectPtr::retrieve(const std::string& fullPath, DataObject*& refpObject)    {
00047   StatusCode status = StatusCode::FAILURE;
00048   if ( 0 != m_dataProvider )    {
00049     status = m_dataProvider->retrieveObject(fullPath, refpObject);
00050   }
00051   return status;
00052 }
00053 
00055 StatusCode SmartDataObjectPtr::find(IDataDirectory* pDirectory, const std::string& path, DataObject*& refpObject)    {
00056   StatusCode status = StatusCode::FAILURE;
00057   if ( 0 != m_dataProvider && 0 != pDirectory )    {
00058     status = m_dataProvider->findObject(pDirectory, path, refpObject);
00059   }
00060   return status;
00061 }
00062 
00064 StatusCode SmartDataObjectPtr::find(const std::string& fullPath, DataObject*& refpObject)    {
00065   StatusCode status = StatusCode::FAILURE;
00066   if ( 0 != m_dataProvider )    {
00067     status = m_dataProvider->findObject(fullPath, refpObject);
00068   }
00069   return status;
00070 }
00071 
00072 
00074 StatusCode SmartDataObjectPtr::update(IDataDirectory* pDirectory)    {
00075   StatusCode status = StatusCode::FAILURE;
00076   if ( 0 != m_dataProvider && 0 != pDirectory )    {
00077     status = m_dataProvider->updateObject(pDirectory);
00078   }
00079   return status;
00080 }
00081 
00083 StatusCode SmartDataObjectPtr::update(const std::string& fullPath)    {
00084   StatusCode status = StatusCode::FAILURE;
00085   if ( 0 != m_dataProvider )    {
00086     status = m_dataProvider->updateObject(fullPath);
00087   }
00088   return status;
00089 }
00090 
00096 DataObject* SmartDataObjectPtr::retrieveObject()   {
00097   if ( 0 == m_pObject )   {
00098     if ( 0 == m_pDirectory )    {
00099       m_status = retrieve(m_path, m_pObject);
00100     }
00101     else    {
00102       IDataDirectory* pDir = m_pDirectory->find(m_path);
00103       if ( 0 != pDir )
00104         m_status = retrieve(pDir, "", m_pObject);
00105       else 
00106         m_status = retrieve(m_pDirectory, m_path, m_pObject);
00107     }
00108     if ( m_status.isSuccess() )   {
00109       m_pDirectory = m_pObject->directory();
00110       m_path = "";
00111     }
00112   }
00113   return m_pObject;
00114 }
00115 
00121 DataObject* SmartDataObjectPtr::findObject()   {
00122   if ( 0 == m_pObject )   {
00123     if ( 0 == m_pDirectory )    {
00124       m_status = find(m_path, m_pObject);
00125     }
00126     else    {
00127       IDataDirectory* pDir = m_pDirectory->find(m_path);
00128       if ( 0 != pDir )
00129         m_status = find(pDir, "", m_pObject);
00130       else 
00131         m_status = find(m_pDirectory, m_path, m_pObject);
00132     }
00133     if ( m_status.isSuccess() )   {
00134       m_pDirectory = m_pObject->directory();
00135       m_path = "";
00136     }
00137   }
00138   return m_pObject;
00139 }
00140 
00146 DataObject* SmartDataObjectPtr::updateObject()   {
00147   if ( 0 == m_pObject )   {
00148     accessData();    // Have to load AND update if not present.
00149   }
00150   if ( m_status.isSuccess() )   {
00151     m_status = (0 == m_pDirectory) ? update(m_path) : update(m_pDirectory);
00152     if ( !m_status.isSuccess() )  m_pObject = 0;
00153   }
00154   return m_pObject;
00155 }
00156 
00169 bool operator&& (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2)  {
00170   if ( 0 != object_1.accessData() )    {      // Test existence of the first object
00171     if ( 0 != object_2.accessData() )    {    // Test existence of the second object
00172       return true;                            // Fine: Both objects exist
00173     }
00174   }
00175   return false;                               // Tough luck: One is missing.
00176 }
00177 
00194 bool operator|| (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2)  {
00195   if ( 0 != object_1.accessData() )    {      // Test existence of the first object
00196     return true;
00197   }
00198   if ( 0 != object_2.accessData() )    {      // Test existence of the second object
00199     return true;
00200   }
00201   return false;                               // Tough luck: Both are missing.
00202 }
00203 

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