From 8b6e648f00b31633f9d72850df82ecdb4dc2699e Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Fri, 20 Jul 2012 14:01:03 -0700 Subject: [PATCH] hashtable: make more flexible [Split by Brian Norris] --- hashtable.h | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/hashtable.h b/hashtable.h index c4cf290..e59a995 100644 --- a/hashtable.h +++ b/hashtable.h @@ -15,12 +15,15 @@ template struct hashlistnode<_Key,_Val> *next; }; -template +/** Hashtable class. By default it is snapshotting, but you can pass + in your own allocation functions. */ + +template class HashTable { public: HashTable(unsigned int initialcapacity=1024, double factor=0.5) { // Allocate space for the hash table - table = (struct hashlistnode<_Key,_Val> **) calloc(initialcapacity, sizeof(struct hashlistnode<_Key,_Val> *)); + table = (struct hashlistnode<_Key,_Val> **) _calloc(initialcapacity, sizeof(struct hashlistnode<_Key,_Val> *)); loadfactor = factor; capacity = initialcapacity; threshold = (unsigned int) (initialcapacity*loadfactor); @@ -33,11 +36,27 @@ template struct hashlistnode<_Key,_Val> * bin = table[i]; while(bin!=NULL) { struct hashlistnode<_Key,_Val> * next=bin->next; - free(bin); + _free(bin); bin=next; } } - free(table); + _free(table); + } + + void * operator new(size_t size) { + return _malloc(size); + } + + void operator delete(void *p, size_t size) { + _free(p); + } + + void * operator new[](size_t size) { + return _malloc(size); + } + + void operator delete[](void *p, size_t size) {\ + _free(p); } /** Reset the table to its initial state. */ @@ -46,7 +65,7 @@ template struct hashlistnode<_Key,_Val> * bin = table[i]; while(bin!=NULL) { struct hashlistnode<_Key,_Val> * next=bin->next; - free(bin); + _free(bin); bin=next; } } @@ -74,7 +93,7 @@ template search=search->next; } - struct hashlistnode<_Key,_Val> *newptr=(struct hashlistnode<_Key,_Val> *)malloc(sizeof(struct hashlistnode<_Key,_Val>)); + struct hashlistnode<_Key,_Val> *newptr=(struct hashlistnode<_Key,_Val> *)_malloc(sizeof(struct hashlistnode<_Key,_Val>)); newptr->key=key; newptr->val=val; newptr->next=ptr; @@ -113,7 +132,7 @@ template struct hashlistnode<_Key,_Val> ** newtable; unsigned int oldcapacity = capacity; - if((newtable = (struct hashlistnode<_Key,_Val> **) calloc(newsize, sizeof(struct hashlistnode<_Key,_Val> *))) == NULL) { + if((newtable = (struct hashlistnode<_Key,_Val> **) _calloc(newsize, sizeof(struct hashlistnode<_Key,_Val> *))) == NULL) { printf("Calloc error %s %d\n", __FILE__, __LINE__); exit(-1); } @@ -138,7 +157,7 @@ template } } - free(oldtable); //Free the memory of the old hash table + _free(oldtable); //Free the memory of the old hash table } private: -- 2.34.1