00001
00002 #ifndef _IOMANAGER_H
00003 #define _IOMANAGER_H
00004
00005 #include <string>
00006 #include <map>
00007
00008 #ifdef VERBOSE_DEBUG
00009 #include <cstdio>
00010 #include <typeinfo>
00011 #endif
00012
00013 namespace gk {
00014
00015
00016 struct IOName
00017 {
00018 std::string m_filename;
00019 std::string m_name;
00020
00021 IOName( const std::string& filename, const std::string& name )
00022 :
00023 m_filename(filename),
00024 m_name(name)
00025 {}
00026
00027 ~IOName( ) {}
00028
00029 const std::string& name( ) const
00030 {
00031 return m_name;
00032 }
00033
00034 const std::string& filename( ) const
00035 {
00036 return m_filename;
00037 }
00038
00039
00040 bool operator<( const IOName& b ) const
00041 {
00042 if(m_filename < b.m_filename)
00043 return true;
00044 else if(m_filename > b.m_filename)
00045 return false;
00046 return (m_name < b.m_name);
00047 }
00048 };
00049
00050
00051 template< class Object >
00052 class IOManager
00053 {
00054
00055 IOManager( const IOManager& );
00056 IOManager& operator=( const IOManager& );
00057
00058 protected:
00059
00060 IOManager( )
00061 {
00062
00063
00064
00065 }
00066
00067
00068 ~IOManager( )
00069 {
00070 for(typename names_map_type::iterator
00071 i= m_names_map.begin(); i != m_names_map.end(); ++i)
00072 {
00073
00074
00075
00076
00077
00078
00079 delete i->second;
00080 }
00081
00082
00083
00084
00085 }
00086
00087 typedef std::map<IOName, Object *> names_map_type;
00088 names_map_type m_names_map;
00089
00090
00091 typedef std::map<Object *, IOName> objects_map_type;
00092 objects_map_type m_objects_map;
00093
00094 public:
00095
00096 Object *insert( Object *object, const std::string& filename, const std::string& name= "" )
00097 {
00098 if(object == NULL)
00099 return NULL;
00100
00101 #ifdef VERBOSE_DEBUG
00102 printf("IOManager<%s> %p::insert( ): object %p '%s', filename '%s'\n",
00103 typeid(Object).name(), this,
00104 object, name.c_str(), filename.c_str());
00105 #endif
00106
00107 m_names_map.insert( std::make_pair( IOName(filename, name), object ) );
00108 m_objects_map.insert( std::make_pair( object, IOName(filename, name) ) );
00109 return object;
00110 }
00111
00112
00113 Object *find( const std::string& filename, const std::string& name= "" )
00114 {
00115 typename names_map_type::iterator found= m_names_map.find( IOName(filename, name) );
00116 #ifdef VERBOSE_DEBUG
00117 printf("IOManager<%s> %p::find( ): object '%s', filename '%s'... ",
00118 typeid(Object).name(), this,
00119 name.c_str(), filename.c_str());
00120 if(found != m_names_map.end())
00121 printf("found object %p done.\n", found->second);
00122 else
00123 printf("failed.\n");
00124 #endif
00125
00126 if(found == m_names_map.end())
00127 return NULL;
00128 else
00129 return found->second;
00130 }
00131
00132
00133 const IOName *find( Object *object )
00134 {
00135 typename objects_map_type::iterator found= m_objects_map.find( object );
00136 #ifdef VERBOSE_DEBUG
00137 printf("IOManager<%s> %p::find( ): object %p... ", typeid(Object).name(), this, object);
00138 if(found != m_objects_map.end())
00139 printf("found object '%s', filename '%s' done.\n",
00140 found->second.m_name.c_str(), found->second.m_filename.c_str());
00141 else
00142 printf("failed.\n");
00143 #endif
00144
00145 if(found == m_objects_map.end())
00146 return NULL;
00147 else
00148 return &found->second;
00149 }
00150 };
00151
00152 }
00153
00154 #endif