Add some hashmap tests

This commit is contained in:
Nathan Fisher 2023-08-14 19:09:18 -04:00
parent 1fb4e8d9a8
commit b0c2c0c8ac
6 changed files with 100 additions and 19 deletions

22
hmap.c
View file

@ -66,24 +66,6 @@ uint64_t hash_str_fnv1a_64(char * s) {
return hash; return hash;
} }
struct _map_node {
struct _map_node *next;
void * key;
uint64_t hash;
void *data;
};
typedef struct _map_node hmap_node;
typedef struct {
size_t capacity;
size_t len;
size_t keysize;
hmap_node *buckets;
} hmap;
void* hmap_insert(hmap * map, void *key, void *data);
hmap_node* hmap_node_init(void *key, size_t keysize, void *data) { hmap_node* hmap_node_init(void *key, size_t keysize, void *data) {
hmap_node *node; hmap_node *node;
uint64_t hash; uint64_t hash;
@ -242,13 +224,15 @@ void* hmap_remove(hmap *map, void *key) {
ret = current->data; ret = current->data;
map->len--; map->len--;
if (previous != NULL) { if (previous != NULL) {
previous->next = current; previous->next = current->next;
} else { } else {
map->buckets[idx] = *current->next; map->buckets[idx] = *current->next;
} }
free(current);
break; break;
} else { } else {
current = current->next; current = current->next;
previous = current;
} }
} }

View file

@ -64,4 +64,31 @@ int haggis_store_filetype(FILE *stream, haggis_filetype *filetype);
uint64_t hash_fnv1a_64(uint8_t *key, size_t len); uint64_t hash_fnv1a_64(uint8_t *key, size_t len);
uint64_t hash_str_fnv1a_64(char *s); uint64_t hash_str_fnv1a_64(char *s);
struct _map_node {
struct _map_node *next;
void * key;
uint64_t hash;
void *data;
};
typedef struct _map_node hmap_node;
typedef struct {
size_t capacity;
size_t len;
size_t keysize;
hmap_node *buckets;
} hmap;
hmap_node* hmap_node_init(void *key, size_t keysize, void *data);
void hmap_node_deinit(hmap_node *node);
void* hmap_node_attach(hmap_node *root, hmap_node *leaf, size_t keysize);
void* hmap_node_search(hmap_node *root, void *key, size_t keysize);
hmap* hmap_init(size_t keysize);
void hmap_deinit(hmap *map);
int hmap_expand(hmap *map);
void* hmap_insert(hmap *map, void *key, void *data);
void* hmap_get(hmap *map, void *key);
void* hmap_remove(hmap *map, void *key);
#endif // !HAGGIS_PRIVATE_H #endif // !HAGGIS_PRIVATE_H

View file

@ -61,6 +61,9 @@ tests += store_file_sha256
tests += load_file_sha256 tests += load_file_sha256
tests += fnv1a_hash_inode tests += fnv1a_hash_inode
tests += fnv1a_hash_str tests += fnv1a_hash_str
tests += init_hmap
tests += hmap_insert
tests += hmap_get
total != echo $(tests) | wc -w | awk '{ print $$1 }' total != echo $(tests) | wc -w | awk '{ print $$1 }'

29
test/hmap_get.c Normal file
View file

@ -0,0 +1,29 @@
#include "haggis.h"
#include "haggis_private.h"
#include <assert.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
hmap *map;
struct stat st;
char *data;
union {
ino_t val;
u8 bytes[sizeof(ino_t)];
} nod;
char *ret;
map = hmap_init(sizeof(ino_t));
assert(map != NULL);
data = "Makefile";
stat(data, &st);
nod.val = st.st_ino;
hmap_insert(map, &nod.bytes[0], data);
assert(map->len == 1);
ret = hmap_get(map, &nod.bytes[0]);
assert(memcmp(ret, data, 9) == 0);
hmap_deinit(map);
return 0;
}

26
test/hmap_insert.c Normal file
View file

@ -0,0 +1,26 @@
#include "haggis.h"
#include "haggis_private.h"
#include <assert.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
hmap *map;
struct stat st;
char *data;
union {
ino_t val;
u8 bytes[sizeof(ino_t)];
} nod;
map = hmap_init(sizeof(ino_t));
assert(map != NULL);
data = "Makefile";
stat(data, &st);
nod.val = st.st_ino;
hmap_insert(map, &nod.bytes[0], data);
assert(map->len == 1);
hmap_deinit(map);
return 0;
}

12
test/init_hmap.c Normal file
View file

@ -0,0 +1,12 @@
#include "haggis_private.h"
#include <assert.h>
#include <sys/types.h>
int main() {
hmap *map;
map = hmap_init(sizeof(ino_t));
assert(map != NULL);
hmap_deinit(map);
return 0;
}