Hash.c++ 1.41 KB
/*****************************************************************************
 *  File:  Hash.c++ 
 *
 *  HashTable Manager
 *
 ****************************************************************************/
#include <stdio.h>
#include <stdlib.h>

#include "Hash.h"

HashTable::HashTable(int numItems)
{
    int     c;

    numItems *= 2;
    hashSize = HASH_MIN_SIZE;
    
    while (numItems > hashSize)
        hashSize = hashSize << 1;

    hashMask = hashSize - 1;
    
    hashT = (hashPair*)malloc(sizeof(hashPair)*hashSize);
    
    for(c = 0; c < hashSize; c++)   /* initialize to -1 */
        hashT[c].bankOffset = HASH_SLOT_EMPTY;
}

HashTable::~HashTable()
{
    if(hashT)
        free(hashT);
}

int HashTable::AddPair(u32 bankOffset, AEAsset *assetAddr)
{
    int   h;

    h = bankOffset;

    while(1)
    {
        h &= hashMask;
        if(hashT[h].bankOffset == HASH_SLOT_EMPTY)
        {
            hashT[h].bankOffset = bankOffset;
            hashT[h].assetAddr = assetAddr;
            return(h);
        }
        h++;
    }
}

AEAsset* HashTable::MatchPair(u32 bankOffset)
{
    int h;

    h = bankOffset;

    while(1)
    {
        h &= hashMask;
        if(hashT[h].bankOffset == bankOffset)
            return(hashT[h].assetAddr);
        else if(hashT[h].bankOffset == HASH_SLOT_EMPTY)
        {
            fprintf(stderr, "Hash Table lookup error\n");
            return 0;
        }
        h++;
    }
}