OBTServiceManager.h

Go to the documentation of this file.
00001 #ifndef OBTServiceManager_H
00002 #define OBTServiceManager_H
00003 
00004 #include <map>
00005 #include <typeinfo>
00006 
00007 #include "OBT.h"
00008 #include "OBTSingleton.h"
00009 #include "OBTIService.h"
00010 #include "OBT_ASSERT.h"
00011 
00012 namespace OBT
00013 {
00022         class OBT_API ServiceManager
00023         {
00024                 friend class Singleton< ServiceManager > ;
00025 
00026         public:
00027 
00032                 template <class TService>
00033                 friend TService* getService( unsigned int ID = 0 ) ;
00038                 template <class TService>
00039                 friend const std::map< unsigned int, IService* >* getServices() ;
00040 
00045                 template <class TService>
00046                 friend void addService( TService* service, unsigned int ID = 0 ) ;
00047 
00051                 template <class TService>
00052                 friend void removeService( unsigned int ID = 0 ) ;
00053 
00054         private:
00055 
00058                 ServiceManager() ;
00059 
00062                 ServiceManager( const ServiceManager& ) ;
00063 
00066                 virtual ~ServiceManager() ;
00067 
00070                 const ServiceManager& operator=( const ServiceManager& ) ;
00071 
00073                 typedef std::map< std::string, std::map< unsigned int, IService* > >
00074                         ServicesMap ;
00075 
00076                 ServicesMap _services ;
00077         } ;
00078 
00079         template class OBT_API Singleton< ServiceManager > ;
00080 
00081         //-------------------------------------------------------------------------
00082         // getService
00083         //-------------------------------------------------------------------------
00084         template <class TService>
00085         TService* getService( unsigned int ID /*= 0*/ )
00086         {
00087                 ServiceManager::ServicesMap& services( Singleton< ServiceManager >::getInstance()._services ) ;
00088                 ServiceManager::ServicesMap::iterator servicesIte( services.find( typeid( TService ).name() ) ) ;
00089                 if ( servicesIte != services.end() )
00090                 {
00091                         std::map< unsigned int, IService* >::iterator ite( servicesIte->second.find( ID ) ) ;
00092                         if ( ite != servicesIte->second.end() )
00093                         {
00094                                 return static_cast<TService*>( ite->second ) ;
00095                         }
00096                 }
00097                 TRACE_WARNING( "The following service was not found : " << typeid( TService ).name() << " with id " << ID ) ;
00098                 return NULL ;
00099         }
00100 
00101         //-------------------------------------------------------------------------
00102         // getServices
00103         //-------------------------------------------------------------------------
00104         template <class TService>
00105         const std::map< unsigned int, IService* >* getServices()
00106         {
00107                 const std::map< unsigned int, IService* >* servicesFound = 0 ;
00108                 ServiceManager::ServicesMap& services( Singleton< ServiceManager >::getInstance()._services ) ;
00109                 ServiceManager::ServicesMap::const_iterator servicesIte( services.find( typeid( TService ).name() ) ) ;
00110                 if ( servicesIte != services.end() )
00111                 {
00112                         servicesFound = &servicesIte->second ;
00113                 }
00114                 else
00115                 {
00116                         TRACE_WARNING( "The following services was not found : " << typeid( TService ).name() ) ;
00117                 }
00118                 return servicesFound ;
00119         }
00120 
00121         //-------------------------------------------------------------------------
00122         // addService
00123         //-------------------------------------------------------------------------
00124         template <class TService>
00125         inline void addService( TService* service, unsigned int ID /*= 0*/ ) 
00126         {
00127                 OBT_DBG_ASSERT( service != NULL ) ;
00128                 ServiceManager::ServicesMap::mapped_type& serviceMap
00129                         ( Singleton< ServiceManager >::getInstance()._services[ typeid( TService ).name() ] ) ;
00130                 serviceMap[ ID ] = service ;
00131         }
00132 
00133         //-------------------------------------------------------------------------
00134         // removeService
00135         //-------------------------------------------------------------------------
00136         template <class TService>
00137         inline void removeService( unsigned int ID /*= 0*/ ) 
00138         {
00139                 ServiceManager::ServicesMap::iterator servicesIte
00140                         ( Singleton< ServiceManager >::getInstance()._services.find( typeid( TService ).name() ) ) ;
00141                 if ( servicesIte != Singleton< ServiceManager >::getInstance()._services.end() )
00142                 {
00143                         std::map< unsigned int, IService* >::iterator ite( servicesIte->second.find( ID ) ) ;
00144                         if ( ite != servicesIte->second.end() )
00145                         {
00146                                 servicesIte->second.erase( ite ) ;
00147                                 if ( servicesIte->second.empty() )
00148                                 {
00149                                         Singleton< ServiceManager >::getInstance()._services.erase( servicesIte ) ;
00150                                 }
00151                         }
00152                 }
00153         }
00154 }
00155 #endif //OBTServiceManager_H

Generated on Wed Oct 1 11:34:05 2008 for OBT by  doxygen 1.5.3