33class UMap :
public Class
41 hashnode_s(
const char *k, Type v, hashnode_s *n)
45 hashnode_s(
const str& k, Type v, hashnode_s *n)
55 unsigned m_numentries;
56 unsigned m_tablesizemask;
58 unsigned getHash(
const char *key);
62 unsigned getNumEntries(
void)
const;
63 void DeleteDefaultValues(
void);
65 Type& operator[](
const char *key);
66 Type& operator[](
const str& key);
68 const char *getKeyByIndex(
int index)
const;
69 Type& getValueByIndex(
unsigned index);
73 UMap(Type defaultvalue,
unsigned tablesize = 64)
74 : m_defaultvalue(defaultvalue)
75 , m_tablesize(tablesize)
80 assert(m_tablesize > 0);
82 m_heads =
new hashnode_s *[m_tablesize];
83 memset(m_heads, 0,
sizeof(*m_heads) * m_tablesize);
89 for (i = 0; i < 32; i++) {
90 if (m_tablesize & (1 << i)) {
96 m_tablesizemask = m_tablesize - 1;
100 UMap(UMap<Type>& map)
101 : m_defaultvalue(map.m_defaultvalue)
102 , m_tablesize(map.m_tablesize)
108 assert(m_tablesize > 0);
110 m_heads =
new hashnode_s *[m_tablesize];
111 m_numentries = map.m_numentries;
112 m_tablesizemask = map.m_tablesizemask;
114 for (i = 0; i < m_tablesize; i++) {
115 if (!map.m_heads[i]) {
121 for (node = map.m_heads[i]; node != NULL; node = node->next) {
122 *prev =
new hashnode_s(node->key, node->value, NULL);
123 prev = &(*prev)->next;
130UMap<Type>::~UMap<Type>()
137unsigned UMap<Type>::getHash(
const char *key)
142 if (m_tablesizemask) {
144 for (v = key; *v !=
'\0'; v++) {
145 h = (64 * h + unsigned(*v)) & m_tablesizemask;
149 for (v = key; *v !=
'\0'; v++) {
150 h = (64 * h + unsigned(*v)) % m_tablesize;
158Type& UMap<Type>::operator[](
const char *key)
168 head = &m_heads[hash];
170 for (node = *head; node != NULL; node = node->next) {
171 if (node->key == key) {
179 *head =
new hashnode_s(key, m_defaultvalue, *head);
181 return (*head)->value;
185const char *UMap<Type>::getKeyByIndex(
int index)
const
189 for (head = 0; head < m_tablesize; head++) {
192 for (node = m_heads[head]; node; node = node->next) {
194 return node->key.c_str();
205Type& UMap<Type>::getValueByIndex(
unsigned index)
209 ASSERT(index < getNumEntries());
211 for (head = 0; head < m_tablesize; head++) {
214 for (node = m_heads[head]; node; node = node->next) {
225 return m_defaultvalue;
229inline void UMap<Type>::DeleteDefaultValues(
void)
233 for (head = 0; head < m_tablesize; head++) {
236 while (m_heads[head] && m_heads[head]->value == m_defaultvalue) {
237 node = m_heads[head];
238 m_heads[head] = node->next;
243 if (!m_heads[head]) {
247 for (node = m_heads[head]; node->next;) {
248 hashnode_s *next = node->next;
250 if (next->value == m_defaultvalue) {
251 node->next = next->next;
262inline Type& UMap<Type>::operator[](
const str& key)
264 return this->[key.c_str()];
268void UMap<Type>::Clear(
void)
274 for (i = 0; i < m_tablesize; i++) {
276 while (next != NULL) {
289inline unsigned UMap<Type>::getNumEntries(
void)
const