}
/* 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;
}
/* 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;
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);
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;