Files
MentOS/mentos/inc/libc/tree.h
T
Luigi Capogrosso 7d9085fecf Finish v0.3.0
2019-05-08 17:07:11 +02:00

78 lines
2.4 KiB
C

/// MentOS, The Mentoring Operating system project
/// @file tree.h
/// @brief General-purpose tree implementation.
/// @copyright (c) 2019 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "list.h"
/// @brief A node of the tree.
typedef struct tree_node_t {
/// The value stored by the node.
void *value;
/// Pointer to the list of childrens.
list_t *children;
/// Pointer to the parent.
struct tree_node_t *parent;
} tree_node_t;
/// @brief Represents the tree.
typedef struct tree_t {
/// Number of nodes inside the tree.
size_t nodes;
/// Pointer to the root of the tree.
tree_node_t *root;
} tree_t;
typedef uint8_t (*tree_comparator_t)(void *, void *);
/// @brief Creates a new tree.
tree_t *tree_create();
/// @brief Sets the root node for a new tree.
tree_node_t *tree_set_root(tree_t *tree, void *value);
/// @brief Free the contents of a node and its children,
/// but not the nodes themselves.
void tree_node_destroy(tree_node_t *node);
/// @brief Free the contents of a tree, but not the nodes.
void tree_destroy(tree_t *tree);
/// @brief Free all of the nodes in a tree, but not their contents.
void tree_free(tree_t *tree);
/// @brief Create a new tree node pointing to the given value.
tree_node_t *tree_node_create(void *value);
/// @brief Insert a node as a child of parent.
void tree_node_insert_child_node(tree_t *tree, tree_node_t *parent,
tree_node_t *node);
/// @brief Insert a (fresh) node as a child of parent.
tree_node_t *tree_node_insert_child(tree_t *tree, tree_node_t *parent,
void *value);
/// @brief Recursive node part of tree_find_parent.
tree_node_t *tree_node_find_parent(tree_node_t *haystack, tree_node_t *needle);
/// @brief Remove a node when we know its parent; update node counts for the
/// tree.
void tree_node_parent_remove(tree_t *tree, tree_node_t *parent,
tree_node_t *node);
/// @brief Remove an entire branch given its root.
void tree_node_remove(tree_t *tree, tree_node_t *node);
/// @brief Remove this node and move its children into its parent's
/// list of children.
void tree_remove(tree_t *tree, tree_node_t *node);
// TODO: doxygen comment.
void tree_break_off(tree_t *tree, tree_node_t *node);
/// @brief Searches the given value inside the tree.
tree_node_t *tree_find(tree_t *tree, void *value, tree_comparator_t comparator);