33class UMap :
public Class
42 hashnode_s(
const char *k, Type v, hashnode_s *n ) : key( k ), value( v ), next( n ) {};
43 hashnode_s(
const str &k, Type v, hashnode_s *n ) : key( k.c_str() ), value( v ), next( n ) {};
50 unsigned m_numentries;
51 unsigned m_tablesizemask;
53 unsigned getHash(
const char *key );
57 unsigned getNumEntries(
void )
const;
58 void DeleteDefaultValues (
void );
60 Type& operator[](
const char *key );
61 Type& operator[](
const str &key );
63 const char *getKeyByIndex (
int index )
const;
64 Type& getValueByIndex (
unsigned index );
68 UMap( Type defaultvalue,
unsigned tablesize = 64 ) : m_defaultvalue( defaultvalue ), m_tablesize( tablesize )
73 assert( m_tablesize > 0 );
75 m_heads =
new hashnode_s *[ m_tablesize ];
76 memset( m_heads, 0,
sizeof( *m_heads ) * m_tablesize );
82 for( i = 0; i < 32; i++ )
84 if ( m_tablesize & ( 1 << i ) )
92 m_tablesizemask = m_tablesize - 1;
96 UMap( UMap<Type> &map ) : m_defaultvalue( map.m_defaultvalue ), m_tablesize( map.m_tablesize )
102 assert( m_tablesize > 0 );
104 m_heads =
new hashnode_s *[ m_tablesize ];
105 m_numentries = map.m_numentries;
106 m_tablesizemask = map.m_tablesizemask;
108 for( i = 0; i < m_tablesize; i++ )
110 if ( !map.m_heads[ i ] )
116 prev = &m_heads[ i ];
117 for( node = map.m_heads[ i ]; node != NULL; node = node->next )
119 *prev =
new hashnode_s( node->key, node->value, NULL );
120 prev = &( *prev )->next;
126template<
class Type >
127UMap<Type>::~UMap<Type>()
133template<
class Type >
134unsigned UMap<Type>::getHash
143 if ( m_tablesizemask )
146 for( v = key; *v !=
'\0'; v++ )
148 h = ( 64 * h + unsigned( *v ) ) & m_tablesizemask;
154 for( v = key; *v !=
'\0'; v++ )
156 h = ( 64 * h + unsigned( *v ) ) % m_tablesize;
163template<
class Type >
177 hash = getHash( key );
178 head = &m_heads[ hash ];
181 for( node = *head; node != NULL; node = node->next )
183 if ( node->key == key )
192 *head =
new hashnode_s( key, m_defaultvalue, *head );
194 return ( *head )->value;
197template<
class Type >
198const char * UMap<Type>::getKeyByIndex
206 for ( head = 0; head < m_tablesize; head++ )
210 for ( node = m_heads[head]; node; node = node->next )
213 return node->key.c_str ();
223Type &UMap<Type>::getValueByIndex
231 ASSERT ( index < getNumEntries () );
233 for ( head = 0; head < m_tablesize; head++ )
237 for ( node = m_heads[head]; node; node = node->next )
248 return m_defaultvalue;
252inline void UMap<Type>::DeleteDefaultValues
260 for ( head = 0; head < m_tablesize; head++ )
264 while ( m_heads[head] && m_heads[head]->value == m_defaultvalue )
266 node = m_heads[head];
267 m_heads[head] = node->next;
272 if ( !m_heads[head] )
275 for ( node = m_heads[head]; node->next; )
277 hashnode_s *next = node->next;
279 if ( next->value == m_defaultvalue )
281 node->next = next->next;
291template<
class Type >
298 return this->[ key.c_str() ];
301template<
class Type >
302void UMap<Type>::Clear
312 for( i = 0; i < m_tablesize; i++ )
315 while( next != NULL )
328template<
class Type >
329inline unsigned UMap<Type>::getNumEntries