Harden ft_tree and change it a little
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 31 Jul 2025 10:11:55 +0000 (12:11 +0200)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 31 Jul 2025 10:11:55 +0000 (12:11 +0200)
The change is to return t_tree from pointer to t_tree_node to just
t_tree_node. I don't yet have much grasp on ergonomics of this but I
think this is the better choice.

ft_struct/ft_tree_access_child.c
ft_struct/ft_tree_access_data.c
ft_struct/ft_tree_append_child.c
ft_struct/ft_tree_erase_child.c
ft_struct/ft_tree_forget_child.c
ft_struct/ft_tree_free.c
ft_struct/ft_tree_init.c
ft_struct/ft_tree_replace_with_child.c
inc/ft_struct.h

index 50bc215064d0685ea32f4617b752ef3f2538e8f4..05c23082571f6c0b847945ec90a01c5f86a61a30 100644 (file)
@@ -3,5 +3,7 @@
 
 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));
 }
index 2eae4ca8139ef6d67b586674d1b3f9f1aaafe365..50a8983e09862dd1600b362c01370ac73bb24d37 100644 (file)
@@ -2,5 +2,7 @@
 
 void   *ft_tree_access_data(t_tree_node *tree_node)
 {
+       if (!tree_node)
+               return (NULL);
        return (&tree_node->data);
 }
index 81884a6889818ed32a12e267e1cfe6592ff35283..2a5d9efbfae1745cb28527e881418336baa06181 100644 (file)
@@ -6,6 +6,8 @@ t_ft_stat       ft_tree_append_child(t_tree_node *tree_node, void *element)
        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);
index 99c2cf92232513e38818c030c2d2e7504564436c..11514515a5e433969e5a9982b5e9608e78e30e17 100644 (file)
@@ -1,14 +1,16 @@
 #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));
 }
index b74e8e1507eea84ea801238309b7cc40fd360f4e..30c47c89ad4c63669e1b29a384368f879fc1086e 100644 (file)
@@ -1,8 +1,9 @@
 #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));
 }
index 16bc1fe03a9129b341769eadfb96a45b0f873c81..74e0b5b77320f1b470670a771981452e40341484 100644 (file)
@@ -3,13 +3,12 @@
 
 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 ;
 }
index 251daa388ef33880fe3d4533f28b183caf6f86b3..60b09b60fb8c0469d784b2bd1de67145816e82cd 100644 (file)
@@ -4,12 +4,9 @@
 
 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));
 }
index 5eaf5e81bea8b3212df7c649c383944b8e611c89..7296ddcd82ad72888d79c593344705fbce863a10 100644 (file)
@@ -1,22 +1,25 @@
 #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);
 }
index 648ff4cc367743417f72d40ec464e2ed5f41848a..151bce444105302a9aea25aba9a213e38d122ee7 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -47,15 +47,15 @@ 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_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