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 m_names_map(),
00063 m_objects_map()
00064 {}
00065
00066
00067 virtual ~IOManager( )
00068 {
00069 for(typename names_map_type::iterator
00070 i= m_names_map.begin(); i != m_names_map.end(); ++i)
00071 {
00072 delete i->second;
00073 }
00074 }
00075
00076 typedef std::map<IOName, Object *> names_map_type;
00077 names_map_type m_names_map;
00078
00079
00080 typedef std::map<Object *, IOName> objects_map_type;
00081 objects_map_type m_objects_map;
00082
00083 public:
00084
00085 Object *insert( Object *object, const std::string& filename, const std::string& name= "" )
00086 {
00087 if(object == NULL)
00088 return NULL;
00089
00090 #ifdef VERBOSE_DEBUG
00091 printf("IOManager<%s> %p::insert( ): object %p '%s', filename '%s'\n",
00092 typeid(Object).name(), this,
00093 object, name.c_str(), filename.c_str());
00094 #endif
00095
00096 m_names_map.insert( std::make_pair( IOName(filename, name), object ) );
00097 m_objects_map.insert( std::make_pair( object, IOName(filename, name) ) );
00098 return object;
00099 }
00100
00101
00102 Object *find( const std::string& filename, const std::string& name= "" )
00103 {
00104 typename names_map_type::iterator found= m_names_map.find( IOName(filename, name) );
00105 #ifdef VERBOSE_DEBUG
00106 printf("IOManager<%s> %p::find( ): object '%s', filename '%s'... ",
00107 typeid(Object).name(), this,
00108 name.c_str(), filename.c_str());
00109 if(found != m_names_map.end())
00110 printf("found object %p done.\n", found->second);
00111 else
00112 printf("failed.\n");
00113 #endif
00114
00115 if(found == m_names_map.end())
00116 return NULL;
00117 else
00118 return found->second;
00119 }
00120
00121
00122 const IOName *find( Object *object )
00123 {
00124 typename objects_map_type::iterator found= m_objects_map.find( object );
00125 #ifdef VERBOSE_DEBUG
00126 printf("IOManager<%s> %p::find( ): object %p... ", typeid(Object).name(), this, object);
00127 if(found != m_objects_map.end())
00128 printf("found object '%s', filename '%s' done.\n",
00129 found->second.m_name.c_str(), found->second.m_filename.c_str());
00130 else
00131 printf("failed.\n");
00132 #endif
00133
00134 if(found == m_objects_map.end())
00135 return NULL;
00136 else
00137 return &found->second;
00138 }
00139 };
00140
00141 }
00142
00143 #endif