diff options
author | Lennart Poettering <lennart@poettering.net> | 2009-11-18 00:42:52 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-11-18 00:42:52 +0100 |
commit | 6091827530d6dd43479d6709fb6e9f745c11e900 (patch) | |
tree | 3edf7ccdeeb60b634d63e1abcaa8132a6259a331 /hashmap.h |
initial commit
Diffstat (limited to 'hashmap.h')
-rw-r--r-- | hashmap.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/hashmap.h b/hashmap.h new file mode 100644 index 0000000000..4c946e35b9 --- /dev/null +++ b/hashmap.h @@ -0,0 +1,47 @@ +/*-*- Mode: C; c-basic-offset: 8 -*-*/ + +#ifndef foohashmaphfoo +#define foohashmaphfoo + +#include <stdbool.h> + +/* Pretty straightforward hash table implementation. As a minor + * optimization a NULL hashmap object will be treated as empty hashmap + * for all read operations. That way it is not necessary to + * instantiate an object for each Hashmap use. */ + +typedef struct Hashmap Hashmap; + +typedef unsigned (*hash_func_t)(const void *p); +typedef int (*compare_func_t)(const void *a, const void *b); + +unsigned string_hash_func(const void *p); +int string_compare_func(const void *a, const void *b); + +unsigned trivial_hash_func(const void *p); +int trivial_compare_func(const void *a, const void *b); + +Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func); +void hashmap_free(Hashmap*); + +int hashmap_put(Hashmap *h, const void *key, void *value); +void* hashmap_get(Hashmap *h, const void *key); +void* hashmap_remove(Hashmap *h, const void *key); + +unsigned hashmap_size(Hashmap *h); +bool hashmap_isempty(Hashmap *h); + +void *hashmap_iterate(Hashmap *h, void **state, const void **key); +void *hashmap_iterate_backwards(Hashmap *h, void **state, const void **key); + +void *hashmap_steal_first(Hashmap *h); +void* hashmap_first(Hashmap *h); +void* hashmap_last(Hashmap *h); + +#define HASHMAP_FOREACH(e, h, state) \ + for ((state) = NULL, (e) = hashmap_iterate((h), &(state), NULL); (e); (e) = hashmap_iterate((h), &(state), NULL)) + +#define HASHMAP_FOREACH_BACKWARDS(e, h, state) \ + for ((state) = NULL, (e) = hashmap_iterate_backwards((h), &(state), NULL); (e); (e) = hashmap_iterate_backwards((h), &(state), NULL)) + +#endif |