Listing 3 hashhmap.cxx implementation of the VPmap class
/*----------------------------------------* * . */ #include <stdlib.h> #include "hashmap.h" /*----------------------------------------* * convenient macros */ #define ELEMENTS(array) \ (sizeof(array) / sizeof(array[0])) #define EACHELEM(x, array, size) \ x = &(array)[size]; \ x-- > (array); VPmap::VPmap (size_t buckets, KeyHashProc key_hash, KeyCompareEqProc key_cmp, KeyValCreateProc K_V_C, KeyValDestroyProc K_V_D) { hash = key_hash; isEqual = key_cmp; CreateKeyAndValue = K_V_C; DestroyKeyAndValue = K_V_D; hashsize = buckets; VPAssoc **ptr; keys = new VPAssoc *[hashsize]; for (EACHELEM(ptr, keys, hashsize)) *ptr = NULL; } VPmap::~VPmap() { VPAssoc **list; for (EACHELEM(list, keys, hashsize)) while (*list) { VPAssoc *item = *list; *list = item->next; DestroyKeyAndValue(item->key, item->value); delete item; } delete[] keys; } void VPmap::apply(VPiterProc proc, void *data) { VPAssoc **list, *item; for (EACHELEM(list, keys, hashsize)) for (item = *list; item != NULL; item = item->next) (*proc)(item->key, item->value, data); } void *VPmap::index(const void *theKey) { VPAssoc *item, **list = &keys[hash(theKey) % hashsize]; if (isEqual(theKey, item->key)) return item->value; // Key was not found, // creat a new association for this key VPAssoc *n = new VPAssoc; CreateKeyAndValue(this, theKey, n->key, n->value); n->next = *list; *list = n; return n->value; } /* End of File */