1 /*
2  * Copyright (c) 2025 James Roy <rruuaanng@outlook.com>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stdio.h>
8 #include <zephyr/kernel.h>
9 #include <zephyr/sys/rb.h>
10 #include <zephyr/sys/printk.h>
11 
12 struct user_data {
13 	int n;
14 	struct rbnode rbnode;
15 } data_list[5] = {{.n = 1}, {.n = 3}, {.n = 2}, {.n = 5}, {.n = 4}};
16 
user_data_lessthan_func(struct rbnode * a,struct rbnode * b)17 bool user_data_lessthan_func(struct rbnode *a, struct rbnode *b)
18 {
19 	struct user_data *n1 = CONTAINER_OF(a, struct user_data, rbnode);
20 	struct user_data *n2 = CONTAINER_OF(b, struct user_data, rbnode);
21 
22 	return n1->n < n2->n;
23 }
24 
main(void)25 int main(void)
26 {
27 	struct rbnode *n;
28 	struct rbnode *max, *min;
29 
30 	struct rbtree tree = { .lessthan_fn = user_data_lessthan_func };
31 
32 	for (int i = 0; i < ARRAY_SIZE(data_list); i++) {
33 		printk("insert n=%d rb=%p\n", data_list[i].n, &data_list[i].rbnode);
34 		rb_insert(&tree, &(data_list[i].rbnode));
35 	}
36 
37 	max = rb_get_max(&tree);
38 	min = rb_get_min(&tree);
39 	struct user_data *max_node = CONTAINER_OF(max, struct user_data, rbnode);
40 	struct user_data *min_node = CONTAINER_OF(min, struct user_data, rbnode);
41 
42 	printk("max=%d min=%d\n", max_node->n, min_node->n);
43 
44 	printk("rbtree elements:\n");
45 	RB_FOR_EACH(&tree, n) {
46 		struct user_data *ent = CONTAINER_OF(n, struct user_data, rbnode);
47 
48 		printk("n=%d\n", ent->n);
49 	}
50 
51 	printk("removed max=%d\n", max_node->n);
52 	printk("removed min=%d\n", min_node->n);
53 	rb_remove(&tree, max);
54 	rb_remove(&tree, min);
55 
56 	printk("rbtree after removal:\n");
57 	RB_FOR_EACH(&tree, n) {
58 		struct user_data *ent = CONTAINER_OF(n, struct user_data, rbnode);
59 
60 		printk("n=%d\n", ent->n);
61 	}
62 
63 	printk("Done\n");
64 	return 0;
65 }
66