00001 #if !defined(HIDDEN_FROM_DOC)
00002 #if !defined _SB_CONST_CHAR_MAP_H_
00003 #define _SB_CONST_CHAR_MAP_H_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <Inventor/STL/map>
00027 #include <Inventor/STL/functional>
00028
00034 template <typename T>
00035
00036 {
00037 public:
00039 SbConstCharMap()
00040 {}
00041
00043 ~SbConstCharMap()
00044 { clear(); }
00045
00047 struct StrCompare {
00048 bool operator() (const char* str1, const char* str2) const
00049 {
00050 if ( str1 == str2 )
00051 return true;
00052 return strcmp(str1, str2) < 0;
00053 }
00054 };
00055
00057 typedef typename std::map<const char*, T , StrCompare> UniformMap;
00058 typedef typename UniformMap::value_type value_type;
00059 typedef typename UniformMap::iterator iterator;
00060 typedef typename UniformMap::const_iterator const_iterator;
00061
00063 const_iterator begin() const
00064 { return m_uniforms.begin(); }
00065
00067 iterator begin()
00068 { return m_uniforms.begin(); }
00069
00071 const_iterator end() const
00072 { return m_uniforms.end(); }
00073
00075 iterator end()
00076 { return m_uniforms.end(); }
00077
00079 bool empty() const
00080 { return m_uniforms.empty(); }
00081
00083 size_t size() const
00084 { return m_uniforms.size(); }
00085
00087 iterator find(const char* key)
00088 { return m_uniforms.find(key); }
00089
00091 const_iterator find(const char* key) const
00092 { return m_uniforms.find(key); }
00093
00095 iterator erase (iterator it)
00096 {
00097 free((void*)it->first);
00098 return m_uniforms.erase(it);
00099 }
00100
00102 void clear()
00103 {
00104 iterator it = m_uniforms.begin();
00105 while(it!=m_uniforms.end())
00106 {
00107 free((void*)it->first);
00108 ++it;
00109 }
00110 m_uniforms.clear();
00111 }
00112
00114 T& operator[] ( const char* name )
00115 {
00116 iterator it = find(name);
00117 if ( it==end())
00118 {
00119 #ifdef _WIN32
00120 return m_uniforms[_strdup(name)];
00121 #else
00122 return m_uniforms[strdup(name)];
00123 #endif
00124 }
00125 else
00126 return ((*it).second);
00127 }
00128
00130 SbConstCharMap<T>& operator=(const SbConstCharMap<T>& copyFrom)
00131 {
00132
00133 clear();
00134
00135 iterator insertedIt = begin();
00136 const_iterator it = copyFrom.begin();
00137 while(it!=copyFrom.end())
00138 {
00139 #ifdef _WIN32
00140 insertedIt = m_uniforms.insert(insertedIt,value_type(_strdup((*it).first),(*it).second));
00141 #else
00142 insertedIt = m_uniforms.insert(insertedIt,value_type(strdup((*it).first),(*it).second));
00143 #endif
00144 ++it;
00145 }
00146 return *this;
00147 }
00148
00150 friend int operator !=(const SbConstCharMap<T>& map1, const SbConstCharMap<T>& map2)
00151 { return !(map1==map2); }
00152
00154 friend int operator ==(const SbConstCharMap<T>& map1, const SbConstCharMap<T>& map2)
00155 {
00156 if ( map1.size() != map2.size() )
00157 return false;
00158
00159 const const_iterator itEnd1 = map1.end();
00160 const_iterator it1 = map1.begin();
00161 const_iterator it2 = map2.begin();
00162 for (; it1 != itEnd1; ++it1, ++it2)
00163 {
00164 if ( it1->second != it2->second )
00165 return false;
00166
00167
00168
00169 else if ( strcmp(it1->first, it2->first) != 0 )
00170 return false;
00171 }
00172 return true;
00173 }
00174
00175 private:
00176
00177 UniformMap m_uniforms;
00178 };
00179
00180 #endif //_SB_CONST_CHAR_MAP_H_
00181 #endif // HIDDEN_FROM_DOC
00182