added function to check if hash table value exists for a given key
authorHolger Schemel <info@artsoft.org>
Thu, 22 Feb 2024 21:51:45 +0000 (22:51 +0100)
committerHolger Schemel <info@artsoft.org>
Thu, 22 Feb 2024 21:54:50 +0000 (22:54 +0100)
This function is required if integer values are used directly as hash values,
because a value of "0" would be indistinguishable from a non-existent entry,
which is returned as "NULL".

src/libgame/hash.c
src/libgame/hash.h

index 101ec1214a30aae2faddd478c24f53321d401832..89c7134f5906aa06d8a6cb24813eebf84f2d42af 100644 (file)
@@ -268,6 +268,29 @@ hashtable_change(struct hashtable *h, void *k, void *v)
   return 0;
 }
 
+/*****************************************************************************/
+int /* checks if key exists */
+hashtable_exists(struct hashtable *h, void *k)
+{
+  struct entry *e;
+  unsigned int hashvalue, index;
+
+  hashvalue = hash(h, k);
+  index = indexFor(h->tablelength, hashvalue);
+  e = h->table[index];
+
+  while (e != NULL)
+  {
+    /* Check hash value to short circuit heavier comparison */
+    if ((hashvalue == e->h) && (h->eqfn(k, e->k)))
+      return 1;
+
+    e = e->next;
+  }
+
+  return 0;
+}
+
 /*****************************************************************************/
 void * /* returns value associated with key */
 hashtable_search(struct hashtable *h, void *k)
index 8d0eff235c38348e4e7afbb5b9667aa33510e51d..8fe6f7fabbd4ab0c8861ba9f077c4a6f4c3d6064 100644 (file)
@@ -196,6 +196,24 @@ static int fnname (struct hashtable *h, keytype *k, valuetype *v) \
   return hashtable_change(h, k, v); \
 }
 
+/*****************************************************************************
+ * hashtable_exists
+   
+ * @name        hashtable_exists
+ * @param   h   the hashtable to search
+ * @param   k   the key to search for
+ * @return      non-zero if key exists, else zero
+ */
+
+int
+hashtable_exists(struct hashtable *h, void *k);
+
+#define DEFINE_HASHTABLE_EXISTS(fnname, keytype, valuetype) \
+static int fnname (struct hashtable *h, keytype *k) \
+{ \
+  return hashtable_exists(h, k); \
+}
+
 /*****************************************************************************
  * hashtable_search