From: Elias Fleckenstein Date: Thu, 26 Aug 2021 11:09:01 +0000 (+0200) Subject: Bintree: allow custom comparators X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=5f7ef396d3338db2377b226cc83b56ad507a1dd6;p=dragonstd.git Bintree: allow custom comparators --- diff --git a/bintree.c b/bintree.c index f68fa1e..6587e12 100644 --- a/bintree.c +++ b/bintree.c @@ -2,11 +2,17 @@ #include #include "bintree.h" -Bintree bintree_create(size_t key_size) +static int bintree_compare_mem(void *v1, void *v2, Bintree *tree) +{ + return memcmp(v1, v2, tree->key_size); +} + +Bintree bintree_create(size_t key_size, BintreeComparator cmp) { return (Bintree) { .root = NULL, .key_size = key_size, + .cmp = cmp ? cmp : &bintree_compare_mem, }; } @@ -15,7 +21,7 @@ static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void if (*nodeptr) { int cond; - if ((cond = memcmp((*nodeptr)->key, key, tree->key_size)) == 0) + if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0) return nodeptr; else if (cond > 0) return search_recursive(tree, &(*nodeptr)->left, key); diff --git a/bintree.h b/bintree.h index 0e6e877..9dd0cfa 100644 --- a/bintree.h +++ b/bintree.h @@ -3,6 +3,11 @@ #include +struct Bintree; + +typedef int (*BintreeComparator)(void *v1, void *v2, struct Bintree *tree); +typedef void (*BintreeFreeFunction)(void *value, void *arg); + typedef struct BintreeNode { void *key; @@ -11,15 +16,14 @@ typedef struct BintreeNode struct BintreeNode *right; } BintreeNode; -typedef struct +typedef struct Bintree { BintreeNode *root; size_t key_size; + BintreeComparator cmp; } Bintree; -typedef void (*BintreeFreeFunction)(void *value, void *arg); - -Bintree bintree_create(size_t key_size); +Bintree bintree_create(size_t key_size, BintreeComparator cmp); BintreeNode **bintree_search(Bintree *tree, void *key); void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value); void bintree_clear(Bintree *tree, BintreeFreeFunction func, void *arg);