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