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