/* ============================================================================= * hashtable_remove * -- Returns TRUE if successful, else FALSE * ============================================================================= */ bool_t hashtable_remove (hashtable_t* hashtablePtr, void* keyPtr) { long numBucket = hashtablePtr->numBucket; long i = hashtablePtr->hash(keyPtr) % numBucket; list_t* chainPtr = hashtablePtr->buckets[i]; pair_t* pairPtr; pair_t removePair; removePair.firstPtr = keyPtr; pairPtr = (pair_t*)list_find(chainPtr, &removePair); if (pairPtr == NULL) { return FALSE; } bool_t status = list_remove(chainPtr, &removePair); assert(status); pair_free(pairPtr); #ifdef HASHTABLE_SIZE_FIELD hashtablePtr->size--; assert(hashtablePtr->size >= 0); #endif return TRUE; }
/* ============================================================================= * hashtable_insert * ============================================================================= */ bool_t hashtable_insert (hashtable_t* hashtablePtr, void* keyPtr, void* dataPtr) { long numBucket = hashtablePtr->numBucket; long i = hashtablePtr->hash(keyPtr) % numBucket; #if defined(HASHTABLE_SIZE_FIELD) || defined(HASHTABLE_RESIZABLE) long newSize; #endif pair_t findPair; findPair.firstPtr = keyPtr; pair_t* pairPtr = (pair_t*)list_find(hashtablePtr->buckets[i], &findPair); if (pairPtr != NULL) { return FALSE; } pair_t* insertPtr = pair_alloc(keyPtr, dataPtr); if (insertPtr == NULL) { return FALSE; } #ifdef HASHTABLE_SIZE_FIELD newSize = hashtablePtr->size + 1; assert(newSize > 0); #elif defined(HASHTABLE_RESIZABLE) newSize = hashtable_getSize(hashtablePtr) + 1; assert(newSize > 0); #endif #ifdef HASHTABLE_RESIZABLE /* Increase number of buckets to maintain size ratio */ if (newSize >= (numBucket * hashtablePtr->resizeRatio)) { list_t** newBuckets = rehash(hashtablePtr); if (newBuckets == NULL) { return FALSE; } freeBuckets(hashtablePtr->buckets, numBucket); numBucket *= hashtablePtr->growthFactor; hashtablePtr->buckets = newBuckets; hashtablePtr->numBucket = numBucket; i = hashtablePtr->hash(keyPtr) % numBucket; } #endif /* Add new entry */ if (list_insert(hashtablePtr->buckets[i], insertPtr) == FALSE) { pair_free(insertPtr); return FALSE; } #ifdef HASHTABLE_SIZE_FIELD hashtablePtr->size = newSize; #endif return TRUE; }
void pair_list_free (struct pair_lst *plst) { while (plst) { struct pair_lst *next = plst->next; pair_free (plst->field); free (plst); plst = next; } }