From: Lukas Jiriste Date: Fri, 28 Jun 2024 11:51:06 +0000 (+0200) Subject: Add some set functions defined on t_vec X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=d428313785c2b3bec95bbb21af840d2defe58676;p=Libft.git Add some set functions defined on t_vec The functions are defined on t_vec instead of implementing t_set because the t_set struct would not be very useful. The lack of structure is easy to emulate wth t_vec. The only advantage would be uniqueness of elements. --- diff --git a/Makefile b/Makefile index d017796..3f7e42a 100644 --- a/Makefile +++ b/Makefile @@ -125,6 +125,10 @@ SRCarr := ft_vec_init.c \ ft_vec_find_index.c \ ft_vec_copy.c \ \ + ft_vec_contains.c \ + ft_vec_is_subset.c \ + ft_vec_is_setequal.c \ + \ ft_mat_init.c \ ft_mat_append.c \ ft_mat_insert_col.c \ diff --git a/ft_arr/ft_vec_contains.c b/ft_arr/ft_vec_contains.c new file mode 100644 index 0000000..6eb51be --- /dev/null +++ b/ft_arr/ft_vec_contains.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vec_contains.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/28 13:27:29 by ljiriste #+# #+# */ +/* Updated: 2024/06/28 13:39:14 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_arr.h" + +int ft_vec_contains(const t_vec *vec, const void *wanted, + int (*cmp_elements)(const void *, const void *)) +{ + size_t i; + const void *element; + + i = 0; + while (i < vec->size) + { + element = ft_vec_caccess(vec, i); + if (cmp_elements(wanted, element) == 0) + return (1); + ++i; + } + return (0); +} diff --git a/ft_arr/ft_vec_is_setequal.c b/ft_arr/ft_vec_is_setequal.c new file mode 100644 index 0000000..34e8662 --- /dev/null +++ b/ft_arr/ft_vec_is_setequal.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vec_is_setequal.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/28 13:45:07 by ljiriste #+# #+# */ +/* Updated: 2024/06/28 13:49:35 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_arr.h" + +int ft_vec_is_setequal(const t_vec *first, const t_vec *second, + int (*cmp_elements)(const void *, const void *)) +{ + return (ft_vec_is_subset(first, second, cmp_elements) + && ft_vec_is_subset(second, first, cmp_elements)); +} diff --git a/ft_arr/ft_vec_is_subset.c b/ft_arr/ft_vec_is_subset.c new file mode 100644 index 0000000..a6727da --- /dev/null +++ b/ft_arr/ft_vec_is_subset.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vec_is_subset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/28 13:35:18 by ljiriste #+# #+# */ +/* Updated: 2024/06/28 13:50:31 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_arr.h" + +int ft_vec_is_subset(const t_vec *subset, const t_vec *set, + int (*cmp_elements)(const void *, const void *)) +{ + size_t i; + const void *element; + + i = 0; + while (i < subset->size) + { + element = ft_vec_caccess(subset, i); + if (!ft_vec_contains(set, element, cmp_elements)) + return (0); + ++i; + } + return (1); +} diff --git a/inc/ft_arr.h b/inc/ft_arr.h index 02e7ddd..a1c3b33 100644 --- a/inc/ft_arr.h +++ b/inc/ft_arr.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/09 13:58:15 by ljiriste #+# #+# */ -/* Updated: 2024/06/28 12:30:47 by ljiriste ### ########.fr */ +/* Updated: 2024/06/28 13:47:36 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,6 +79,17 @@ t_arr_stat ft_vec_copy(t_vec *dest, const t_vec *src, void *ft_vec_find(t_vec *vec, void *wanted); t_arr_stat ft_vec_find_index(t_vec *vec, void *wanted, size_t *index); +// The following are functions that would operate on sets. +// I have not implemented set structure as it would be just a wrapper +// on t_vec with worsened access to the elements. +// The cmp_elements should return 0 when elements are equal (like strcmp) +int ft_vec_contains(const t_vec *vec, const void *wanted, + int (*cmp_elements)(const void *, const void *)); +int ft_vec_is_subset(const t_vec *subset, const t_vec *set, + int (*cmp_elements)(const void *, const void *)); +int ft_vec_is_setequal(const t_vec *first, const t_vec *second, + int (*cmp_elements)(const void *, const void *)); + t_arr_stat ft_mat_init(t_mat *mat, size_t el_size); void ft_mat_free(t_mat *mat, void (*free_el)(void *)); t_arr_stat ft_mat_resize(t_mat *mat, size_t rows, size_t cols);