|
Gaudi Framework, version v22r1 |
| Home | Generated: Mon Feb 28 2011 |
00001 // $Id: DataObject.cpp,v 1.11 2008/11/13 15:30:27 marcocle Exp $ 00002 00003 // Experiment specific include files 00004 #include "GaudiKernel/StreamBuffer.h" 00005 #include "GaudiKernel/LinkManager.h" 00006 #include "GaudiKernel/DataObject.h" 00007 #include "GaudiKernel/IInspector.h" 00008 #include "GaudiKernel/IRegistry.h" 00009 #include <vector> 00010 #include <memory> 00011 00012 static std::string _sDataObjectCppNotRegistered("NotRegistered"); 00013 00015 DataObject::DataObject() 00016 : m_refCount(0), 00017 m_version(0), 00018 m_pRegistry(0) 00019 { 00020 m_pLinkMgr = LinkManager::newInstance(); 00021 } 00022 00024 DataObject::DataObject(const DataObject&) 00025 : m_refCount(0), 00026 m_version(0), 00027 m_pRegistry(0) 00028 { 00029 m_pLinkMgr = LinkManager::newInstance(); 00030 } 00031 00033 DataObject::~DataObject() { 00034 // Issue a warning if the object is being deleted and the reference 00035 // count is non-zero. 00036 if ( m_refCount > 0 ) { 00037 // Insert warning here 00038 } 00039 if ( m_pLinkMgr ) delete m_pLinkMgr; 00040 m_pLinkMgr = 0; 00041 } 00042 00044 unsigned long DataObject::release() { 00045 unsigned long cnt = --m_refCount; 00046 if ( 0 == m_refCount ) { 00047 delete this; 00048 } 00049 return cnt; 00050 } 00051 00053 unsigned long DataObject::addRef() { 00054 return ++m_refCount; 00055 } 00056 00058 const CLID& DataObject::clID() const { 00059 return CLID_DataObject; 00060 } 00061 00063 const CLID& DataObject::classID() { 00064 return CLID_DataObject; 00065 } 00066 00068 const std::string& DataObject::name() const { 00069 if( m_pRegistry != 0) { 00070 return m_pRegistry->name(); 00071 } 00072 else { 00073 return _sDataObjectCppNotRegistered; 00074 } 00075 } 00076 00078 StatusCode DataObject::update() { 00079 return StatusCode::SUCCESS; 00080 } 00081 00082 static DataObject* s_objPtr = 0; 00083 static DataObject** s_currObj = &s_objPtr; 00084 00085 static std::vector<DataObject**>& objectStack() { 00086 static std::auto_ptr<std::vector<DataObject**> > s_current; 00087 if ( 0 == s_current.get() ) { 00088 s_current = std::auto_ptr<std::vector<DataObject**> >(new std::vector<DataObject**>()); 00089 } 00090 return *(s_current.get()); 00091 } 00092 00093 DataObject* Gaudi::getCurrentDataObject() { 00094 return *s_currObj; 00095 } 00096 00097 void Gaudi::pushCurrentDataObject(DataObject** pobjAddr) { 00098 static std::vector<DataObject**>& c = objectStack(); 00099 c.push_back(pobjAddr); 00100 s_currObj = pobjAddr ? pobjAddr : &s_objPtr; 00101 } 00102 00103 00104 void Gaudi::popCurrentDataObject() { 00105 static std::vector<DataObject**>& c = objectStack(); 00106 switch(c.size()) { 00107 case 0: 00108 s_currObj = c.back(); 00109 c.pop_back(); 00110 break; 00111 default: 00112 s_currObj = &s_objPtr; 00113 break; 00114 } 00115 }