]> git.lizzy.rs Git - dragonstd.git/commitdiff
Bintree: allow custom comparators
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 26 Aug 2021 11:09:01 +0000 (13:09 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 26 Aug 2021 11:09:01 +0000 (13:09 +0200)
bintree.c
bintree.h

index f68fa1e29e54b0dfb39237d6045187c7b47d0c55..6587e12a7d6d72a72ab82720db642e385ce8109a 100644 (file)
--- a/bintree.c
+++ b/bintree.c
@@ -2,11 +2,17 @@
 #include <stdlib.h>
 #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);
index 0e6e87781de04bb5b5921d836a449c720654e229..9dd0cfa6c4e73a369310e40f632b8de113e80a04 100644 (file)
--- a/bintree.h
+++ b/bintree.h
@@ -3,6 +3,11 @@
 
 #include <stddef.h>
 
+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);