separate hash function
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 30 Jun 2022 11:52:19 +0000 (21:52 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 30 Jun 2022 11:52:19 +0000 (21:52 +1000)
vector/itemkeyfun.h [new file with mode: 0644]

diff --git a/vector/itemkeyfun.h b/vector/itemkeyfun.h
new file mode 100644 (file)
index 0000000..ee71ca5
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef itemkeyfun_H
+#define itemkeyfun_H
+
+/**
+ * \struct itemkeyfun
+ *
+ * itemkeyfun provides a meta-level representation for abstracting
+ * items as pairs of keys and payload, and having a hashcode mapping
+ * for keys. The key part is used for identifying items under the idea
+ * that all items that have the same key are the same; distinct
+ * representations of the same abstract entity. The hashcode scrambles
+ * the key part in a consistent way into an ideal table index for the
+ * items that have that key. Different keys may yield the same
+ * hashcode.
+ */
+typedef struct _itemkeyfun {
+
+#define SELF struct _itemkeyfun *this
+    /**
+     * This callback function should return the hashcode of a key. The
+     * hashcode is used for indexing into the backing vector for
+     * finding the an item via its key. The same key must map
+     * consistently to the same hashcode while the hashtable contains
+     * an item with that key. Different keys map map to the same
+     * hashcode, in which case the vector placement is made at the
+     * first empty or hole slot following the hashcode index.
+     */
+    unsigned long (*hashcode)(SELF,void *key);
+
+    /**
+     * This callback function should determine whether an item has a
+     * given key or not.
+     */
+    int (*haskey)(SELF,void *item,void *key);
+
+    /**
+     * This callback function should return a (possibly temporary) key
+     * of an item. It can be anything (i.e., with or without internal
+     * structure) as it is treated as an identifier that other
+     * callbacks recognize. It is merely understood as a value in an
+     * identity domain.
+     */
+    void *(*itemkey)(SELF,void *item);
+
+    /**
+     * This callback function should handle a key obtained from the
+     * itemkey callback function, e.g., reclaim temporary allocation.
+     */
+    void (*releasekey)(SELF,void *key);
+
+#undef SELF
+} itemkeyfun;
+
+#endif