X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=hashtable.h;h=81772a8f039addae09c726c0f7bf3e37ab626ef1;hp=c9da5aad4341883bba7225f3bc97f1f2bd04fc9f;hb=829aac4055269992c26fed5530cfdaf59775b2a9;hpb=91579dadd25579b9aa7e1dd7a537892c9b1e9311 diff --git a/hashtable.h b/hashtable.h index c9da5aad..81772a8f 100644 --- a/hashtable.h +++ b/hashtable.h @@ -182,24 +182,38 @@ public: resize(capacity << 1); struct hashlistnode<_Key, _Val> *search; + struct hashlistnode<_Key, _Val> *first = NULL; - unsigned int index = hash_function(key); + unsigned int index = hash_function(key) & capacitymask; + unsigned int oindex = index; do { - index &= capacitymask; search = &table[index]; if (!search->key) { //key is null, probably done - break; + if (!search->val) + break; + if (first == NULL) + first = search; } if (equals(search->key, key)) { search->val = val; return; } - index++; + index = (index + 1) & capacitymask; + if (index == oindex) { + if (first == NULL) + exit(-1); + break; + } } while (true); - search->key = key; - search->val = val; + if (first != NULL) { + first->key = key; + first->val = val; + } else { + search->key = key; + search->val = val; + } size++; } @@ -220,7 +234,7 @@ public: } unsigned int oindex = hash_function(key) & capacitymask; - unsigned int index=oindex; + unsigned int index = oindex; do { search = &table[index]; if (!search->key) { @@ -284,6 +298,9 @@ public: return size; } + bool isEmpty() { + return size == 0; + } /** * @brief Check whether the table contains a value for the given key