t_tree_node *ft_tree_access_child(t_tree_node *tree_node, size_t i)
{
+ if (!tree_node)
+ return (NULL);
return (ft_vec_access(&tree_node->children, i));
}
void *ft_tree_access_data(t_tree_node *tree_node)
{
+ if (!tree_node)
+ return (NULL);
return (&tree_node->data);
}
t_tree_node *new_node;
t_ft_stat res;
+ if (!tree_node || !element)
+ return (invalid_input);
res = ft_vec_append_empty(&tree_node->children);
if (res != success)
return (res);
#include "ft_struct.h"
-void ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *))
+t_ft_stat ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *))
{
t_tree_node *child_to_erase;
+ if (!tree_node || i >= tree_node->children.size)
+ return (invalid_input);
child_to_erase = ft_tree_access_child(tree_node, i);
while (child_to_erase->children.size > 0)
ft_tree_erase_child(child_to_erase, 0, free_el);
if (free_el)
free_el(&child_to_erase->data);
- ft_tree_forget_child(tree_node, i);
- return ;
+ ft_vec_free(&child_to_erase->children, NULL);
+ return (ft_tree_forget_child(tree_node, i));
}
#include "ft_struct.h"
#include "libft.h"
-void ft_tree_forget_child(t_tree_node *tree_node, size_t i)
+t_ft_stat ft_tree_forget_child(t_tree_node *tree_node, size_t i)
{
- ft_vec_forget(&tree_node->children, i);
- return ;
+ if (!tree_node)
+ return (invalid_input);
+ return (ft_vec_forget(&tree_node->children, i));
}
void ft_tree_free(t_tree *tree, void (*free_el)(void *))
{
- t_tree_node *root;
-
- root = *tree;
- while (root->children.size > 0)
- ft_tree_erase_child(root, 0, free_el);
+ if (!tree)
+ return ;
+ while (tree->children.size > 0)
+ ft_tree_erase_child(tree, 0, free_el);
if (free_el)
- free_el(&root->data);
- ft_vec_free(&root->children, NULL);
+ free_el(&tree->data);
+ ft_vec_free(&tree->children, NULL);
return ;
}
t_ft_stat ft_tree_init(t_tree *tree, size_t el_size)
{
- t_tree_node *root;
-
- root = malloc(sizeof(t_tree_node) + el_size);
- if (!root)
- return (alloc_fail);
- root->parent = NULL;
- *tree = root;
- return (ft_vec_init(&root->children, sizeof(t_tree_node) + el_size));
+ if (!tree || el_size == 0)
+ return (invalid_input);
+ tree->parent = NULL;
+ ft_bzero(&tree->data, el_size);
+ return (ft_vec_init(&tree->children, sizeof(t_tree_node) + el_size));
}
#include "ft_struct.h"
#include "libft.h"
-void ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *))
+t_ft_stat ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *))
{
t_tree_node *child;
t_ft_stat res;
+ size_t children_relocated_count;
child = ft_tree_access_child(tree_node, i);
if (!child)
- return ;
- res = ft_vec_insert_range(&tree_node->children, child->children.vec, child->children.size, i);
+ return (invalid_input);
+ children_relocated_count = child->children.size;
+ res = ft_vec_insert_range(&tree_node->children, child->children.vec, children_relocated_count, i);
if (res != success)
- return ;
- i += child->children.size;
+ return (alloc_fail);
+ i += children_relocated_count;
+ child = ft_tree_access_child(tree_node, i);
if (free_el)
free_el(&tree_node->data);
- ft_memcpy(&tree_node->data, &child->data, tree_node->children.size - sizeof(t_tree_node));
+ ft_memcpy(&tree_node->data, &child->data, tree_node->children.el_size - sizeof(t_tree_node));
ft_vec_free(&child->children, NULL);
ft_vec_forget(&tree_node->children, i);
- return ;
+ return (success);
}
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */
-/* Updated: 2025/07/31 08:09:13 by ljiriste ### ########.fr */
+/* Updated: 2025/07/31 11:58:41 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
char data[];
};
-typedef t_tree_node *t_tree;
+typedef t_tree_node t_tree;
t_ft_stat ft_tree_init(t_tree *tree, size_t el_size);
t_ft_stat ft_tree_append_child(t_tree_node *tree_node, void *element);
t_tree_node *ft_tree_access_child(t_tree_node *tree_node, size_t i);
void *ft_tree_access_data(t_tree_node *tree_node);
-void ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *));
-void ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *));
-void ft_tree_forget_child(t_tree_node *tree_node, size_t i);
+t_ft_stat ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *));
+t_ft_stat ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *));
+t_ft_stat ft_tree_forget_child(t_tree_node *tree_node, size_t i);
void ft_tree_free(t_tree *tree, void (*free_el)(void *));
# ifdef __cplusplus