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