diff options
author | wtc%netscape.com <devnull@localhost> | 2000-05-12 01:20:06 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 2000-05-12 01:20:06 +0000 |
commit | efa0e9cdfb5c2416f90277dcc09e8ad31c8d59a9 (patch) | |
tree | d909fe2f4411f18b24b1e1a7a778abee3d7f9151 | |
parent | 791cd0ea3d6f713d930a577c4f1db98351cd9c46 (diff) | |
download | nspr-hg-efa0e9cdfb5c2416f90277dcc09e8ad31c8d59a9.tar.gz |
Bugzilla bug #32184: added 'const' versions of hash table lookup
functions that don't reorder the hash entries.
Modified files: plhash.h, plhash.c
(NSPRPUB_CLIENT_BRANCH)
-rw-r--r-- | lib/ds/plhash.c | 45 | ||||
-rw-r--r-- | lib/ds/plhash.h | 7 |
2 files changed, 52 insertions, 0 deletions
diff --git a/lib/ds/plhash.c b/lib/ds/plhash.c index 30b46fdc..1adaac35 100644 --- a/lib/ds/plhash.c +++ b/lib/ds/plhash.c @@ -195,6 +195,34 @@ PL_HashTableRawLookup(PLHashTable *ht, PLHashNumber keyHash, const void *key) return hep; } +/* +** Same as PL_HashTableRawLookup but doesn't reorder the hash entries. +*/ +PR_IMPLEMENT(PLHashEntry *const *) +PL_HashTableRawLookupConst(const PLHashTable *ht, PLHashNumber keyHash, + const void *key) +{ + PLHashEntry *he, *const *hep; + PLHashNumber h; + +#ifdef HASHMETER + ht->nlookups++; +#endif + h = keyHash * GOLDEN_RATIO; + h >>= ht->shift; + hep = &ht->buckets[h]; + while ((he = *hep) != 0) { + if (he->keyHash == keyHash && (*ht->keyCompare)(key, he->key)) { + break; + } + hep = &he->next; +#ifdef HASHMETER + ht->nsteps++; +#endif + } + return hep; +} + PR_IMPLEMENT(PLHashEntry *) PL_HashTableRawAdd(PLHashTable *ht, PLHashEntry **hep, PLHashNumber keyHash, const void *key, void *value) @@ -349,6 +377,23 @@ PL_HashTableLookup(PLHashTable *ht, const void *key) } /* +** Same as PL_HashTableLookup but doesn't reorder the hash entries. +*/ +PR_IMPLEMENT(void *) +PL_HashTableLookupConst(const PLHashTable *ht, const void *key) +{ + PLHashNumber keyHash; + PLHashEntry *he, *const *hep; + + keyHash = (*ht->keyHash)(key); + hep = PL_HashTableRawLookupConst(ht, keyHash, key); + if ((he = *hep) != 0) { + return he->value; + } + return 0; +} + +/* ** Iterate over the entries in the hash table calling func for each ** entry found. Stop if "f" says to (return value & PR_ENUMERATE_STOP). ** Return a count of the number of elements scanned. diff --git a/lib/ds/plhash.h b/lib/ds/plhash.h index 3110d8ab..438dbd6a 100644 --- a/lib/ds/plhash.h +++ b/lib/ds/plhash.h @@ -104,6 +104,9 @@ PL_HashTableRemove(PLHashTable *ht, const void *key); PR_EXTERN(void *) PL_HashTableLookup(PLHashTable *ht, const void *key); +PR_EXTERN(void *) +PL_HashTableLookupConst(const PLHashTable *ht, const void *key); + PR_EXTERN(PRIntn) PL_HashTableEnumerateEntries(PLHashTable *ht, PLHashEnumerator f, void *arg); @@ -123,6 +126,10 @@ PL_CompareValues(const void *v1, const void *v2); PR_EXTERN(PLHashEntry **) PL_HashTableRawLookup(PLHashTable *ht, PLHashNumber keyHash, const void *key); +PR_EXTERN(PLHashEntry *const *) +PL_HashTableRawLookupConst(const PLHashTable *ht, PLHashNumber keyHash, + const void *key); + PR_EXTERN(PLHashEntry *) PL_HashTableRawAdd(PLHashTable *ht, PLHashEntry **hep, PLHashNumber keyHash, const void *key, void *value); |