From: stevenj Date: Tue, 28 Aug 2007 04:03:49 +0000 (-0400) Subject: added rb_tree_find_le/gt test X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=37975232008a0a506fa1198fa2e7f0435da63fab;p=nlopt.git added rb_tree_find_le/gt test darcs-hash:20070828040349-c8de0-46098c86b9fb26fab2d96ff0c6bf34cd0b973828.gz --- diff --git a/cdirect/redblack.c b/cdirect/redblack.c index 3001486..da0e5c8 100644 --- a/cdirect/redblack.c +++ b/cdirect/redblack.c @@ -232,7 +232,7 @@ rb_node *rb_tree_find_exact(rb_tree *t, int k) } /* find greatest point in subtree p that is <= k */ -rb_node *find_le(rb_node *p, int k, rb_tree *t) +static rb_node *find_le(rb_node *p, int k, rb_tree *t) { rb_node *nil = &t->nil; rb_compare compare = t->compare; @@ -256,7 +256,7 @@ rb_node *rb_tree_find_le(rb_tree *t, int k) } /* find least point in subtree p that is > k */ -rb_node *find_gt(rb_node *p, int k, rb_tree *t) +static rb_node *find_gt(rb_node *p, int k, rb_tree *t) { rb_node *nil = &t->nil; rb_compare compare = t->compare; diff --git a/cdirect/redblack.h b/cdirect/redblack.h index 6aa0831..fdc507a 100644 --- a/cdirect/redblack.h +++ b/cdirect/redblack.h @@ -37,6 +37,8 @@ extern int rb_tree_insert(rb_tree *t, int k); extern int rb_tree_check(rb_tree *t); extern rb_node *rb_tree_find(rb_tree *t, int k); extern rb_node *rb_tree_find_exact(rb_tree *t, int k); +extern rb_node *rb_tree_find_le(rb_tree *t, int k); +extern rb_node *rb_tree_find_gt(rb_tree *t, int k); extern rb_node *rb_tree_resort(rb_tree *t, rb_node *n); extern rb_node *rb_tree_min(rb_tree *t); extern rb_node *rb_tree_max(rb_tree *t); diff --git a/cdirect/redblack_test.c b/cdirect/redblack_test.c index 7aa1757..aaf2c5f 100644 --- a/cdirect/redblack_test.c +++ b/cdirect/redblack_test.c @@ -99,8 +99,49 @@ int main(int argc, char **argv) k[i] = -1 - knew; } - for (i = 0; i < N; ++i) + if (t.N != N) { + fprintf(stderr, "incorrect N (%d) in tree (vs. %d)\n", t.N, N); + return 1; + } + + for (i = 0; i < N; ++i) { k[i] = -1 - k[i]; + /* rescale keys by 100 to add more space between them */ + k[i] *= 100; + t.nodes[i].k *= 100; + } + + for (i = 0; i < N; ++i) { + int k = rand() % (N * 150) - N*25; + rb_node *le = rb_tree_find_le(&t, k); + rb_node *gt = rb_tree_find_gt(&t, k); + rb_node *n = rb_tree_min(&t); + if (n->k > k) { + if (le) { + fprintf(stderr, "found invalid le %d for %d\n", le->k, k); + return 1; + } + if (gt != n) { + fprintf(stderr, "gt is not first node for k=%d\n", k); + return 1; + } + } + else { + rb_node *succ = n; + do { + n = succ; + succ = rb_tree_succ(&t, n); + } while (succ && succ->k <= k); + if (n != le) { + fprintf("rb_tree_find_le gave wrong result for k=%d\n", k); + return 1; + } + if (succ != gt) { + fprintf("rb_tree_find_gt gave wrong result for k=%d\n", k); + return 1; + } + } + } for (M = N; M > 0; --M) { j = rand() % M;