From: Lukas Jiriste Date: Sun, 10 Dec 2023 14:01:59 +0000 (+0100) Subject: Improve ft_vec_erase and ft_vec_free X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=0f2a329d9d76ddc77d22899ab8badfedadc78527;p=Libft.git Improve ft_vec_erase and ft_vec_free 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). --- diff --git a/ft_vec/ft_vec_erase.c b/ft_vec/ft_vec_erase.c index b8a92cc..6c1cfc8 100644 --- a/ft_vec/ft_vec_erase.c +++ b/ft_vec/ft_vec_erase.c @@ -6,19 +6,21 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); } diff --git a/ft_vec/ft_vec_free.c b/ft_vec/ft_vec_free.c index 73e6aad..d39f0ba 100644 --- a/ft_vec/ft_vec_free.c +++ b/ft_vec/ft_vec_free.c @@ -6,17 +6,28 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 -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 ; diff --git a/inc/ft_vec.h b/inc/ft_vec.h index 33733e4..830b210 100644 --- a/inc/ft_vec.h +++ b/inc/ft_vec.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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);