[GRASS-SVN] r36515 - grass/trunk/include/vect
svn_grass at osgeo.org
svn_grass at osgeo.org
Sun Mar 29 15:45:35 EDT 2009
Author: mmetz
Date: 2009-03-29 15:45:35 -0400 (Sun, 29 Mar 2009)
New Revision: 36515
Modified:
grass/trunk/include/vect/rbtree.h
Log:
Red Black Tree polished, header
Modified: grass/trunk/include/vect/rbtree.h
===================================================================
--- grass/trunk/include/vect/rbtree.h 2009-03-29 14:49:45 UTC (rev 36514)
+++ grass/trunk/include/vect/rbtree.h 2009-03-29 19:45:35 UTC (rev 36515)
@@ -1,5 +1,5 @@
/*************************************************************
- * USAGE
+ * USAGE *
*************************************************************
*
* NOTE: duplicates are not supported
@@ -7,12 +7,12 @@
* custom compare function
* extern int my_compare_fn(const void *, const void *);
* int my_compare_fn(const void *a, const void *b) {
- * if ((mydatastruct *) a > (mydatastruct *) b)
- * return 0;
- * else if ((mydatastruct *) a < (mydatastruct *) b)
- * return 1;
- * else if ((mydatastruct *) a == (mydatastruct *) b)
- * return 2;
+ * if ((mydatastruct *) a < (mydatastruct *) b)
+ * return -1;
+ * else if ((mydatastruct *) a > (mydatastruct *) b)
+ * return 1;
+ * else if ((mydatastruct *) a == (mydatastruct *) b)
+ * return 0;
* }
*
* create and initialize tree:
@@ -20,77 +20,93 @@
*
* insert items to tree:
* struct mydatastruct data = <some data>;
- * if (rbtree_insert(&mytree, &data) == 0)
- * G_warning("could not insert data");
+ * if (rbtree_insert(mytree, &data) == 0)
+ * G_warning("could not insert data");
*
* find item in tree:
* struct mydatastruct data = <some data>;
- * if (rbtree_find(&mytree, &data) == 0)
- * G_message("data not found");
+ * if (rbtree_find(mytree, &data) == 0)
+ * G_message("data not found");
*
* delete item from tree:
* struct mydatastruct data = <some data>;
- * if (rbtree_remove(&mytree, &data) == 0)
- * G_warning("could not find data in tree");
+ * if (rbtree_remove(mytree, &data) == 0)
+ * G_warning("could not find data in tree");
*
* traverse tree (get all items in tree in ascending order):
* struct RB_TRAV trav;
* rbtree_init_trav(&trav, tree);
* while ((data = rbtree_traverse(&trav)) != NULL) {
- * if (my_compare_fn(data, threshold_data) == 0) break;
- * <do something with data>;
+ * if (my_compare_fn(data, threshold_data) == 0) break;
+ * <do something with data>;
+ * }
+ *
+ * get a selection of items: all data > data1 and < data2
+ * start in tree where data is last smaller or first larger compared to data1
+ * struct RB_TRAV trav;
+ * rbtree_init_trav(&trav, tree);
+ * data = rbtree_traverse_start(&trav, &data1);
+ * <do something with data>;
+ * while ((data = rbtree_traverse(&trav)) != NULL) {
+ * if (data > data2) break;
+ * <do something with data>;
* }
*
* destroy tree:
* rbtree_destroy(mytree);
+ *
+ * debug the whole tree with
+ * rbtree_debug(mytree, mytree->root);
*
*************************************************************/
-
-
-/* structures and functions needed for Red Black Tree */
-
#include <stddef.h>
/* maximum RB Tree height */
-#define RBTREE_MAX_HEIGHT 64 /* allow 2^64 items */
+#define RBTREE_MAX_HEIGHT 64 /* should be more than enough */
-/* routine to compare data items */
-/* return 0 if rb_a > rb_b */
-/* return 1 if rb_a < rb_b */
-/* return 2 if rb_a == rb_b */
+/* routine to compare data items
+ * return -1 if rb_a < rb_b
+ * return 0 if rb_a == rb_b
+ * return 1 if rb_a > rb_b
+ */
typedef int rb_compare_fn(const void *rb_a, const void *rb_b);
struct RB_NODE
{
- unsigned char red;
- void *data;
- struct RB_NODE *link[2];
+ unsigned char red; /* 0 = black, 1 = red */
+ void *data; /* any kind of data */
+ struct RB_NODE *link[2]; /* link to children: link[0] for smaller, link[1] for larger */
};
struct RB_TREE
{
- struct RB_NODE *root;
+ struct RB_NODE *root; /* root node */
size_t datasize; /* item size */
- size_t count; /* Number of items in tree. */
- rb_compare_fn *rb_compare;
+ size_t count; /* number of items in tree. */
+ rb_compare_fn *rb_compare; /* function to compare data */
};
struct RB_TRAV
{
- struct RB_TREE *tree; /* tree being traversed */
- struct RB_NODE *curr_node;
- struct RB_NODE *up[RBTREE_MAX_HEIGHT];
- int top;
- int first;
+ struct RB_TREE *tree; /* tree being traversed */
+ struct RB_NODE *curr_node; /* current node */
+ struct RB_NODE *up[RBTREE_MAX_HEIGHT]; /* stack of parent nodes */
+ int top; /* index for stack */
+ int first; /* little helper flag */
};
-/* rbtree.c */
+/* tree functions */
struct RB_TREE *rbtree_create(rb_compare_fn *, size_t);
+void rbtree_destroy(struct RB_TREE *);
int rbtree_insert(struct RB_TREE *, void *);
+int rbtree_remove(struct RB_TREE *, const void *);
void *rbtree_find(struct RB_TREE *, const void *);
-int rbtree_remove(struct RB_TREE *, const void *);
-void rbtree_init_trav(struct RB_TRAV *, struct RB_TREE *);
+
+/* tree traversal functions */
+int rbtree_init_trav(struct RB_TRAV *, struct RB_TREE *);
void* rbtree_traverse(struct RB_TRAV *);
-void rbtree_destroy(struct RB_TREE *);
+void *rbtree_traverse_start(struct RB_TRAV *, const void *);
+
+/* debug tree from given node downwards */
int rbtree_debug(struct RB_TREE *, struct RB_NODE *);
More information about the grass-commit
mailing list