Improve ft_vec_erase and ft_vec_free
authorLukas Jiriste <ljiriste@student.42prague.com>
Sun, 10 Dec 2023 14:01:59 +0000 (15:01 +0100)
committerLukas Jiriste <ljiriste@student.42prague.com>
Sun, 10 Dec 2023 14:01:59 +0000 (15:01 +0100)
Add function for freeing element to ft_vec_erase and ft_vec_free for the
ability to handle advanced elements (elements which may point to heap).

ft_vec/ft_vec_erase.c
ft_vec/ft_vec_free.c
inc/ft_vec.h

index b8a92cc2f9f5e578b4eae829a477614236441927..6c1cfc834085d03aec6d70d568bd3a8d791233ec 100644 (file)
@@ -6,19 +6,21 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/12/09 17:10:39 by ljiriste          #+#    #+#             */
-/*   Updated: 2023/12/09 18:23:06 by ljiriste         ###   ########.fr       */
+/*   Updated: 2023/12/10 15:01:35 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "ft_vec.h"
 #include "libft.h"
 
-t_vec_stat     ft_vec_erase(t_vec *vec, size_t index)
+t_vec_stat     ft_vec_erase(t_vec *vec, size_t index, void (*free_el)(void *))
 {
        if (!vec || index == SIZE_MAX)
                return (invalid_input);
-       ft_memmove(vec->vec + index, vec->vec + vec->el_size * (index + 1),
-                       vec->el_size * (vec->size - index - 1));
        --vec->size;
+       ft_memmove(vec->vec + index, vec->vec + vec->el_size * (index + 1),
+                       vec->el_size * (vec->size - index));
+       if (free_el)
+               free_el(vec->vec + vec->size * vec->el_size);
        return (success);
 }
index 73e6aadaf0ec7b7724d9664077967bf11dc14b67..d39f0baa7f712fb3b2f5dbefdd83de660972e696 100644 (file)
@@ -6,17 +6,28 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/12/09 17:37:13 by ljiriste          #+#    #+#             */
-/*   Updated: 2023/12/09 17:49:52 by ljiriste         ###   ########.fr       */
+/*   Updated: 2023/12/10 11:52:49 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "ft_vec.h"
 #include <stdlib.h>
 
-void   ft_vec_free(t_vec *vec)
+void   ft_vec_free(t_vec *vec, void (*free_el)(void *))
 {
+       size_t  i;
+
        if (!vec)
                return ;
+       i = 0;
+       if (free_el)
+       {
+               while (i < vec->size)
+               {
+                       free_el(vec->vec + i * vec->el_size);
+                       ++i;
+               }
+       }
        free(vec->vec);
        ft_vec_init(vec, vec->el_size);
        return ;
index 33733e499b7b75553660387cfe44f705c10eb991..830b210bb85b9a562200ee9f1f6a73e5a6c5a631 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/12/09 13:58:15 by ljiriste          #+#    #+#             */
-/*   Updated: 2023/12/09 17:36:45 by ljiriste         ###   ########.fr       */
+/*   Updated: 2023/12/10 11:54:16 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -37,12 +37,12 @@ typedef struct s_vec
 }                      t_vec;
 
 t_vec_stat     ft_vec_init(t_vec *vec, size_t  el_size);
-void           ft_vec_free(t_vec *vec);
+void           ft_vec_free(t_vec *vec, void (*free_el)(void *));
 
 t_vec_stat     ft_vec_reserve(t_vec *vec, size_t capacity);
 t_vec_stat     ft_vec_append(t_vec *vec, const void *element);
 t_vec_stat     ft_vec_insert(t_vec *vec, const void *element, size_t index);
-t_vec_stat     ft_vec_erase(t_vec *vec, size_t index);
+t_vec_stat     ft_vec_erase(t_vec *vec, size_t index, void (*free_el)(void *));
 
 void           *ft_vec_access(t_vec *vec, size_t index);