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
00083
00084 template <class TService>
00085 TService* getService( unsigned int ID )
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
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
00123
00124 template <class TService>
00125 inline void addService( TService* service, unsigned int ID )
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
00135
00136 template <class TService>
00137 inline void removeService( unsigned int ID )
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