Exemple #1
0
/* =============================================================================
 * 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;
}
Exemple #2
0
/* =============================================================================
 * 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;
}
Exemple #3
0
void
pair_list_free (struct pair_lst *plst)
{
  while (plst)
    {
      struct pair_lst *next = plst->next;
      pair_free (plst->field);
      free (plst);
      plst = next;
    }
}