summaryrefslogtreecommitdiff
path: root/common/hash.h
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2004-04-21 17:37:06 +0000
committerStef Walter <stef@memberwebs.com>2004-04-21 17:37:06 +0000
commitff76efc3e5e1b0e4ca3b10b7402406f619509bba (patch)
treec3b1e49235f67eabd22d31ebfc14934743b70858 /common/hash.h
parent01430fca169c1b8d7b1b4f1bdd529aa6bc4be80b (diff)
Initial Import
Diffstat (limited to 'common/hash.h')
-rw-r--r--common/hash.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/common/hash.h b/common/hash.h
new file mode 100644
index 0000000..9e8174c
--- /dev/null
+++ b/common/hash.h
@@ -0,0 +1,171 @@
+/*
+ * Originally from apache 2.0
+ * Modifications for general use by <nielsen@memberwebs.com>
+ */
+
+/* Copyright 2000-2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __HASH_H__
+#define __HASH_H__
+
+/*
+ * Options to define. You need to build both this file and
+ * the corresponding hash.c file with whatever options you set here
+ */
+
+/* Keep timestamps for the entries */
+#define HASH_TIMESTAMP 1
+
+/* Keep key values internally */
+#define HASH_COPYKEYS 1
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * When passing a key to hash_set or hash_get, this value can be passed to
+ * indicate a string-valued key, and have hash compute the length automatically.
+ */
+#define HASH_KEY_STRING (-1)
+
+/* Abstract type for hash tables. */
+typedef struct hash_t hash_t;
+
+/* Abstract type for scanning hash tables. */
+typedef struct hash_index_t hash_index_t;
+
+/* Create a hash table */
+#ifdef HASH_COPYKEYS
+ hash_t* hash_create(size_t klen);
+#else
+ hash_t* hash_create();
+#endif
+
+/* To release all resources for a hash table */
+void hash_free(hash_t* ht);
+
+/**
+ * Associate a value with a key in a hash table.
+ *
+ * ht The hash table
+ * key Pointer to the key
+ * klen Length of the key. Can be HASH_KEY_STRING to use the string length.
+ * val Value to associate with the key
+ *
+ * val must not be null
+ */
+#ifdef HASH_COPYKEYS
+ int hash_set(hash_t* ht, const void* key, const void* val);
+#else
+ int hash_set(hash_t* ht, const void* key, size_t klen, const void* val);
+#endif
+
+/**
+ * Remove a value and key form the hash table
+ *
+ * ht The hash table
+ * key Pointer to the key
+ * klen Length of the key. Can be HASH_KEY_STRING to use the string length
+ */
+#ifdef HASH_COPYKEYS
+ void hash_rem(hash_t* ht, const void* key);
+#else
+ void hash_rem(hash_t* ht, const void* key, size_t klen);
+#endif
+
+/**
+ * Look up the value associated with a key in a hash table.
+ *
+ * ht The hash table
+ * key Pointer to the key
+ * klen Length of the key. Can be APR_HASH_KEY_STRING to use the string length.
+ *
+ * Returns NULL if the key is not present.
+ */
+#ifdef HASH_COPYKEYS
+ void* hash_get(hash_t* ht, const void* key);
+#else
+ void* hash_get(hash_t* ht, const void* key, size_t klen);
+#endif
+
+/**
+ * Start iterating over the entries in a hash table.
+ *
+ * ht The hash table
+ *
+ * There is no restriction on adding or deleting hash entries during
+ * an iteration (although the results may be unpredictable unless all you do
+ * is delete the current entry). Only one iteration can be in progress at once.
+ */
+hash_index_t* hash_first(hash_t* ht);
+
+/**
+ * Continue iterating over the entries in a hash table.
+ *
+ * hi The iteration state
+ *
+ * Returns a pointer to the updated iteration state.
+ * NULL if there are no more entries.
+ */
+hash_index_t* hash_next(hash_index_t* hi);
+
+/**
+ * Get the current entry's details from the iteration state.
+ *
+ * hi The iteration state
+ * key Return pointer for the pointer to the key.
+ * klen Return pointer for the key length.
+ * val Return pointer for the associated value.
+ *
+ * The return pointers should point to a variable that will be set to the
+ * corresponding data, or they may be NULL if the data isn't interesting.
+ */
+#ifdef HASH_COPYKEYS
+ void* hash_this(hash_index_t* hi, const void** key);
+#else
+ void* hash_this(hash_index_t* hi, const void** key, size_t* klen);
+#endif
+
+/**
+ * Purge entries before a certain timestamp
+ */
+#ifdef HASH_TIMESTAMP
+int hash_purge(hash_t* ht, time_t stamp);
+
+#ifdef HASH_COPYKEYS
+ void hash_touch(hash_index_t* hi, const void** key);
+#else
+ void hash_touch(hash_index_t* hi, const void** key, size_t* klen);
+#endif
+#endif
+
+/**
+ * Get the number of key/value pairs in the hash table.
+ *
+ * ht The hash table
+ *
+ * The number of key/value pairs in the hash table.
+ */
+unsigned int hash_count(hash_t* ht);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __HASH_H__ */