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).
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 \
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 \
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stddef.h>
void *ft_vec_access(t_vec *vec, size_t index)
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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));
}
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdlib.h>
void ft_vec_free(t_vec *vec, void (*free_el)(void *))
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stddef.h>
-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);
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
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;
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdlib.h>
-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;
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* ft_vec.h :+: :+: :+: */
+/* ft_arr.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stddef.h>
# 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
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
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
# include "ft_mem.h"
# include "ft_io.h"
# include "ft_lst.h"
-# include "ft_vec.h"
+# include "ft_arr.h"
#endif