| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# SmartDataObjectPtr.cpp

Go to the documentation of this file.

    00001 // $Header: /local/reps/Gaudi/GaudiKernel/src/Lib/SmartDataObjectPtr.cpp,v 1.5 2003/06/25 15:59:40 mato Exp $
    00002 //      ====================================================================
    00003 //      SmartDataObjectPtr.cpp
    00004 //      --------------------------------------------------------------------
    00005 //
    00006 //      Package   :
    00007 //
    00008 //      Author    : Markus Frank
    00009 //
    00010 //      ====================================================================
    00011 #define GAUDIKERNEL_SMARTDATAOBJECTPTR_CPP 1
    00012
    00013 // Framework include files
    00014 #include "GaudiKernel/DataObject.h"
    00015 #include "GaudiKernel/IDataProviderSvc.h"
    00016 #include "GaudiKernel/SmartDataObjectPtr.h"
    00017
    00018 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectLoader::access()   {
    00019   return &SmartDataObjectPtr::retrieve;
    00020 }
    00021
    00022 SmartDataObjectPtr::AccessFunction SmartDataObjectPtr::ObjectFinder::access()   {
    00023   return &SmartDataObjectPtr::find;
    00024 }
    00025
    00027 SmartDataObjectPtr& SmartDataObjectPtr::operator=(const SmartDataObjectPtr& copy)   {
    00028   m_path          = copy.m_path;
    00029   m_pRegistry     = copy.m_pRegistry;
    00030   m_dataProvider  = copy.m_dataProvider;
    00031   return *this;
    00032 }
    00033
    00035 StatusCode SmartDataObjectPtr::retrieve(IRegistry* pRegistry, const std::string& path, DataObject*& refpObject)    {
    00036   StatusCode status = StatusCode::FAILURE;
    00037   if ( 0 != m_dataProvider && 0 != pRegistry )    {
    00038     status = m_dataProvider->retrieveObject(pRegistry, path, refpObject);
    00039   }
    00040   return status;
    00041 }
    00042
    00044 StatusCode SmartDataObjectPtr::retrieve(const std::string& fullPath, DataObject*& refpObject)    {
    00045   StatusCode status = StatusCode::FAILURE;
    00046   if ( 0 != m_dataProvider )    {
    00047     status = m_dataProvider->retrieveObject(fullPath, refpObject);
    00048   }
    00049   return status;
    00050 }
    00051
    00053 StatusCode SmartDataObjectPtr::find(IRegistry* pDirectory, const std::string& path, DataObject*& refpObject)    {
    00054   StatusCode status = StatusCode::FAILURE;
    00055   if ( 0 != m_dataProvider && 0 != pDirectory )    {
    00056     status = m_dataProvider->findObject(pDirectory, path, refpObject);
    00057   }
    00058   return status;
    00059 }
    00060
    00062 StatusCode SmartDataObjectPtr::find(const std::string& fullPath, DataObject*& refpObject)    {
    00063   StatusCode status = StatusCode::FAILURE;
    00064   if ( 0 != m_dataProvider )    {
    00065     status = m_dataProvider->findObject(fullPath, refpObject);
    00066   }
    00067   return status;
    00068 }
    00069
    00070
    00072 StatusCode SmartDataObjectPtr::update(IRegistry* pRegistry)    {
    00073   StatusCode status = StatusCode::FAILURE;
    00074   if ( 0 != m_dataProvider && 0 != pRegistry )    {
    00075     status = m_dataProvider->updateObject(pRegistry);
    00076   }
    00077   return status;
    00078 }
    00079
    00081 StatusCode SmartDataObjectPtr::update(const std::string& fullPath)    {
    00082   StatusCode status = StatusCode::FAILURE;
    00083   if ( 0 != m_dataProvider )    {
    00084     status = m_dataProvider->updateObject(fullPath);
    00085   }
    00086   return status;
    00087 }
    00088
    00094 DataObject* SmartDataObjectPtr::retrieveObject()   {
    00095   DataObject* pObj = 0;
    00096   m_status = (0==m_pRegistry) ? retrieve(m_path,pObj) : retrieve(m_pRegistry,m_path,pObj);
    00097   if ( m_status.isSuccess() )   {
    00098     m_pRegistry = pObj->registry();
    00099     m_path = "";
    00100   }
    00101   return pObj;
    00102 }
    00103
    00109 DataObject* SmartDataObjectPtr::findObject()   {
    00110   DataObject* pObj = 0;
    00111   m_status = (0==m_pRegistry) ? find(m_path,pObj) : find(m_pRegistry,m_path,pObj);
    00112   if ( m_status.isSuccess() )   {
    00113     m_pRegistry = pObj->registry();
    00114     m_path = "";
    00115   }
    00116   return pObj;
    00117 }
    00118
    00124 DataObject* SmartDataObjectPtr::updateObject()   {
    00125   DataObject* pObj = accessData();    // Have to load AND update if not present.
    00126   if ( m_status.isSuccess() )   {
    00127     m_status = (0 == m_pRegistry) ? update(m_path) : update(m_pRegistry);
    00128     if ( !m_status.isSuccess() )  pObj = 0;
    00129   }
    00130   return pObj;
    00131 }
    00132
    00145 bool operator&& (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2)  {
    00146   if ( 0 != object_1.accessData() )    {      // Test existence of the first object
    00147     if ( 0 != object_2.accessData() )    {    // Test existence of the second object
    00148       return true;                            // Fine: Both objects exist
    00149     }
    00150   }
    00151   return false;                               // Tough luck: One is missing.
    00152 }
    00153
    00170 bool operator|| (SmartDataObjectPtr& object_1, SmartDataObjectPtr& object_2)  {
    00171   if ( 0 != object_1.accessData() )    {      // Test existence of the first object
    00172     return true;
    00173   }
    00174   if ( 0 != object_2.accessData() )    {      // Test existence of the second object
    00175     return true;
    00176   }
    00177   return false;                               // Tough luck: Both are missing.
    00178 }
    00179