| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #pragma once |
| 4 | |
| 5 | #include <mos/lib/structures/list.hpp> |
| 6 | #include <mos/moslib_global.hpp> |
| 7 | #include <mos/types.hpp> |
| 8 | |
| 9 | typedef struct tree_node tree_node_t; |
| 10 | |
| 11 | typedef struct tree_node |
| 12 | { |
| 13 | as_linked_list; |
| 14 | tree_node_t *parent; |
| 15 | list_head children; |
| 16 | } tree_node_t; |
| 17 | |
| 18 | /** |
| 19 | * @brief Embed a tree node into a struct |
| 20 | */ |
| 21 | #define as_tree tree_node_t tree_node |
| 22 | |
| 23 | typedef const struct |
| 24 | { |
| 25 | void (*get_node_name)(const tree_node_t *node, char **name, size_t *name_len); |
| 26 | } tree_op_t; |
| 27 | |
| 28 | #define tree_entry(node, type) container_of((node), type, tree_node) |
| 29 | #define tree_node(element) (&((element)->tree_node)) |
| 30 | #define tree_parent(node, type) (tree_entry(tree_node(node)->parent, type)) |
| 31 | |
| 32 | #define tree_children_list(node) (&((node)->tree_node.children)) |
| 33 | #define tree_child_entry(node, type) container_of(container_of((node), tree_node_t, list_node), type, tree_node) |
| 34 | #define tree_child_node(node) (&((node)->tree_node.list_node)) |
| 35 | |
| 36 | #define tree_foreach_child(t, v, h) \ |
| 37 | for (auto v = tree_child_entry(tree_children_list(h)->next, t); tree_child_node(v) != tree_children_list(h); v = tree_child_entry(tree_child_node(v)->next, t)) |
| 38 | |
| 39 | MOSAPI void tree_node_init(tree_node_t *node); |
| 40 | MOSAPI void tree_add_child(tree_node_t *parent, tree_node_t *child); |
| 41 | |