1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-25 17:29:50 +00:00

More tweaking of the new hashtab module

git-svn-id: svn://svn.cc65.org/cc65/trunk@2560 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-10-22 19:13:02 +00:00
parent 5e07b14e8d
commit ff2dca420b
2 changed files with 10 additions and 7 deletions

View File

@ -96,7 +96,7 @@ HashNode* HT_Find (const HashTable* T, const void* Key)
* if it is not really necessary. * if it is not really necessary.
*/ */
if (N->Hash == Hash && if (N->Hash == Hash &&
T->Func->Compare (Key, T->Func->GetIndex (N->Entry))) { T->Func->Compare (Key, T->Func->GetKey (N->Entry))) {
/* Found */ /* Found */
break; break;
} }
@ -133,8 +133,8 @@ void HT_Insert (HashTable* T, HashNode* N)
HT_Alloc (T); HT_Alloc (T);
} }
/* Generate the hash for the node contents */ /* Generate the hash over the node key. */
N->Hash = T->Func->GenHash (T->Func->GetIndex (N->Entry)); N->Hash = T->Func->GenHash (T->Func->GetKey (N->Entry));
/* Calculate the reduced hash */ /* Calculate the reduced hash */
RHash = N->Hash % T->Slots; RHash = N->Hash % T->Slots;
@ -143,6 +143,9 @@ void HT_Insert (HashTable* T, HashNode* N)
N->Next = T->Table[RHash]; N->Next = T->Table[RHash];
T->Table[RHash] = N; T->Table[RHash] = N;
/* Set the owner */
N->Owner = T;
/* One more entry */ /* One more entry */
++T->Count; ++T->Count;
} }

View File

@ -59,7 +59,7 @@ struct HashNode {
void* Entry; /* Pointer to user entry data */ void* Entry; /* Pointer to user entry data */
}; };
#define STATIC_HASHNODE_INITIALIZER(Entry) { 0, 0, 0, Entry } #define STATIC_HASHNODE_INITIALIZER(Entry) { 0, 0, 0, Entry }
/* Hash table functions */ /* Hash table functions */
typedef struct HashFunctions HashFunctions; typedef struct HashFunctions HashFunctions;
@ -68,8 +68,8 @@ struct HashFunctions {
unsigned (*GenHash) (const void* Key); unsigned (*GenHash) (const void* Key);
/* Generate the hash over a key. */ /* Generate the hash over a key. */
const void* (*GetIndex) (void* Entry); const void* (*GetKey) (void* Entry);
/* Given a pointer to the user entry data, return a pointer to the index */ /* Given a pointer to the user entry data, return a pointer to the key */
HashNode* (*GetHashNode) (void* Entry); HashNode* (*GetHashNode) (void* Entry);
/* Given a pointer to the user entry data, return a pointer to the hash node */ /* Given a pointer to the user entry data, return a pointer to the hash node */
@ -99,7 +99,7 @@ struct HashTable {
#if defined(HAVE_INLINE) #if defined(HAVE_INLINE)
INLINE void InitHashNode (HashNode* N, void* Entry) INLINE void InitHashNode (HashNode* N, void* Entry)
/* Initialize a hash node */ /* Initialize a hash node. */
{ {
N->Next = 0; N->Next = 0;
N->Owner = 0; N->Owner = 0;