#include #include #include #include #include "rbtree.h" #include "helper.h" struct rbtest { struct rb_node rb; int64_t data; }; static struct rbtest *rb_insert_i64(struct rb_root *root, struct rbtest *rbt) { struct rb_node **p = &root->rb_node; struct rb_node *parent = NULL; int64_t key = rbt->data; while (*p) { parent = *p; if (key < rb_entry(parent, struct rbtest, rb)->data) p = &parent->rb_left; else p = &parent->rb_right; } rb_link_node(&rbt->rb, parent, p); rb_insert_color(&rbt->rb, root); return NULL; } int main(int argc, char *argv[]) { long int loops; long int i; long int deleted = 0; uint32_t randval; struct rbtest *tests; struct rb_root testroot = RB_ROOT; struct rb_node *firstrb; struct rbtest *rbptr; if (argc != 2) return 1; errno = 0; loops = strtoul(argv[1], NULL, 10); if (errno || loops <= 0) return 1; srand(loops); tests = calloc(sizeof(struct rbtest), loops); if (tests == NULL) return 1; for (i = 0; i < loops; i++) { randval = rand(); tests[i].data = INT64_C(0x100000000) + randval; rb_insert_i64(&testroot, &tests[i]); #if 0 fprintf(stderr, "rb_insert_i64 rand=%10u node=%p i=%ld\n", randval, &tests[i].rb, i); #endif if (i > 0 && ((randval % 27) == 0)) { #if 0 fprintf(stderr, "doing rb_erase rand=%u i=%ld node=%p\n", (u32)tests[i-1].data, i-1, &tests[i-1].rb); #endif rb_erase(&tests[i-1].rb, &testroot); deleted++; } } fprintf(stderr, "inserted %ld and deleted %ld items\n", loops, deleted); #if 1 firstrb = rb_first(&testroot); rbptr = rb_entry(firstrb, struct rbtest, rb); fprintf(stderr, "first item: %" PRId64 "\n", rbptr->data); #endif return 0; }