summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>2000-05-12 01:20:06 +0000
committerwtc%netscape.com <devnull@localhost>2000-05-12 01:20:06 +0000
commitefa0e9cdfb5c2416f90277dcc09e8ad31c8d59a9 (patch)
treed909fe2f4411f18b24b1e1a7a778abee3d7f9151
parent791cd0ea3d6f713d930a577c4f1db98351cd9c46 (diff)
downloadnspr-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.c45
-rw-r--r--lib/ds/plhash.h7
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);