void* hash_table_lookup(Hashtable* ht, const void* key) {
if (key == NULL || ht == NULL) return false;
- uint64_t index = hash_table_index(ht, key);
+ uint32_t index = hash_table_index(ht, key);
Node* node = ht->nodes[index];
while (node != NULL && ht->compare(node->data, key) == false) {
}
if (node == NULL) return NULL;
- printf("find: %p -> found: %p\n", key, node->data);
+ //printf("find: %p -> found: %p\n", key, node->data);
return node->data;
}
return false;
}
+bool hash_table_contains(Hashtable* ht, const void* key) {
+ if (ht == NULL || key == NULL) return false;
+
+ if (hash_table_lookup(ht, key) == NULL)
+ return false;
+ return true;
+}
+
+uint64_t hash_table_size(Hashtable *ht) {
+ uint64_t size = 0;
+
+ if (ht == NULL) return size;
+
+ for (uint32_t i = 0; i < ht->size; i++) {
+ if (ht->nodes[i] != NULL) {
+ Node* node = ht->nodes[i];
+ while (node != NULL) {
+ size++;
+ node = node->next;
+ }
+ }
+ }
+
+ return size;
+}
+
+bool hash_table_replace(Hashtable *ht, void* key, void* value) {
+ if (ht == NULL || key == NULL || value == NULL) return false;
+
+ uint32_t index = hash_table_index(ht, key);
+
+ Node* node = ht->nodes[index];
+ while (node != NULL && ht->compare(node->data, key) == false) {
+ node = node->next;
+ }
+
+ if (node == NULL)
+ return hash_table_insert(ht, key, value);
+ else {
+ free(node->data);
+ node->key = key;
+ node->data = value;
+ }
+
+ return true;
+}
+
uint64_t int_hash(const void* key) {
return *(uint64_t*) key;
}
void hash_table_foreach(Hashtable* ht, ForeachFunc, void* userdata);
void hash_table_iter_init(HashtableIter* iter, Hashtable* ht);
bool hash_table_iter_next(HashtableIter* iter, void** key, void** value);
+bool hash_table_contains(Hashtable* ht, const void* key);
+uint64_t hash_table_size(Hashtable* ht);
+bool hash_table_replace(Hashtable* ht, void* key, void* value);
#endif
printf("%u out of %u inserted words in table were in the table\n", good_guesses, numwords);
HashtableIter iter;
- void* key/* = malloc(sizeof(void*))*/;
- void* value/* = malloc(sizeof(void*))*/;
+ void* key;
+ void* value;
hash_table_iter_init(&iter, table);
while (hash_table_iter_next(&iter, &key, &value)) {
char* s1 = ((Node*) value)->name;
printf("Key: %p value: %s\n", key, s1);
}
- //free(key);
- //free(value);
+
+ Node* node1 = calloc(sizeof(Node*), 1);
+ node1->name = strdup("Dummy Test Name");
+ if (hash_table_insert(table, node1, node1) == true) {
+ hash_table_iter_init(&iter, table);
+ printf("Hashtable size: %lu. Key found: %d\n", hash_table_size(table), hash_table_contains(table, node1));
+ void* data = hash_table_delete(table, node1);
+ printf("Deleted: [%p] %s\n", node1, ((Node*) data)->name);
+ free(((Node*) data)->name);
+ free(data);
+ printf("Hashtable size: %lu. Key found: %d\n", hash_table_size(table), hash_table_contains(table, node1));
+ Node* node2 = calloc(sizeof(Node*), 1);
+ node2->name = strdup("Test Name");
+ hash_table_replace(table, node2, node2);
+ printf("Hashtable size: %lu. Key found: %d\n", hash_table_size(table), hash_table_contains(table, node2));
+ }
hash_table_destroy(table);
}