summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-11-02 11:18:37 -0400
committerTavian Barnes <tavianator@tavianator.com>2024-11-04 12:26:38 -0500
commit7841bfe55d4b5aa85e6d6f661f30f9eecbc84374 (patch)
treef2fd3375c3760e0aaffb1d839227b999c686fb9b
parentf9731a2ee6917ce5c389444e52cfa99bea873edb (diff)
downloadbfs-7841bfe55d4b5aa85e6d6f661f30f9eecbc84374.tar.xz
trie: Get rid of the linked list of leavesslab-bitmaps
-rw-r--r--src/trie.c8
-rw-r--r--src/trie.h6
-rw-r--r--tests/trie.c7
3 files changed, 4 insertions, 17 deletions
diff --git a/src/trie.c b/src/trie.c
index dd96414..3a6e4e6 100644
--- a/src/trie.c
+++ b/src/trie.c
@@ -87,7 +87,6 @@
#include "bfs.h"
#include "bit.h"
#include "diag.h"
-#include "list.h"
#include <stdint.h>
#include <string.h>
@@ -165,7 +164,6 @@ static uintptr_t trie_encode_leaf(const struct trie_leaf *leaf) {
void trie_init(struct trie *trie) {
trie->root = 0;
- LIST_INIT(trie);
VARENA_INIT(&trie->nodes, struct trie_node, children);
VARENA_INIT(&trie->leaves, struct trie_leaf, key);
}
@@ -339,9 +337,6 @@ static struct trie_leaf *trie_leaf_alloc(struct trie *trie, const void *key, siz
return NULL;
}
- LIST_ITEM_INIT(leaf);
- LIST_APPEND(trie, leaf);
-
leaf->value = NULL;
leaf->length = length;
memcpy(leaf->key, key, length);
@@ -351,7 +346,6 @@ static struct trie_leaf *trie_leaf_alloc(struct trie *trie, const void *key, siz
/** Free a leaf. */
static void trie_leaf_free(struct trie *trie, struct trie_leaf *leaf) {
- LIST_REMOVE(trie, leaf);
varena_free(&trie->leaves, leaf);
}
@@ -736,8 +730,6 @@ void trie_remove(struct trie *trie, struct trie_leaf *leaf) {
void trie_clear(struct trie *trie) {
trie->root = 0;
- LIST_INIT(trie);
-
varena_clear(&trie->leaves);
varena_clear(&trie->nodes);
}
diff --git a/src/trie.h b/src/trie.h
index 318a23b..520a82d 100644
--- a/src/trie.h
+++ b/src/trie.h
@@ -14,8 +14,6 @@
* A leaf of a trie.
*/
struct trie_leaf {
- /** Linked list of leaves, in insertion order. */
- struct trie_leaf *prev, *next;
/** An arbitrary value associated with this leaf. */
void *value;
/** The length of the key in bytes. */
@@ -30,8 +28,6 @@ struct trie_leaf {
struct trie {
/** Pointer to the root node/leaf. */
uintptr_t root;
- /** Linked list of leaves. */
- struct trie_leaf *head, *tail;
/** Node allocator. */
struct varena nodes;
/** Leaf allocator. */
@@ -143,6 +139,6 @@ void trie_destroy(struct trie *trie);
* Iterate over the leaves of a trie.
*/
#define for_trie(leaf, trie) \
- for_list (struct trie_leaf, leaf, trie)
+ for_varena (struct trie_leaf, leaf, &(trie)->leaves)
#endif // BFS_TRIE_H
diff --git a/tests/trie.c b/tests/trie.c
index 6e6024a..d69f37e 100644
--- a/tests/trie.c
+++ b/tests/trie.c
@@ -71,15 +71,14 @@ void check_trie(void) {
bfs_verify(leaf);
bfs_check(strcmp(keys[i], leaf->key) == 0);
bfs_check(leaf->length == strlen(keys[i]) + 1);
+ leaf->value = (void *)keys[i];
}
{
size_t i = 0;
for_trie (leaf, &trie) {
- bfs_check(leaf == trie_find_str(&trie, keys[i]));
- bfs_check(leaf == trie_insert_str(&trie, keys[i]));
- bfs_check(!leaf->prev || leaf->prev->next == leaf);
- bfs_check(!leaf->next || leaf->next->prev == leaf);
+ bfs_check(strcmp(leaf->value, leaf->key) == 0);
+ leaf->value = NULL;
++i;
}
bfs_check(i == nkeys);