Add some set functions defined on t_vec
authorLukas Jiriste <ljiriste@student.42prague.com>
Fri, 28 Jun 2024 11:51:06 +0000 (13:51 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Fri, 28 Jun 2024 15:10:18 +0000 (17:10 +0200)
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.

Makefile
ft_arr/ft_vec_contains.c [new file with mode: 0644]
ft_arr/ft_vec_is_setequal.c [new file with mode: 0644]
ft_arr/ft_vec_is_subset.c [new file with mode: 0644]
inc/ft_arr.h

index d0177965aba26e1b623b256820c072331c0c8dec..3f7e42a1aba73a56c52a6b5890040c346c2d7cb6 100644 (file)
--- 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 (file)
index 0000000..6eb51be
--- /dev/null
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_vec_contains.c                                  :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   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 (file)
index 0000000..34e8662
--- /dev/null
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_vec_is_setequal.c                               :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   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 (file)
index 0000000..a6727da
--- /dev/null
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_vec_is_subset.c                                 :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   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);
+}
index 02e7dddbec2990a9e542380c4ac7bdbbc280febe..a1c3b33e33b43d8e1a68f4a1f1a6b9c08e192d6e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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);