diff options
author | rsiddharth <s@ricketyspace.net> | 2019-11-09 10:43:15 -0500 |
---|---|---|
committer | rsiddharth <s@ricketyspace.net> | 2020-04-17 20:56:34 -0400 |
commit | 1993bfc6cee9f87ee50137bfe9bae49d513d7cbb (patch) | |
tree | 2fe77897da318343135cc6e8e9cd576e150181b7 /nserver/src/hashmap.c | |
parent | fde085c87b6c30eeb6181921b3e9b13ee295700c (diff) |
nserver: Update hashmap.
Add 'Hashmap_keys'. Taken from lcthw/hashmap.
Diffstat (limited to 'nserver/src/hashmap.c')
-rw-r--r-- | nserver/src/hashmap.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/nserver/src/hashmap.c b/nserver/src/hashmap.c index 452dc7d..1979cd4 100644 --- a/nserver/src/hashmap.c +++ b/nserver/src/hashmap.c @@ -268,6 +268,41 @@ int Hashmap_traverse(Hashmap *map, Hashmap_traverse_cb traverse_cb) return 0; } +/** + * Returns all keys of the hashmap as a DArray. + * + * Use DArray_destroy on the 'keys' returned by this function after + * use. + */ +DArray *Hashmap_keys(Hashmap *map) +{ + check(map != NULL, "map is NULL"); + + DArray *keys = DArray_create(sizeof(void *), + DEFAULT_NUMBER_OF_KEYS); + check(keys != NULL, "Unable to initialize keys"); + + int i = 0; + int j = 0; + + for (i = 0; i < DArray_count(map->buckets); i++) { + DArray *bucket = DArray_get(map->buckets, i); + if (bucket) { + for (j = 0; j < DArray_count(bucket); j++) { + HashmapNode *node = DArray_get(bucket, j); + + if (node) { + DArray_push(keys, node->key); + } + } + } + } + + return keys; + error: + return NULL; +} + void *Hashmap_delete(Hashmap *map, void *key) { uint32_t hash = 0; |