gKitGL
|
00001 00002 #ifndef _CLMANAGER_H 00003 #define _CLMANAGER_H 00004 00005 #include <string> 00006 #include <map> 00007 #include <vector> 00008 00009 00010 namespace gk { 00011 00012 //! manager pour les ressources openCL crees directement par l'application. 00013 template< class Object > 00014 class CLManager 00015 { 00016 typedef std::map<std::string, Object *> name_map_type; 00017 name_map_type m_names_map; 00018 00019 std::vector<Object *> m_objects; 00020 00021 //! non copyable. 00022 CLManager( const CLManager& ); 00023 //! non copyable. 00024 CLManager& operator=( const CLManager& ); 00025 00026 //! constructeur. 00027 CLManager( ) 00028 : 00029 m_names_map(), 00030 m_objects() 00031 {} 00032 00033 //! destructeur. 00034 virtual ~CLManager( ) 00035 { 00036 const int n= (int) m_objects.size(); 00037 for(int i= 0; i < n; i++) 00038 { 00039 // libere les ressources openGL 00040 m_objects[i]->releaseCLResource(); 00041 // et detruit l'objet 00042 delete m_objects[i]; 00043 } 00044 } 00045 00046 public: 00047 //! reference un nouvel objet nomme. 00048 Object *insert( Object *object, const std::string& name= "" ) 00049 { 00050 if(name.empty() == false) 00051 // n'insere que les objets nommes 00052 m_names_map.insert( std::make_pair(name, object) ); 00053 00054 m_objects.push_back(object); 00055 return object; 00056 } 00057 00058 //! recherche un objet nomme. 00059 Object *find( const std::string& name ) 00060 { 00061 typename name_map_type::iterator found= m_names_map.find(name); 00062 if(found == m_names_map.end()) 00063 return NULL; 00064 else 00065 return found->second; 00066 } 00067 00068 //! detruit un objet nomme. 00069 int release( const std::string& name ) 00070 { 00071 typename name_map_type::iterator found= m_names_map.find(name); 00072 if(found == m_names_map.end()) 00073 return -1; 00074 00075 // libere les ressources openGL, de-reference l'objet 00076 found->second->releaseGLResource(); 00077 delete found->second; 00078 m_names_map.erase(found); 00079 return 0; 00080 } 00081 00082 //! acces public au singleton. 00083 static 00084 CLManager& manager( ) 00085 { 00086 static CLManager manager; 00087 return manager; 00088 } 00089 }; 00090 00091 } // namespace 00092 00093 #endif