2 * Test of red-black trees
4 * (c) 2002, Robert Spalek <robert@ucw.cz>
10 #include "lib/fastbuf.h"
20 static void my_dump_key(struct fastbuf *fb, struct my1_node *n)
23 sprintf(tmp, "key=%d ", n->key);
27 static void my_dump_data(struct fastbuf *fb, struct my1_node *n)
30 sprintf(tmp, "x=%d ", n->x);
34 #define TREE_NODE struct my1_node
35 #define TREE_PREFIX(x) my_##x
36 #define TREE_KEY_ATOMIC key
37 #define TREE_WANT_CLEANUP
38 #define TREE_WANT_LOOKUP
39 #define TREE_WANT_DELETE
40 #define TREE_WANT_ITERATOR
41 #define TREE_WANT_DUMP
43 #define TREE_CONSERVE_SPACE
46 static void my_check_order(struct fastbuf *fb, struct my_tree *t)
48 int last_key = 0x80000000;
49 TREE_FOR_ALL(my, t, n)
51 ASSERT(n->key >= last_key);
56 sprintf(tmp, "%d -> %d\n", n->key, n->x);
70 static void my2_dump_key(struct fastbuf *fb, struct my2_node *n)
77 static void my2_dump_data(struct fastbuf *fb UNUSED, struct my2_node *n UNUSED)
81 #define TREE_NODE struct my2_node
82 #define TREE_PREFIX(x) my2_##x
83 #define TREE_KEY_ENDSTRING key
85 #define TREE_WANT_CLEANUP
87 #define TREE_WANT_SEARCH
88 #define TREE_WANT_REMOVE
89 #define TREE_WANT_FIND_NEXT
90 #define TREE_WANT_ITERATOR
91 #define TREE_WANT_DUMP
93 #define TREE_CONSERVE_SPACE
96 static void random_string(char *txt, uns max_len)
98 uns len = random() % max_len;
100 for (j=0; j<len; j++)
101 txt[j] = random() % 96 + 32;
105 static char *options = CF_SHORT_OPTS "vn:a";
107 static char *help = "\
108 Usage: test1.bin <options>\n\
111 "-v\tSet verbose mode\n\
112 -n num\tNumber of inserted nodes\n\
113 -a\tProbe some ASSERTs\n\
124 main(int argc, char **argv)
126 uns verbose = 0, number = 1000, asserts = 0;
128 struct fastbuf *fb, *dump_fb;
134 while ((opt = cf_getopt(argc, argv, options, CF_NO_LONG_OPTS, NULL)) >= 0)
141 number = atoi(optarg);
152 fb = bfdopen(1, 4096);
159 for (i=0; i<number; i++)
160 my_lookup(&t, random() % 1000000)->x = i;
161 my_dump(dump_fb, &t);
162 my_check_order(dump_fb, &t);
170 bputs(fb, "Load test passed\n");
173 for (i=0; i<100; i++)
175 my_new(&t, i)->x = i;
176 my_dump(dump_fb, &t);
178 for (i=0; i<100; i++)
180 int res UNUSED = my_delete(&t, i);
182 my_dump(dump_fb, &t);
186 bputs(fb, "Sequential adding and deleting passed\n");
189 for (i=0; i<997; i++)
191 my_new(&t, i*238 % 997)->x = i;
194 my_dump(dump_fb, &t);
195 for (i=0; i<997; i++)
197 int res UNUSED = my_delete(&t, i*111 % 997);
201 my_dump(dump_fb, &t);
203 TREE_FOR_ALL(my, &t, n)
211 bputs(fb, "Complete tree passed\n");
214 for (i=0; i<number; i++)
217 random_string(txt, 30);
220 my2_dump(dump_fb, &t2);
221 TREE_FOR_ALL(my2, &t2, n)
225 for (tmp=n; tmp; tmp = my2_find_next(tmp))
230 bputs(dump_fb, n->key);
231 sprintf(txt, ": %d\n", count);
240 random_string(txt, 30);
241 n = my2_search(&t2, txt);
245 my2_dump(dump_fb, &t2);
248 bputs(fb, "String test passed\n");