blob: 478b42367cf942889776e581f86936e2c758043f [file] [log] [blame]
/*
* Copyright (c) 2025 James Roy <rruuaanng@outlook.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/rb.h>
#include <zephyr/sys/printk.h>
struct user_data {
int n;
struct rbnode rbnode;
} data_list[5] = {{.n = 1}, {.n = 3}, {.n = 2}, {.n = 5}, {.n = 4}};
bool user_data_lessthan_func(struct rbnode *a, struct rbnode *b)
{
struct user_data *n1 = CONTAINER_OF(a, struct user_data, rbnode);
struct user_data *n2 = CONTAINER_OF(b, struct user_data, rbnode);
return n1->n < n2->n;
}
int main(void)
{
struct rbnode *n;
struct rbnode *max, *min;
struct rbtree tree = { .lessthan_fn = user_data_lessthan_func };
for (int i = 0; i < ARRAY_SIZE(data_list); i++) {
printk("insert n=%d rb=%p\n", data_list[i].n, &data_list[i].rbnode);
rb_insert(&tree, &(data_list[i].rbnode));
}
max = rb_get_max(&tree);
min = rb_get_min(&tree);
struct user_data *max_node = CONTAINER_OF(max, struct user_data, rbnode);
struct user_data *min_node = CONTAINER_OF(min, struct user_data, rbnode);
printk("max=%d min=%d\n", max_node->n, min_node->n);
printk("rbtree elements:\n");
RB_FOR_EACH(&tree, n) {
struct user_data *ent = CONTAINER_OF(n, struct user_data, rbnode);
printk("n=%d\n", ent->n);
}
printk("removed max=%d\n", max_node->n);
printk("removed min=%d\n", min_node->n);
rb_remove(&tree, max);
rb_remove(&tree, min);
printk("rbtree after removal:\n");
RB_FOR_EACH(&tree, n) {
struct user_data *ent = CONTAINER_OF(n, struct user_data, rbnode);
printk("n=%d\n", ent->n);
}
printk("Done\n");
return 0;
}