From: Lukáš Jiřiště Date: Thu, 31 Jul 2025 12:12:53 +0000 (+0200) Subject: Revert back to using separate tree and node X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=0352103c544c87c5a8a046c92a41c2e00fee268d;p=Libft.git Revert back to using separate tree and node Because the node uses flexible array member it should not be instantiated on stack. Hence a separate type for t_tree is needed so that user may use tree on stack (as it is convenient). --- diff --git a/Makefile b/Makefile index e2964d5..e900d0a 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ SRCstruct:= ft_stack_free.c \ ft_stack_push.c \ ft_stack_top.c \ ft_tree_init.c \ + ft_tree_access_root.c \ ft_tree_append_child.c \ ft_tree_access_child.c \ ft_tree_access_data.c \ diff --git a/ft_struct/ft_tree_access_root.c b/ft_struct/ft_tree_access_root.c new file mode 100644 index 0000000..e3c701a --- /dev/null +++ b/ft_struct/ft_tree_access_root.c @@ -0,0 +1,8 @@ +#include "ft_struct.h" + +t_tree_node *ft_tree_access_root(t_tree *tree) +{ + if (!tree) + return (NULL); + return (*tree); +} diff --git a/ft_struct/ft_tree_free.c b/ft_struct/ft_tree_free.c index 2de8e2b..b80dff4 100644 --- a/ft_struct/ft_tree_free.c +++ b/ft_struct/ft_tree_free.c @@ -1,14 +1,20 @@ #include "ft_struct.h" #include "libft.h" +#include void ft_tree_free(t_tree *tree, void (*free_el)(void *)) { - if (!tree) + t_tree_node *root; + + if (!tree || !*tree) return ; - while (tree->children.size > 0) - ft_tree_erase_subtree(tree, 0, free_el); + root = ft_tree_access_root(tree); + while (root->children.size > 0) + ft_tree_erase_subtree(root, 0, free_el); if (free_el) - free_el(&tree->data); - ft_vec_free(&tree->children, NULL); + free_el(&root->data); + ft_vec_free(&root->children, NULL); + free(root); + *tree = NULL; return ; } diff --git a/ft_struct/ft_tree_init.c b/ft_struct/ft_tree_init.c index 60b09b6..b83fae8 100644 --- a/ft_struct/ft_tree_init.c +++ b/ft_struct/ft_tree_init.c @@ -2,11 +2,17 @@ #include "libft.h" #include -t_ft_stat ft_tree_init(t_tree *tree, size_t el_size) +t_ft_stat ft_tree_init(t_tree *tree, void *root_element, size_t el_size) { - if (!tree || el_size == 0) + t_tree_node *root; + + if (!tree || !root_element || 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)); + root = malloc(sizeof(t_tree_node) + el_size); + if (!root) + return (alloc_fail); + *tree = root; + root->parent = NULL; + ft_memcpy(&root->data, root_element, el_size); + return (ft_vec_init(&root->children, sizeof(t_tree_node) + el_size)); } diff --git a/inc/ft_struct.h b/inc/ft_struct.h index 23ff7a3..bcebe0b 100644 --- a/inc/ft_struct.h +++ b/inc/ft_struct.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */ -/* Updated: 2025/07/31 13:25:53 by ljiriste ### ########.fr */ +/* Updated: 2025/07/31 14:07:12 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,9 +47,10 @@ struct s_tree_node 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_init(t_tree *tree, void *root_element, size_t el_size); +t_tree_node *ft_tree_access_root(t_tree *tree); 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);