From e7ebbd30ec4d0906a936405d1d206c7a306e9c9f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2011 08:10:23 +0100 Subject: [PATCH] rbtree.c: make rbnode an ADT. --- docs/rbtree.txt | 32 ++++---------------------------- src/rbtree.c | 10 ++++++++++ src/rbtree.h | 12 +----------- 3 files changed, 15 insertions(+), 39 deletions(-) diff --git a/docs/rbtree.txt b/docs/rbtree.txt index 34c7071..bf3ef58 100644 --- a/docs/rbtree.txt +++ b/docs/rbtree.txt @@ -4,10 +4,6 @@ Red-Black Tree Macros ~~~~~~ -`RB_RED`:: -`RB_BLACK`:: - Used to mark the color of a `rbnode`. - `RBTREE_INIT`:: Initialize a `rbtree` structure. + should only be used with the declaration like: @@ -21,24 +17,6 @@ the arguments are pointers to callback functions, in order: `delete_fn`, `update Data structures ~~~~~~~~~~~~~~~ -* `rbnode` -+ --- -The binary tree node. - -`key`:: - The key of this node - -`child`:: - pointers to the left and right child to this node - -`color`:: - the color, should be a value of `RB_BLACK` or `RB_RED` --- - -++++ -++++ - * `rbtree` + -- @@ -48,16 +26,16 @@ Structure that holds a tree of nodes Pointer to the node that is the root of the tree. `delete_fn`:: - Pointer to the function that should handle the delete routines for the `rbnode->key` pointer. + Pointer to the function that should handle the delete routines for the `key` pointer. `update_fn`:: - Pointer to the function that is called when the implementation performs an update of an `rbnode->key` pointer. + + Pointer to the function that is called when the implementation performs an update of an `key` pointer. + The function gets the following information passed in order: old pointer, new pointer. NOTE: You may only need this if you store the data in another structure and has to keep it synchronized with the RB-tree. `cmp_fn`:: - Pointer to the function that is used to compare two `rbnode->key` pointers. + + Pointer to the function that is used to compare two `key` pointers. + Shall return a value greater than zero if 'ptr1' > 'ptr2', a value less than zero if 'ptr1' < 'ptr2' and zero if 'ptr1' == 'ptr2'. -- @@ -83,7 +61,7 @@ NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ens `rbtree_walk()`:: - Walks the tree in-order and passes a pointer to `rbnode->key` + Walks the tree in-order and passes a pointer to `key` for the given node to the 'action' callback function. `rbtree_search()`:: @@ -91,8 +69,6 @@ NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ens Searches the tree for 'key'. + Returns a pointer to the node if found else `NULL`. -NOTE: the function uses the `rbtree->cmp_fn` function to compare 'key' with a `rbnode->key`. - `rbtree_is_empty()`:: Checks if a tree is empty, retruns zero if the tree is empty, nonzero otherwise. diff --git a/src/rbtree.c b/src/rbtree.c index 74974a6..bd91656 100644 --- a/src/rbtree.c +++ b/src/rbtree.c @@ -19,6 +19,16 @@ #include "xalloc.h" #include "rbtree.h" +#define RB_RED 0 +#define RB_BLACK 1 + +/* node definition */ +typedef struct _rbn { + const void *key; + struct _rbn *child[2]; + unsigned char color; +} rbnode; + #define is_red(n) ((n) != NULL && (n)->color == RB_RED) #define swap(n,d,q) ((n)->child[(n)->child[d] == (q)]) diff --git a/src/rbtree.h b/src/rbtree.h index e223b36..e4e8af6 100644 --- a/src/rbtree.h +++ b/src/rbtree.h @@ -11,20 +11,10 @@ #ifndef __RBTREE_H #define __RBTREE_H -#define RB_RED 0 -#define RB_BLACK 1 - #include -/* node definition */ -typedef struct _rbn { - const void *key; - struct _rbn *child[2]; - unsigned char color; -} rbnode; - typedef struct { - rbnode *root; + struct _rbn *root; /* user defined operations */ void (*delete_fn)(void *); void (*update_fn)(void *, void *);