emcObjectManagerRegister.C

Go to the documentation of this file.
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 }