aboutsummaryrefslogtreecommitdiff
path: root/src/std_gc/hash_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/std_gc/hash_map.c')
-rw-r--r--src/std_gc/hash_map.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/std_gc/hash_map.c b/src/std_gc/hash_map.c
index 4d4c026..3f12f35 100644
--- a/src/std_gc/hash_map.c
+++ b/src/std_gc/hash_map.c
@@ -1,18 +1,9 @@
#include "../../include/std_gc/hash_map.h"
-#include "../../include/value.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <gc.h>
-typedef struct TslHashMapNode TslHashMapNode;
-struct TslHashMapNode {
- uint64_t hash;
- TslValue key;
- TslValue value;
- TslHashMapNode *next;
-};
-
void tsl_hash_map_init(TslHashMap *self) {
self->buckets_data = NULL;
self->buckets_size = 0;
@@ -193,3 +184,31 @@ TslValue* tsl_hash_map_get_or_create(TslHashMap *self, const TslValue *key) {
return value;
}
+
+void tsl_hash_map_create_iterator(TslHashMap *self, TslHashMapIterator *iterator) {
+ iterator->hash_map = self;
+ iterator->index = -1;
+ iterator->node = NULL;
+}
+
+int tsl_hash_map_iterator_next(TslHashMapIterator *self) {
+ if(self->node) {
+ TslHashMapNode *new_node = self->node->next;
+ if(new_node) {
+ self->node = new_node;
+ return 1;
+ }
+ }
+
+ ++self->index;
+ while(self->index < self->hash_map->buckets_size) {
+ TslHashMapNode **bucket = (TslHashMapNode**)self->hash_map->buckets_data + self->index;
+ if(*bucket) {
+ self->node = *bucket;
+ return 1;
+ }
+ ++self->index;
+ }
+
+ return 0;
+}