| /* |
| * test-treap.c: code to exercise the svn importer's treap structure |
| */ |
| |
| #include "cache.h" |
| #include "vcs-svn/obj_pool.h" |
| #include "vcs-svn/trp.h" |
| |
| struct int_node { |
| uintmax_t n; |
| struct trp_node children; |
| }; |
| |
| obj_pool_gen(node, struct int_node, 3) |
| |
| static int node_cmp(struct int_node *a, struct int_node *b) |
| { |
| return (a->n > b->n) - (a->n < b->n); |
| } |
| |
| trp_gen(static, treap_, struct int_node, children, node, node_cmp) |
| |
| static void strtonode(struct int_node *item, const char *s) |
| { |
| char *end; |
| item->n = strtoumax(s, &end, 10); |
| if (*s == '\0' || (*end != '\n' && *end != '\0')) |
| die("invalid integer: %s", s); |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| struct strbuf sb = STRBUF_INIT; |
| struct trp_root root = { ~0 }; |
| uint32_t item; |
| |
| if (argc != 1) |
| usage("test-treap < ints"); |
| |
| while (strbuf_getline(&sb, stdin, '\n') != EOF) { |
| struct int_node *node = node_pointer(node_alloc(1)); |
| |
| item = node_offset(node); |
| strtonode(node, sb.buf); |
| node = treap_insert(&root, node_pointer(item)); |
| if (node_offset(node) != item) |
| die("inserted %"PRIu32" in place of %"PRIu32"", |
| node_offset(node), item); |
| } |
| |
| item = node_offset(treap_first(&root)); |
| while (~item) { |
| uint32_t next; |
| struct int_node *tmp = node_pointer(node_alloc(1)); |
| |
| tmp->n = node_pointer(item)->n; |
| next = node_offset(treap_next(&root, node_pointer(item))); |
| |
| treap_remove(&root, node_pointer(item)); |
| item = node_offset(treap_nsearch(&root, tmp)); |
| |
| if (item != next && (!~item || node_pointer(item)->n != tmp->n)) |
| die("found %"PRIuMAX" in place of %"PRIuMAX"", |
| ~item ? node_pointer(item)->n : ~(uintmax_t) 0, |
| ~next ? node_pointer(next)->n : ~(uintmax_t) 0); |
| printf("%"PRIuMAX"\n", tmp->n); |
| } |
| node_reset(); |
| return 0; |
| } |