+#ifndef tupleitem_H
+#define tupleitem_H
+
+#include <itemkeyfun.h>
+
+/**
+ * A tupleschema record declares the itemkeyfun functions for tuple
+ * items together with applicable arity and domain combinations. The
+ * macro \ref TUPLEITEMINIT may be used to initialize particular
+ * tupleschema records, which each become tupleitem declaration for
+ * its particular arity and parts declarations
+ */
+typedef struct {
+ /**
+ * These are the itemkeyfun callback functions to support
+ * hashvector use for tuple items. The functions expects their
+ * itemkeyfun pointer to be within a tupleschema record so as to
+ * provide the handling of the tuple columns.
+ */
+ itemkeyfun functions;
+ /**
+ * This is the number of columns in a tuple.
+ */
+ int arity;
+ /**
+ * This is an array of pointers to the tuple item domains as
+ * represented by their associated itemkeyfun records.
+ */
+ itemkeyfun **schema;
+} tupleschema;
+
+/**
+ * This callback function returns the hashcode of a key.
+ *
+ * \param this is a pointer to the itemkeyfun record from where this
+ * callback got invoked
+ *
+ * \param key is the key to produce a hascode for
+ *
+ * \returns the hashcode which is a vector_index (i.e. unsigned long)
+ *
+ * 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.
+ */
+extern unsigned long tupleitem_hashcode(itemkeyfun *this,void *key);
+
+/**
+ * This callback function determines whether an item has a
+ * given key or not.
+ */
+extern int tupleitem_haskey(itemkeyfun *this,void *item,void *key);
+
+/**
+ * This callback function returns the key of an item by considering
+ * the arity and schema.
+ */
+extern void *tupleitem_itemkey(itemkeyfun *this,void *item);
+
+/**
+ * This callback function handles a key obtained from the itemkey
+ * callback function to reclaim temporary allocation.
+ */
+extern void tupleitem_releasekey(itemkeyfun *this,void *key);
+
+/**
+ * The TUPLEITEMINIT macro is used for initializing a tupleschema
+ * record appropriately for a given arity and corresponding sequence
+ * of parts itemkeyfun pointers.
+ */
+#define TUPLEITEMINIT(arity, ... ) { \
+ functions = { \
+ .hashcode = tupleitem_hashcode, \
+ .haskey = tupleitem_haskey, \
+ .itemkey = tupleitem_itemkey, \
+ .releasekey = tupleitem_releasekey \
+ }, \
+ .arity = arity, \
+ .schema = { __VA_ARGS__ } \
+ }
+
+#endif