My Kernel v0.1.0
tree.h
1
12#pragma once
13
14#include <kernel/types.h>
15
16#include <libalgo/linked_list.h>
17#include <utils/compiler.h>
18
20#define INIT_TREE_NODE(_node) \
21 _node = ((struct tree_node){ \
22 .children = LLIST_INIT((_node).children), \
23 })
24
28typedef struct tree_node {
29 node_t this;
30 struct tree_node *parent;
33
36
41#define FOREACH_CHILDREN(_iter, _node) FOREACH_LLIST (_iter, &(_node)->children)
42
49static ALWAYS_INLINE tree_node_t *tree_node(node_t *node)
50{
51 return (tree_node_t *)node;
52}
53
59void tree_add_child(tree_node_t *node, tree_node_t *child);
60
69void tree_add_child_sorted(tree_node_t *node, tree_node_t *child, compare_t);
70
75
84tree_node_t *tree_find_child(tree_node_t *node, compare_t, const void *data);
85
91void tree_free(tree_t root, void (*free_function)(tree_node_t *));
92
void tree_add_child_sorted(tree_node_t *node, tree_node_t *child, compare_t)
Add the given node as a children of another in a sorted manner.
Definition: tree.c:10
tree_node_t * tree_find_child(tree_node_t *node, compare_t, const void *data)
Find a specific child of a node.
Definition: tree.c:29
void tree_add_child(tree_node_t *node, tree_node_t *child)
Add the given node as a children of another.
Definition: tree.c:4
tree_node_t * tree_remove(tree_node_t *node)
Remove a node from its containing tree (if any).
Definition: tree.c:17
void tree_free(tree_t root, void(*free_function)(tree_node_t *))
Free all the elements contained inside a tree.
Definition: tree.c:39
tree_node_t * tree_t
The root of a tree structure.
Definition: tree.h:35
The head of a doubly linked list.
Definition: linked_list.h:43
Intrusive doubly-linked list node.
Definition: linked_list.h:27
A single node inside a tree.
Definition: tree.h:28
struct tree_node * parent
Parent node.
Definition: tree.h:30
llist_t children
Linked list of children of this node.
Definition: tree.h:31