From: Lukas Jiriste Date: Mon, 11 Dec 2023 09:27:36 +0000 (+0100) Subject: Add some t_vec functions and change name X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=ba8e318aa514ab4cee5f3f67b99c5b43faca6efc;p=Libft.git Add some t_vec functions and change name Add functions for inserting and erasing multiple elements. Rename dir ft_vec to ft_arr and rename ft_vec.h to ft_arr.h for future implementation of other array structures (matrices). --- diff --git a/Makefile b/Makefile index 035bc78..7bd2475 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ RM := rm -f INCDIR = ./inc INCLUDE := $(addprefix -I, $(INCDIR)) -SRCDIR := ft_gen ft_math ft_str ft_mem ft_io ft_check ft_conv ft_lst ft_vec +SRCDIR := ft_gen ft_math ft_str ft_mem ft_io ft_check ft_conv ft_lst ft_arr SRCgen := ft_swap.c \ @@ -85,7 +85,7 @@ SRClst := ft_lst_reverse.c \ ft_lst_sort.c \ ft_lst_sorted_insert.c \ -SRCvec := ft_vec_init.c \ +SRCarr := ft_vec_init.c \ ft_vec_reserve.c \ ft_vec_insert.c \ ft_vec_append.c \ diff --git a/ft_vec/ft_vec_access.c b/ft_arr/ft_vec_access.c similarity index 92% rename from ft_vec/ft_vec_access.c rename to ft_arr/ft_vec_access.c index d47d979..e412129 100644 --- a/ft_vec/ft_vec_access.c +++ b/ft_arr/ft_vec_access.c @@ -6,11 +6,11 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 17:14:49 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 17:25:17 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:21:49 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include void *ft_vec_access(t_vec *vec, size_t index) diff --git a/ft_vec/ft_vec_append.c b/ft_arr/ft_vec_append.c similarity index 71% rename from ft_vec/ft_vec_append.c rename to ft_arr/ft_vec_append.c index f05465f..fb5e0da 100644 --- a/ft_vec/ft_vec_append.c +++ b/ft_arr/ft_vec_append.c @@ -6,15 +6,18 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 16:39:20 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 17:10:27 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:21:49 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" -t_vec_stat ft_vec_append(t_vec *vec, const void *element) +t_arr_stat ft_vec_append(t_vec *vec, const void *element) { - if (!vec) - return (invalid_input); - return (ft_vec_insert(vec, element, vec->size)); + return (ft_vec_append_range(vec, element, 1)); +} + +t_arr_stat ft_vec_append_range(t_vec *vec, const void *element, size_t count) +{ + return (ft_vec_insert_range(vec, element, count, vec->size)); } diff --git a/ft_vec/ft_vec_erase.c b/ft_arr/ft_vec_erase.c similarity index 64% rename from ft_vec/ft_vec_erase.c rename to ft_arr/ft_vec_erase.c index 6c1cfc8..07f67c6 100644 --- a/ft_vec/ft_vec_erase.c +++ b/ft_arr/ft_vec_erase.c @@ -6,21 +6,35 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 17:10:39 by ljiriste #+# #+# */ -/* Updated: 2023/12/10 15:01:35 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:24:50 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include "libft.h" -t_vec_stat ft_vec_erase(t_vec *vec, size_t index, void (*free_el)(void *)) +t_arr_stat ft_vec_erase(t_vec *vec, size_t index, void (*free_el)(void *)) { - if (!vec || index == SIZE_MAX) + return (ft_vec_erase_range(vec, 1, index, free_el)); +} + +t_arr_stat ft_vec_erase_range(t_vec *vec, size_t count, size_t index, void (*free_el)(void *)) +{ + void *p; + + if (!vec || index + count > vec->size || index > SIZE_MAX - count) return (invalid_input); - --vec->size; - ft_memmove(vec->vec + index, vec->vec + vec->el_size * (index + 1), + vec->size -= count; + ft_memmove(vec->vec + index, vec->vec + vec->el_size * (index + count), vec->el_size * (vec->size - index)); if (free_el) - free_el(vec->vec + vec->size * vec->el_size); + { + p = vec->vec + vec->size * vec->el_size; + while (p < vec->vec + (vec->size + count) * vec->el_size) + { + free_el(p); + p += vec->el_size; + } + } return (success); } diff --git a/ft_vec/ft_vec_free.c b/ft_arr/ft_vec_free.c similarity index 92% rename from ft_vec/ft_vec_free.c rename to ft_arr/ft_vec_free.c index d39f0ba..632d042 100644 --- a/ft_vec/ft_vec_free.c +++ b/ft_arr/ft_vec_free.c @@ -6,11 +6,11 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 17:37:13 by ljiriste #+# #+# */ -/* Updated: 2023/12/10 11:52:49 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:21:49 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include void ft_vec_free(t_vec *vec, void (*free_el)(void *)) diff --git a/ft_vec/ft_vec_init.c b/ft_arr/ft_vec_init.c similarity index 88% rename from ft_vec/ft_vec_init.c rename to ft_arr/ft_vec_init.c index 5731308..ca58f03 100644 --- a/ft_vec/ft_vec_init.c +++ b/ft_arr/ft_vec_init.c @@ -6,15 +6,15 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 16:04:26 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 17:49:19 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:21:49 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include "libft.h" #include -t_vec_stat ft_vec_init(t_vec *vec, size_t el_size) +t_arr_stat ft_vec_init(t_vec *vec, size_t el_size) { if (el_size == 0 || !vec) return (invalid_input); diff --git a/ft_vec/ft_vec_insert.c b/ft_arr/ft_vec_insert.c similarity index 73% rename from ft_vec/ft_vec_insert.c rename to ft_arr/ft_vec_insert.c index 39efe99..86a7ca6 100644 --- a/ft_vec/ft_vec_insert.c +++ b/ft_arr/ft_vec_insert.c @@ -6,14 +6,14 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 16:50:57 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 18:19:13 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:23:44 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include "libft.h" -static t_vec_stat ft_vec_enlarge(t_vec *vec) +static t_arr_stat ft_vec_enlarge(t_vec *vec) { if (vec->capacity == SIZE_MAX) return (alloc_fail); @@ -35,19 +35,26 @@ static t_vec_stat ft_vec_enlarge(t_vec *vec) return (success); } -t_vec_stat ft_vec_insert(t_vec *vec, void const *element, size_t index) +t_arr_stat ft_vec_insert(t_vec *vec, void const *element, size_t index) { - if (!element || !vec || index == SIZE_MAX) + return (ft_vec_insert_range(vec, element, 1, index)); +} + +t_arr_stat ft_vec_insert_range(t_vec *vec, void const *element, size_t count, size_t index) +{ + if (count == 0) + return (success); + if (!element || !vec || index > SIZE_MAX - count) return (invalid_input); - while (vec->size == vec->capacity || index >= vec->capacity) + while (vec->size == vec->capacity || index + count > vec->capacity) { if (ft_vec_enlarge(vec)) return (alloc_fail); } if (index < vec->size) - ft_memmove(vec->vec + vec->el_size * (index + 1), + ft_memmove(vec->vec + vec->el_size * (index + count), vec->vec + vec->el_size * index, vec->el_size * (vec->size - index)); - ft_memcpy(vec->vec + vec->el_size * index, element, vec->el_size); + ft_memcpy(vec->vec + vec->el_size * index, element, vec->el_size * count); if (index > vec->size) vec->size = index; ++vec->size; diff --git a/ft_vec/ft_vec_reserve.c b/ft_arr/ft_vec_reserve.c similarity index 89% rename from ft_vec/ft_vec_reserve.c rename to ft_arr/ft_vec_reserve.c index 6db8ce7..1160785 100644 --- a/ft_vec/ft_vec_reserve.c +++ b/ft_arr/ft_vec_reserve.c @@ -6,15 +6,15 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 16:17:46 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 18:11:38 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:21:49 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_vec.h" +#include "ft_arr.h" #include "libft.h" #include -t_vec_stat ft_vec_reserve(t_vec *vec, size_t capacity) +t_arr_stat ft_vec_reserve(t_vec *vec, size_t capacity) { void *tmp; diff --git a/inc/ft_vec.h b/inc/ft_arr.h similarity index 61% rename from inc/ft_vec.h rename to inc/ft_arr.h index 830b210..b2478ce 100644 --- a/inc/ft_vec.h +++ b/inc/ft_arr.h @@ -1,17 +1,17 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_vec.h :+: :+: :+: */ +/* ft_arr.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 13:58:15 by ljiriste #+# #+# */ -/* Updated: 2023/12/10 11:54:16 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:22:24 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef FT_VEC_H -# define FT_VEC_H +#ifndef FT_ARR_H +# define FT_ARR_H # include @@ -19,13 +19,13 @@ # define V_DEFAULT_CAPACITY 8 # endif -typedef enum e_vec_stat +typedef enum e_arr_stat { success, alloc_fail, invalid_size, invalid_input, -} t_vec_stat; +} t_arr_stat; // It should be possible to remove el_size with the use of macros typedef struct s_vec @@ -36,14 +36,15 @@ typedef struct s_vec void *vec; } t_vec; -t_vec_stat ft_vec_init(t_vec *vec, size_t el_size); +t_arr_stat ft_vec_init(t_vec *vec, size_t el_size); 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, void (*free_el)(void *)); - +t_arr_stat ft_vec_reserve(t_vec *vec, size_t capacity); +t_arr_stat ft_vec_insert(t_vec *vec, const void *element, size_t index); +t_arr_stat ft_vec_append(t_vec *vec, const void *element); +t_arr_stat ft_vec_insert_range(t_vec *vec, const void *element, size_t count, size_t index); +t_arr_stat ft_vec_append_range(t_vec *vec, const void *element, size_t count); +t_arr_stat ft_vec_erase(t_vec *vec, size_t index, void (*free_el)(void *)); +t_arr_stat ft_vec_erase_range(t_vec *vec, size_t count, size_t index, void (*free_el)(void *)); void *ft_vec_access(t_vec *vec, size_t index); #endif diff --git a/inc/libft.h b/inc/libft.h index 1c4eb1a..33d0962 100644 --- a/inc/libft.h +++ b/inc/libft.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/08/15 12:58:15 by ljiriste #+# #+# */ -/* Updated: 2023/12/09 17:27:06 by ljiriste ### ########.fr */ +/* Updated: 2023/12/11 10:17:16 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,6 @@ # include "ft_mem.h" # include "ft_io.h" # include "ft_lst.h" -# include "ft_vec.h" +# include "ft_arr.h" #endif