kern
diff src/rbtree.c @ 69:b45e2d5f0ae1
ok I *think* i've fixed it now
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 12 Oct 2011 14:39:40 +0300 |
parents | 0a205396e1a0 |
children | b4b7198986a6 |
line diff
1.1 --- a/src/rbtree.c Mon Oct 10 04:16:01 2011 +0300 1.2 +++ b/src/rbtree.c Wed Oct 12 14:39:40 2011 +0300 1.3 @@ -2,6 +2,7 @@ 1.4 #include <stdlib.h> 1.5 #include <string.h> 1.6 #include "rbtree.h" 1.7 +#include "panic.h" 1.8 1.9 #define INT2PTR(x) ((void*)(x)) 1.10 #define PTR2INT(x) ((int)(x)) 1.11 @@ -13,7 +14,6 @@ 1.12 static void del_tree(struct rbnode *node, void (*delfunc)(struct rbnode*, void*), void *cls); 1.13 static struct rbnode *insert(struct rbtree *rb, struct rbnode *tree, void *key, void *data); 1.14 static struct rbnode *delete(struct rbtree *rb, struct rbnode *tree, void *key); 1.15 -/*static struct rbnode *find(struct rbtree *rb, struct rbnode *node, void *key);*/ 1.16 static void traverse(struct rbnode *node, void (*func)(struct rbnode*, void*), void *cls); 1.17 1.18 struct rbtree *rb_create(rb_cmp_func_t cmp_func) 1.19 @@ -59,6 +59,27 @@ 1.20 del_tree(rb->root, rb->del, rb->del_cls); 1.21 } 1.22 1.23 +void rb_clear(struct rbtree *rb) 1.24 +{ 1.25 + del_tree(rb->root, rb->del, rb->del_cls); 1.26 + rb->root = 0; 1.27 +} 1.28 + 1.29 +int rb_copy(struct rbtree *dest, struct rbtree *src) 1.30 +{ 1.31 + struct rbnode *node; 1.32 + 1.33 + rb_clear(dest); 1.34 + 1.35 + rb_begin(src); 1.36 + while((node = rb_next(src))) { 1.37 + if(rb_insert(dest, node->key, node->data) == -1) { 1.38 + return -1; 1.39 + } 1.40 + } 1.41 + return 0; 1.42 +} 1.43 + 1.44 void rb_set_allocator(struct rbtree *rb, rb_alloc_func_t alloc, rb_free_func_t free) 1.45 { 1.46 rb->alloc = alloc; 1.47 @@ -237,6 +258,9 @@ 1.48 1.49 if(!tree) { 1.50 struct rbnode *node = rb->alloc(sizeof *node); 1.51 + if(!node) { 1.52 + panic("failed to allocate tree node\n"); 1.53 + } 1.54 node->red = 1; 1.55 node->key = key; 1.56 node->data = data; 1.57 @@ -455,3 +479,14 @@ 1.58 } 1.59 return tree; 1.60 } 1.61 + 1.62 +void rb_dbg_print_tree(struct rbtree *tree) 1.63 +{ 1.64 + struct rbnode *node; 1.65 + 1.66 + rb_begin(tree); 1.67 + while((node = rb_next(tree))) { 1.68 + printf("%d ", rb_node_keyi(node)); 1.69 + } 1.70 + printf("\n"); 1.71 +}