00001 #ifndef __emcObjectManager__ 00002 # include "emcObjectManager.h" 00003 #endif 00004 #ifndef __emcObjectManagerRegister__ 00005 # include "emcObjectManagerRegister.h" 00006 #endif 00007 00008 #include <iostream> 00009 00010 using namespace std; 00011 00012 emcObjectManagerRegister* emcObjectManagerRegister::fInstance = 0 ; 00013 int emcObjectManagerRegister::fCount = 0 ; 00014 00015 //___________________________________________________________________________ 00016 emcObjectManagerRegister::emcObjectManagerRegister() 00017 { 00018 // this ctor is protected because this class is a singleton 00019 // Access an instance of this object using the GetInstance() method 00020 // instead. 00021 00022 } 00023 00024 //___________________________________________________________________________ 00025 emcObjectManagerRegister::~emcObjectManagerRegister() 00026 { 00027 fCount-- ; 00028 if (fCount==0) delete fInstance ; 00029 } 00030 00031 //___________________________________________________________________________ 00032 void emcObjectManagerRegister::AddObjectManager(emcObjectManager* objmgr) 00033 { 00034 string name = objmgr->GetName() ; 00035 if (!name.empty()) { 00036 fMap[objmgr->GetName()] = objmgr ; 00037 } 00038 else { 00039 cout << "<E> emcObjectManagerRegister::AddObjectManager - objmgr not added" << endl ; 00040 } 00041 } 00042 00043 //___________________________________________________________________________ 00044 emcObjectManagerRegister* emcObjectManagerRegister::GetInstance(void) 00045 { 00046 if (!fInstance) { 00047 fInstance = new emcObjectManagerRegister() ; 00048 } 00049 fCount++ ; 00050 return fInstance ; 00051 } 00052 00053 //___________________________________________________________________________ 00054 emcObjectManager* emcObjectManagerRegister::GetObjectManager(const char* name) 00055 { 00056 emcObjectManager* objmgr = 0 ; 00057 00058 if (fMap.find(name) != fMap.end()) { 00059 00060 // FIXME. We should return here a new object created from the one 00061 // in the map, i.e. we should implement a emcObjectManager::Clone() method 00062 // and return fMap[name]->Clone() instead of just fMap[name]. 00063 00064 objmgr = fMap[name] ; 00065 } 00066 return objmgr ; 00067 } 00068 00069 //_____________________________________________________________________________ 00070 void emcObjectManagerRegister::RemoveObjectManager(emcObjectManager* obj) 00071 { 00072 map<string, emcObjectManager*>::iterator it ; 00073 bool kRemoved = false ; 00074 00075 for ( it = fMap.begin() ; it != fMap.end() && kRemoved==false ; it++ ) { 00076 if ( it->second == obj ) { 00077 fMap.erase(it) ; 00078 kRemoved = true ; 00079 } 00080 } 00081 if (!kRemoved) { 00082 cerr << __FILE__ << ":" << __LINE__ << " Cannot find object manager " << obj->GetName() << endl ; 00083 } 00084 }