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 m_names_map(),
00029 m_objects()
00030 {}
00031
00032
00033 virtual ~GLManager( )
00034 {
00035 const int n= (int) m_objects.size();
00036 for(int i= 0; i < n; i++)
00037 {
00038
00039 m_objects[i]->releaseGLResource();
00040
00041 delete m_objects[i];
00042 }
00043 }
00044
00045 public:
00046
00047 Object *insert( Object *object, const std::string& name= "" )
00048 {
00049 if(name.empty() == false)
00050
00051 m_names_map.insert( std::make_pair(name, object) );
00052
00053 m_objects.push_back(object);
00054 return object;
00055 }
00056
00057
00058 Object *find( const std::string& name )
00059 {
00060 typename name_map_type::iterator found= m_names_map.find(name);
00061 if(found == m_names_map.end())
00062 return NULL;
00063 else
00064 return found->second;
00065 }
00066
00067
00068 int release( const std::string& name )
00069 {
00070 typename name_map_type::iterator found= m_names_map.find(name);
00071 if(found == m_names_map.end())
00072 return -1;
00073
00074
00075 found->second->releaseGLResource();
00076 delete found->second;
00077 m_names_map.erase(found);
00078 return 0;
00079 }
00080
00081 static
00082 GLManager& manager( )
00083 {
00084 static GLManager manager;
00085 return manager;
00086 }
00087 };
00088
00089 }
00090
00091 #endif