Hash.c++
1.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*****************************************************************************
* 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++;
}
}