diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-02-23 16:46:22 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-02-23 20:59:39 +0000 |
commit | 54b1960d18042cf6dfd86cfe01d58455357586d2 (patch) | |
tree | 42286b7f107b465780cdaaa0532d2f2b8b8e5072 /utils | |
parent | fd80341513813684ba3155b87e4e6cc8c87631f1 (diff) | |
download | netsurf-54b1960d18042cf6dfd86cfe01d58455357586d2.tar.gz netsurf-54b1960d18042cf6dfd86cfe01d58455357586d2.tar.bz2 |
utils: Add iteration API to hashmap
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/hashmap.c | 19 | ||||
-rw-r--r-- | utils/hashmap.h | 22 |
2 files changed, 41 insertions, 0 deletions
diff --git a/utils/hashmap.c b/utils/hashmap.c index 7ed19946b..bfbf6ceb8 100644 --- a/utils/hashmap.c +++ b/utils/hashmap.c @@ -213,3 +213,22 @@ hashmap_remove(hashmap_t *hashmap, void *key) return false; } + +/* Exported function, documented in hashmap.h */ +bool +hashmap_iterate(hashmap_t *hashmap, hashmap_iteration_cb_t cb, void *ctx) +{ + for (uint32_t bucket = 0; + bucket < hashmap->bucket_count; + bucket++) { + for (hashmap_entry_t *entry = hashmap->buckets[bucket]; + entry != NULL; + entry = entry->next) { + /* If the callback returns true, we early-exit */ + if (cb(entry->key, entry->value, ctx)) + return true; + } + } + + return false; +} diff --git a/utils/hashmap.h b/utils/hashmap.h index 462b51ed2..cb8fd5074 100644 --- a/utils/hashmap.h +++ b/utils/hashmap.h @@ -62,6 +62,16 @@ typedef void* (*hashmap_value_alloc_t)(void *); typedef void (*hashmap_value_destroy_t)(void *); /** + * Hashmap iteration callback function type. + * + * First parameter is the key, second is the value. + * The final parameter is the context pointer for the iteration. + * + * Return true to stop iterating early + */ +typedef bool (*hashmap_iteration_cb_t)(void *, void *, void *); + +/** * Parameters for hashmaps */ typedef struct { @@ -163,5 +173,17 @@ void *hashmap_insert(hashmap_t *hashmap, void *key); */ bool hashmap_remove(hashmap_t *hashmap, void *key); +/** + * Iterate the hashmap + * + * For each key/value pair in the hashmap, call the callback passing in + * the key and value. During iteration you MUST NOT mutate the hashmap. + * + * \param hashmap The hashmap to iterate + * \param cb The callback for each key,value pair + * \param ctx The callback context + * \return Whether or not we stopped iteration early + */ +bool hashmap_iterate(hashmap_t *hashmap, hashmap_iteration_cb_t cb, void *ctx); #endif |