xref: /kvmtool/util/rbtree-interval.c (revision a83f8ed142f0df82e233a08d450bb80d002c399a)
1e358b4fbSSasha Levin #include <kvm/rbtree-interval.h>
2e358b4fbSSasha Levin #include <stddef.h>
3495fbd4eSSasha Levin #include <errno.h>
4e358b4fbSSasha Levin 
rb_int_search_single(struct rb_root * root,u64 point)5e358b4fbSSasha Levin struct rb_int_node *rb_int_search_single(struct rb_root *root, u64 point)
6e358b4fbSSasha Levin {
7e358b4fbSSasha Levin 	struct rb_node *node = root->rb_node;
8e358b4fbSSasha Levin 
9e358b4fbSSasha Levin 	while (node) {
10e358b4fbSSasha Levin 		struct rb_int_node *cur = rb_int(node);
11e358b4fbSSasha Levin 
12ffc83de3SMichel Lespinasse 		if (point < cur->low)
13e358b4fbSSasha Levin 			node = node->rb_left;
14ffc83de3SMichel Lespinasse 		else if (cur->high <= point)
15e358b4fbSSasha Levin 			node = node->rb_right;
16ffc83de3SMichel Lespinasse 		else
17ffc83de3SMichel Lespinasse 			return cur;
18e358b4fbSSasha Levin 	}
19e358b4fbSSasha Levin 
20e358b4fbSSasha Levin 	return NULL;
21e358b4fbSSasha Levin }
22e358b4fbSSasha Levin 
rb_int_search_range(struct rb_root * root,u64 low,u64 high)23e358b4fbSSasha Levin struct rb_int_node *rb_int_search_range(struct rb_root *root, u64 low, u64 high)
24e358b4fbSSasha Levin {
25e358b4fbSSasha Levin 	struct rb_int_node *range;
26e358b4fbSSasha Levin 
27e358b4fbSSasha Levin 	range = rb_int_search_single(root, low);
28e358b4fbSSasha Levin 	if (range == NULL)
29e358b4fbSSasha Levin 		return NULL;
30e358b4fbSSasha Levin 
31e358b4fbSSasha Levin 	/* We simply verify that 'high' is smaller than the end of the range where 'low' is located */
32e358b4fbSSasha Levin 	if (range->high < high)
33e358b4fbSSasha Levin 		return NULL;
34e358b4fbSSasha Levin 
35e358b4fbSSasha Levin 	return range;
36e358b4fbSSasha Levin }
37e358b4fbSSasha Levin 
rb_int_insert(struct rb_root * root,struct rb_int_node * i_node)38e358b4fbSSasha Levin int rb_int_insert(struct rb_root *root, struct rb_int_node *i_node)
39e358b4fbSSasha Levin {
4086824900SIngo Molnar 	struct rb_node **node = &root->rb_node, *parent = NULL;
41e358b4fbSSasha Levin 
42e358b4fbSSasha Levin 	while (*node) {
433e64a4a4SMichel Lespinasse 		struct rb_int_node *cur = rb_int(*node);
44e358b4fbSSasha Levin 
45e358b4fbSSasha Levin 		parent = *node;
463e64a4a4SMichel Lespinasse 		if (i_node->high <= cur->low)
473e64a4a4SMichel Lespinasse 			node = &cur->node.rb_left;
483e64a4a4SMichel Lespinasse 		else if (cur->high <= i_node->low)
493e64a4a4SMichel Lespinasse 			node = &cur->node.rb_right;
50e358b4fbSSasha Levin 		else
51495fbd4eSSasha Levin 			return -EEXIST;
52e358b4fbSSasha Levin 	}
53e358b4fbSSasha Levin 
54e358b4fbSSasha Levin 	rb_link_node(&i_node->node, parent, node);
55*a83f8ed1SMichel Lespinasse 	rb_insert_color(&i_node->node, root);
56e358b4fbSSasha Levin 
57495fbd4eSSasha Levin 	return 0;
58e358b4fbSSasha Levin }
59