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 { return strcmp(str1, str2) < 0; }
00050 };
00051
00053 typedef typename std::map<const char*, T , StrCompare> UniformMap;
00054 typedef typename UniformMap::value_type value_type;
00055 typedef typename UniformMap::iterator iterator;
00056 typedef typename UniformMap::const_iterator const_iterator;
00057
00059 const_iterator begin() const
00060 { return m_uniforms.begin(); }
00061
00063 iterator begin()
00064 { return m_uniforms.begin(); }
00065
00067 const_iterator end() const
00068 { return m_uniforms.end(); }
00069
00071 iterator end()
00072 { return m_uniforms.end(); }
00073
00075 bool empty() const
00076 { return m_uniforms.empty(); }
00077
00079 size_t size() const
00080 { return m_uniforms.size(); }
00081
00083 iterator find(const char* key)
00084 { return m_uniforms.find(key); }
00085
00087 const_iterator find(const char* key) const
00088 { return m_uniforms.find(key); }
00089
00091 void erase (iterator it)
00092 {
00093 free((void*)it->first);
00094 m_uniforms.erase(it);
00095 }
00096
00098 void clear()
00099 {
00100 iterator it = m_uniforms.begin();
00101 while(it!=m_uniforms.end())
00102 {
00103 free((void*)it->first);
00104 ++it;
00105 }
00106 m_uniforms.clear();
00107 }
00108
00110 T& operator[] ( const char* name )
00111 {
00112 iterator it = find(name);
00113 if ( it==end())
00114 {
00115 #ifdef _WIN32
00116 return m_uniforms[_strdup(name)];
00117 #else
00118 return m_uniforms[strdup(name)];
00119 #endif
00120 }
00121 else
00122 return ((*it).second);
00123 }
00124
00126 SbConstCharMap<T>& operator=(const SbConstCharMap<T>& copyFrom)
00127 {
00128
00129 clear();
00130
00131 iterator insertedIt = begin();
00132 const_iterator it = copyFrom.begin();
00133 while(it!=copyFrom.end())
00134 {
00135 #ifdef _WIN32
00136 insertedIt = m_uniforms.insert(insertedIt,value_type(_strdup((*it).first),(*it).second));
00137 #else
00138 insertedIt = m_uniforms.insert(insertedIt,value_type(strdup((*it).first),(*it).second));
00139 #endif
00140 ++it;
00141 }
00142 return *this;
00143 }
00144
00146 friend int operator !=(const SbConstCharMap<T>& map1, const SbConstCharMap<T>& map2)
00147 { return !(map1==map2); }
00148
00150 friend int operator ==(const SbConstCharMap<T>& map1, const SbConstCharMap<T>& map2)
00151 {
00152 if ( map1.size() != map2.size() )
00153 return false;
00154
00155 const const_iterator itEnd1 = map1.end();
00156 const_iterator it1 = map1.begin();
00157 const_iterator it2 = map2.begin();
00158 for (; it1 != itEnd1; ++it1, ++it2)
00159 {
00160 if ( it1->second != it2->second )
00161 return false;
00162
00163
00164
00165 else if ( strcmp(it1->first, it2->first) != 0 )
00166 return false;
00167 }
00168 return true;
00169 }
00170
00171 private:
00172
00173 UniformMap m_uniforms;
00174 };
00175
00176 #endif //_SB_CONST_CHAR_MAP_H_
00177 #endif // HIDDEN_FROM_DOC
00178