feat(lsm): write str tests; start trie tests

This commit is contained in:
Jef Roosens 2023-10-14 14:33:22 +02:00
parent 87000e8f73
commit ef8129b8eb
Signed by: Jef Roosens
GPG key ID: B75D4F293C7052DB
7 changed files with 441 additions and 52 deletions

View file

@ -7,6 +7,20 @@
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
lsm_error lsm_str_init(lsm_str **ptr, char *s) {
lsm_str *str = calloc(1, sizeof(lsm_str));
if (str == NULL) {
return lsm_error_failed_alloc;
}
lsm_str_overwrite(str, s);
*ptr = str;
return lsm_error_ok;
}
lsm_error lsm_str_init_zero(lsm_str **ptr) {
lsm_str *str = calloc(1, sizeof(lsm_str));
@ -19,7 +33,21 @@ lsm_error lsm_str_init_zero(lsm_str **ptr) {
return lsm_error_ok;
}
void lsm_str_init_prealloc(lsm_str *str, char *s) {
lsm_error lsm_str_init_copy(lsm_str **ptr, char *s) {
lsm_str *str = calloc(1, sizeof(lsm_str));
if (str == NULL) {
return lsm_error_failed_alloc;
}
lsm_str_overwrite_copy(str, s);
*ptr = str;
return lsm_error_ok;
}
void lsm_str_overwrite(lsm_str *str, char *s) {
str->len = strlen(s);
if (str->len <= 8) {
@ -30,27 +58,7 @@ void lsm_str_init_prealloc(lsm_str *str, char *s) {
}
}
lsm_error lsm_str_init(lsm_str **ptr, char *s) {
lsm_str *str = calloc(1, sizeof(lsm_str));
if (str == NULL) {
return lsm_error_failed_alloc;
}
lsm_str_init_prealloc(str, s);
*ptr = str;
return lsm_error_ok;
}
lsm_error lsm_str_init_copy(lsm_str **ptr, char *s) {
lsm_str *str = calloc(1, sizeof(lsm_str));
if (str == NULL) {
return lsm_error_failed_alloc;
}
lsm_error lsm_str_overwrite_copy(lsm_str *str, char *s) {
str->len = strlen(s);
if (str->len <= 8) {
@ -66,8 +74,6 @@ lsm_error lsm_str_init_copy(lsm_str **ptr, char *s) {
str->data.ptr = buf;
}
*ptr = str;
return lsm_error_ok;
}
@ -80,10 +86,7 @@ void lsm_str_zero(lsm_str *str) {
}
void lsm_str_free(lsm_str *str) {
if (str->len > 8) {
free(str->data.ptr);
}
lsm_str_zero(str);
free(str);
}
@ -112,7 +115,7 @@ lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start,
const char *str_ptr = lsm_str_ptr(str);
if (len <= 8) {
lsm_str_zero(out);
/* lsm_str_zero(out); */
memcpy(out->data.val, &str_ptr[start], len);
} else {
char *buf = malloc(len * sizeof(char));
@ -123,7 +126,7 @@ lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start,
memcpy(buf, &str_ptr[start], len);
lsm_str_zero(out);
/* lsm_str_zero(out); */
out->data.ptr = buf;
}
@ -185,3 +188,11 @@ lsm_error lsm_str_split(lsm_str *s, lsm_str *s2, uint64_t index) {
return lsm_str_truncate(s, index);
}
bool lsm_str_eq(lsm_str *s1, lsm_str *s2) {
if (s1->len != s2->len) {
return false;
}
return memcmp(lsm_str_ptr(s1), lsm_str_ptr(s2), s1->len) == 0;
}

View file

@ -35,6 +35,8 @@ lsm_error lsm_trie_init(lsm_trie **ptr) {
return lsm_error_ok;
}
uint64_t lsm_trie_size(lsm_trie *trie) { return trie->size; }
lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) {
// NULL is not allowed as a data value, as it's used to indicate a lack of
// data
@ -48,6 +50,7 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) {
if (key_len == 0) {
if (trie->root->data == NULL) {
trie->root->data = data;
trie->size++;
return lsm_error_ok;
} else {
@ -75,6 +78,8 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) {
}
new_node->data = data;
trie->size++;
lsm_str_substr(&new_node->skip, key, index + 1, key_len);
return lsm_bt_insert(&node->bt, c, new_node);
@ -125,6 +130,7 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) {
}
node->data = data;
trie->size++;
return lsm_error_ok;
}