gKitGL
CLManager.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends