--- /dev/null
+#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