#ifndef TSL_HASH_MAP_H #define TSL_HASH_MAP_H #include "../forward_decl.h" #include "../value.h" #include #include typedef struct TslHashMapNode TslHashMapNode; struct TslHashMapNode { uint64_t hash; TslValue key; TslValue value; TslHashMapNode *next; }; /* TODO: Optimize small hash map by using the members of the struct instead of allocating on heap */ struct TslHashMap { void *buckets_data; /* value=TslHashMapNode */ size_t buckets_size; size_t buckets_capacity; }; typedef struct { TslHashMap *hash_map; size_t index; TslHashMapNode *node; } TslHashMapIterator; void tsl_hash_map_init(TslHashMap *self); int tsl_hash_map_insert(TslHashMap *self, const TslValue *key, TslValue *value); /* Get a reference to the value by key @key, or NULL if it doesn't exist. The returned pointer is only valid until until reallocation after after insert inserting a new value into the hash map. */ TslValue* tsl_hash_map_get(TslHashMap *self, const TslValue *key); /* Get a reference to the value by key @key, or insert a new value for the key (a TslValue). Returns NULL on failure. The returned pointer is only valid until until reallocation after after insert inserting a new value into the hash map. */ TslValue* tsl_hash_map_get_or_create(TslHashMap *self, const TslValue *key); /* How to use the iterator: TslHashMapIterator iterator; tsl_hash_map_create_iterator(hash_map, &iterator); while(tsl_hash_map_iterator_next(&iterator)) { TslValue *key = &iterator.node->key; TslValue *value = &iterator.node->value; } */ void tsl_hash_map_create_iterator(TslHashMap *self, TslHashMapIterator *iterator); int tsl_hash_map_iterator_next(TslHashMapIterator *self); #endif /* TSL_HASH_MAP_H */