summaryrefslogtreecommitdiffstats
path: root/include/inn/hashtab.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/inn/hashtab.h')
-rw-r--r--include/inn/hashtab.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/include/inn/hashtab.h b/include/inn/hashtab.h
new file mode 100644
index 0000000..8d9f31e
--- /dev/null
+++ b/include/inn/hashtab.h
@@ -0,0 +1,60 @@
+/* $Id: hashtab.h 5944 2002-12-08 02:33:08Z rra $
+**
+** Generic hash table interface.
+**
+** Written by Russ Allbery <rra@stanford.edu>
+** This work is hereby placed in the public domain by its author.
+**
+** A hash table takes a hash function that acts on keys, a function to
+** extract the key from a data item stored in a hash, a function that takes
+** a key and a data item and returns true if the key matches, and a
+** function to be called on any data item being deleted from the hash.
+**
+** hash_create creates a hash and hash_free frees all the space allocated
+** by one. hash_insert, hash_replace, and hash_delete modify it, and
+** hash_lookup extracts values. hash_traverse can be used to walk the
+** hash, and hash_count returns the number of elements currently stored in
+** the hash. hash_searches, hash_collisions, and hash_expansions extract
+** performance and debugging statistics.
+*/
+
+#ifndef INN_HASHTAB_H
+#define INN_HASHTAB_H 1
+
+#include <inn/defines.h>
+
+BEGIN_DECLS
+
+/* The layout of this struct is entirely internal to the implementation. */
+struct hash;
+
+/* Data types for function pointers used by the hash table interface. */
+typedef unsigned long (*hash_func)(const void *);
+typedef const void * (*hash_key_func)(const void *);
+typedef bool (*hash_equal_func)(const void *, const void *);
+typedef void (*hash_delete_func)(void *);
+typedef void (*hash_traverse_func)(void *, void *);
+
+/* Generic hash table interface. */
+struct hash * hash_create(size_t, hash_func, hash_key_func,
+ hash_equal_func, hash_delete_func);
+void hash_free(struct hash *);
+void * hash_lookup(struct hash *, const void *key);
+bool hash_insert(struct hash *, const void *key, void *datum);
+bool hash_replace(struct hash *, const void *key, void *datum);
+bool hash_delete(struct hash *, const void *key);
+void hash_traverse(struct hash *, hash_traverse_func, void *);
+unsigned long hash_count(struct hash *);
+unsigned long hash_searches(struct hash *);
+unsigned long hash_collisions(struct hash *);
+unsigned long hash_expansions(struct hash *);
+
+/* Hash functions available for callers. */
+unsigned long hash_string(const void *);
+
+/* Functions useful for constructing new hashes. */
+unsigned long hash_lookup2(const char *, size_t, unsigned long partial);
+
+END_DECLS
+
+#endif /* INN_HASHTAB_H */