summaryrefslogtreecommitdiffstats
path: root/nserver
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2019-11-09 10:43:15 -0500
committerrsiddharth <s@ricketyspace.net>2020-04-17 20:56:34 -0400
commit1993bfc6cee9f87ee50137bfe9bae49d513d7cbb (patch)
tree2fe77897da318343135cc6e8e9cd576e150181b7 /nserver
parentfde085c87b6c30eeb6181921b3e9b13ee295700c (diff)
nserver: Update hashmap.
Add 'Hashmap_keys'. Taken from lcthw/hashmap.
Diffstat (limited to 'nserver')
-rw-r--r--nserver/src/hashmap.c35
-rw-r--r--nserver/src/hashmap.h3
2 files changed, 38 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;
diff --git a/nserver/src/hashmap.h b/nserver/src/hashmap.h
index da34e19..9f1d7a7 100644
--- a/nserver/src/hashmap.h
+++ b/nserver/src/hashmap.h
@@ -5,6 +5,7 @@
#include <darray.h>
#define DEFAULT_NUMBER_OF_BUCKETS 100
+#define DEFAULT_NUMBER_OF_KEYS 50
typedef int (*Hashmap_compare) (void *a, void *b);
typedef uint32_t(*Hashmap_hash) (void *key);
@@ -36,5 +37,7 @@ int Hashmap_traverse(Hashmap *map, Hashmap_traverse_cb travers_cb);
void *Hashmap_delete(Hashmap *map, void *key);
+DArray *Hashmap_keys(Hashmap *map);
+
uint32_t fnv_hash(void *a);
#endif