int main(int argc, const char * argv[]) { INT_TREE tree = (INT_TREE) malloc(sizeof(struct int_tree)); srand((unsigned)time(NULL)); for(int i = 0; i < 10; i++) { int low = rand() % 30; int high = rand() % 30; if(low > high) { int tmp = low; low = high; high = tmp; } INT_NODE node = int_new_node(low, high); interval_insert(tree, node); } print_interval_tree(tree, tree -> root); INT i = (INT) malloc(sizeof(struct interval)); i -> high = 18; i -> low = 15; INT_NODE node = interval_search(tree, i); printf("selected interval is: [%d, %d], max: %d, color %s", node -> interval -> low, node -> interval -> high, node -> max , node -> color == RED?"red":"black"); printf("\n"); return 0; }
/* * search the interval tree for an nid within a range * * \param nid nid to search for */ struct lu_nid_range *range_search(lnet_nid_t nid) { struct lu_nid_range *ret = NULL; struct interval_node_extent ext = { .start = nid, .end = nid }; interval_search(range_interval_root, &ext, range_cb, &ret); return ret; }
static int it_test_search(struct interval_node *root) { struct it_node *n; struct interval_node_extent ext; int times = 10, i, err = 0; while (times--) { it_test_clear(); ext.start = (random() % max_count) & ALIGN_MASK; ext.end = random() % (max_count - ext.start + 2) + ext.start; ext.end &= ALIGN_MASK; if (ext.end > max_count) ext.end = max_count; dprintf("\n\nSearching the node overlapped "__S" ..\n", __F(&ext)); interval_search(root, &ext, cb, NULL); dprintf("\nverifing ..."); /* verify */ for (i = 0; i < it_count; i++) { n = &it_array[i]; if (n->valid == 0) continue; if (extent_overlapped(&ext, &n->node.in_extent) && n->hit == 0) error("node "__S" overlaps" __S"," "but never to be hit.\n", __F(&n->node.in_extent), __F(&ext)); if (!extent_overlapped(&ext, &n->node.in_extent) && n->hit) error("node "__S" overlaps" __S", but hit.\n", __F(&n->node.in_extent), __F(&ext)); } if (err) error("search error\n"); dprintf("ok.\n"); } return 0; }