00001
00002 #ifndef _GLMANAGER_H
00003 #define _GLMANAGER_H
00004
00005 #include <string>
00006 #include <map>
00007 #include <vector>
00008
00009 namespace gk {
00010
00011
00012 template< class Object >
00013 class GLManager
00014 {
00015 typedef std::map<std::string, Object *> name_map_type;
00016 name_map_type m_names_map;
00017
00018 std::vector<Object *> m_objects;
00019
00020
00021 GLManager( const GLManager& );
00022
00023 GLManager& operator=( const GLManager& );
00024
00025
00026 GLManager( ) {}
00027
00028
00029 ~GLManager( )
00030 {
00031 const int n= (int) m_objects.size();
00032 for(int i= 0; i < n; i++)
00033 {
00034
00035 m_objects[i]->releaseGLResource();
00036
00037 delete m_objects[i];
00038 }
00039 }
00040
00041 public:
00042
00043 Object *insert( Object *object, const std::string& name= "" )
00044 {
00045 if(name.empty() == false)
00046
00047 m_names_map.insert( std::make_pair(name, object) );
00048
00049 m_objects.push_back(object);
00050 return object;
00051 }
00052
00053
00054 Object *find( const std::string& name )
00055 {
00056 typename name_map_type::iterator found= m_names_map.find(name);
00057 if(found == m_names_map.end())
00058 return NULL;
00059 else
00060 return found->second;
00061 }
00062
00063
00064 int release( const std::string& name )
00065 {
00066 typename name_map_type::iterator found= m_names_map.find(name);
00067 if(found == m_names_map.end())
00068 return -1;
00069
00070
00071 found->second->releaseGLResource();
00072 delete found->second;
00073 m_names_map.erase(found);
00074 return 0;
00075 }
00076
00077 static
00078 GLManager& manager( )
00079 {
00080 static GLManager manager;
00081 return manager;
00082 }
00083 };
00084
00085 }
00086
00087 #endif