37#ifndef ZEPHYR_INCLUDE_SYS_RB_H_
38#define ZEPHYR_INCLUDE_SYS_RB_H_
49#define alloca __builtin_alloca
60 struct rbnode *children[2];
69#define Z_TBITS(t) ((sizeof(t)) < 8 ? 2 : 3)
70#define Z_PBITS(t) (8 * sizeof(t))
71#define Z_MAX_RBTREE_DEPTH (2 * (Z_PBITS(int *) - Z_TBITS(int *) - 1) + 1)
98#ifdef CONFIG_MISRA_SANE
99 struct rbnode *iter_stack[Z_MAX_RBTREE_DEPTH];
100 unsigned char iter_left[Z_MAX_RBTREE_DEPTH];
113int z_rb_is_black(
struct rbnode *node);
114#ifndef CONFIG_MISRA_SANE
134 return z_rb_get_minmax(tree, 0U);
142 return z_rb_get_minmax(tree, 1U);
156#ifndef CONFIG_MISRA_SANE
168 z_rb_walk(tree->
root, visit_fn, cookie);
178#ifdef CONFIG_MISRA_SANE
179#define _RB_FOREACH_INIT(tree, node) { \
180 .stack = &(tree)->iter_stack[0], \
181 .is_left = &(tree)->iter_left[0], \
185#define _RB_FOREACH_INIT(tree, node) { \
186 .stack = (struct rbnode **) \
187 alloca((tree)->max_depth * sizeof(struct rbnode *)), \
188 .is_left = (uint8_t *)alloca((tree)->max_depth * sizeof(uint8_t)),\
193struct rbnode *z_rb_foreach_next(
struct rbtree *tree,
struct _rb_foreach *f);
216#define RB_FOR_EACH(tree, node) \
217 for (struct _rb_foreach __f = _RB_FOREACH_INIT(tree, node); \
218 ((node) = z_rb_foreach_next((tree), &__f)); \
231#define RB_FOR_EACH_CONTAINER(tree, node, field) \
232 for (struct _rb_foreach __f = _RB_FOREACH_INIT(tree, node); \
233 ({struct rbnode *n = z_rb_foreach_next(tree, &__f); \
234 (node) = n ? CONTAINER_OF(n, __typeof__(*(node)), \
235 field) : NULL; (node); }) != NULL; \
static struct rbnode * rb_get_max(struct rbtree *tree)
Returns the highest-sorted member of the tree.
Definition: rb.h:140
bool(* rb_lessthan_t)(struct rbnode *a, struct rbnode *b)
Red/black tree comparison predicate.
Definition: rb.h:86
void(* rb_visit_t)(struct rbnode *node, void *cookie)
Prototype for node visitor callback.
Definition: rb.h:110
static struct rbnode * rb_get_min(struct rbtree *tree)
Returns the lowest-sorted member of the tree.
Definition: rb.h:132
void rb_insert(struct rbtree *tree, struct rbnode *node)
Insert node into tree.
static void rb_walk(struct rbtree *tree, rb_visit_t visit_fn, void *cookie)
Walk/enumerate a rbtree.
Definition: rb.h:165
void rb_remove(struct rbtree *tree, struct rbnode *node)
Remove node from tree.
bool rb_contains(struct rbtree *tree, struct rbnode *node)
Returns true if the given node is part of the tree.
#define bool
Definition: stdbool.h:13
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
Balanced red/black tree node structure.
Definition: rb.h:58
Balanced red/black tree structure.
Definition: rb.h:91
struct rbnode * root
Root node of the tree.
Definition: rb.h:93
rb_lessthan_t lessthan_fn
Comparison function for nodes in the tree.
Definition: rb.h:95