X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=hashtable.h;h=c4cf290d928cc4a2d6bea060d702db9b8ba820a3;hb=20926923f6de1790fdd368d5e7fa1738abe7b9a6;hp=f372f9e7b96f0efb7f08d6574d768a6cc7cdf2db;hpb=857205edf46f2daefe0b6e471b902fcfd9c67df2;p=model-checker.git diff --git a/hashtable.h b/hashtable.h index f372f9e..c4cf290 100644 --- a/hashtable.h +++ b/hashtable.h @@ -1,3 +1,7 @@ +/** @file hashtable.h + * @brief Hashtable. Standard chained bucket variety. + */ + #ifndef HASHTABLE_H #define HASHTABLE_H @@ -19,7 +23,7 @@ template table = (struct hashlistnode<_Key,_Val> **) calloc(initialcapacity, sizeof(struct hashlistnode<_Key,_Val> *)); loadfactor = factor; capacity = initialcapacity; - threshold = initialcapacity*loadfactor; + threshold = (unsigned int) (initialcapacity*loadfactor); mask = (capacity << _Shift)-1; size = 0; // Initial number of elements in the hash } @@ -36,6 +40,7 @@ template free(table); } + /** Reset the table to its initial state. */ void reset() { for(int i=0;i * bin = table[i]; @@ -48,14 +53,15 @@ template memset(table, 0, capacity*sizeof(struct hashlistnode<_Key, _Val> *)); size=0; } - + + /** Put a key value pair into the table. */ void put(_Key key, _Val val) { if(size > threshold) { //Resize unsigned int newsize = capacity << 1; resize(newsize); } - + struct hashlistnode<_Key,_Val> *ptr = table[(((_KeyInt)key) & mask)>>_Shift]; size++; struct hashlistnode<_Key,_Val> *search = ptr; @@ -75,9 +81,10 @@ template table[(((_KeyInt)key)&mask)>>_Shift]=newptr; } + /** Lookup the corresponding value for the given key. */ _Val get(_Key key) { struct hashlistnode<_Key,_Val> *search = table[(((_KeyInt)key) & mask)>>_Shift]; - + while(search!=NULL) { if (search->key==key) { return search->val; @@ -87,9 +94,10 @@ template return (_Val)0; } + /** Check whether the table contains a value for the given key. */ bool contains(_Key key) { struct hashlistnode<_Key,_Val> *search = table[(((_KeyInt)key) & mask)>>_Shift]; - + while(search!=NULL) { if (search->key==key) { return true; @@ -98,29 +106,30 @@ template } return false; } - + + /** Resize the table. */ void resize(unsigned int newsize) { struct hashlistnode<_Key,_Val> ** oldtable = table; struct hashlistnode<_Key,_Val> ** newtable; unsigned int oldcapacity = capacity; - + if((newtable = (struct hashlistnode<_Key,_Val> **) calloc(newsize, sizeof(struct hashlistnode<_Key,_Val> *))) == NULL) { printf("Calloc error %s %d\n", __FILE__, __LINE__); exit(-1); } - + table = newtable; //Update the global hashtable upon resize() capacity = newsize; - threshold = newsize * loadfactor; + threshold = (unsigned int) (newsize * loadfactor); mask = (newsize << _Shift)-1; - + for(unsigned int i = 0; i < oldcapacity; i++) { struct hashlistnode<_Key, _Val> * bin = oldtable[i]; - + while(bin!=NULL) { _Key key=bin->key; struct hashlistnode<_Key, _Val> * next=bin->next; - + unsigned int index = (((_KeyInt)key) & mask) >>_Shift; struct hashlistnode<_Key, _Val> * tmp=newtable[index]; bin->next=tmp; @@ -128,10 +137,10 @@ template bin = next; } } - + free(oldtable); //Free the memory of the old hash table } - + private: struct hashlistnode<_Key,_Val> **table; unsigned int capacity;