hashtable: bugfix - increment size only when new bins are linked
authorBrian Norris <banorris@uci.edu>
Sat, 11 Aug 2012 00:44:36 +0000 (17:44 -0700)
committerBrian Norris <banorris@uci.edu>
Sat, 11 Aug 2012 00:49:01 +0000 (17:49 -0700)
In both put() and ensureptr(), the 'size' counter should not be incremented
until we decide if we're adding a new bin or not. When incremented improperly,
'size' ended up out of sync with the hash table; it reported a size much larger
than the actual table.

hashtable.h

index 84baaba..2b703c5 100644 (file)
@@ -134,7 +134,6 @@ template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (*
                        resize(capacity << 1);
 
                struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *ptr = table[(((_KeyInt)key) & mask)>>_Shift];
-               size++;
                struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = ptr;
 
                while(search!=NULL) {
@@ -150,6 +149,7 @@ template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (*
                newptr->val=val;
                newptr->next=ptr;
                table[(((_KeyInt)key)&mask)>>_Shift]=newptr;
+               size++;
        }
 
        /** Put a key entry into the table. */
@@ -158,7 +158,6 @@ template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (*
                        resize(capacity << 1);
 
                struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *ptr = table[(((_KeyInt)key) & mask)>>_Shift];
-               size++;
                struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = ptr;
 
                while(search!=NULL) {
@@ -172,6 +171,7 @@ template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (*
                newptr->key=key;
                newptr->next=ptr;
                table[(((_KeyInt)key)&mask)>>_Shift]=newptr;
+               size++;
                return &newptr->val;
        }