diff options
Diffstat (limited to 'libft/src/vec')
| -rw-r--r-- | libft/src/vec/ft_vecdestroy.c | 31 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecfrom_lst.c | 29 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecgrow.c | 43 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecinsert.c | 36 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecinsert_safe.c | 20 | ||||
| -rw-r--r-- | libft/src/vec/ft_veciter.c | 31 | ||||
| -rw-r--r-- | libft/src/vec/ft_veciter_addr.c | 25 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecnew.c | 38 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecpop.c | 28 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecpush.c | 30 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecpush_safe.c | 27 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecremove.c | 30 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecreserve.c | 30 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecsort.c | 24 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecswallow.c | 35 | ||||
| -rw-r--r-- | libft/src/vec/ft_vectake.c | 26 | ||||
| -rw-r--r-- | libft/src/vec/ft_vecunwrap.c | 22 |
17 files changed, 505 insertions, 0 deletions
diff --git a/libft/src/vec/ft_vecdestroy.c b/libft/src/vec/ft_vecdestroy.c new file mode 100644 index 0000000..0021573 --- /dev/null +++ b/libft/src/vec/ft_vecdestroy.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecdestroy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:06:22 by charles #+# #+# */ +/* Updated: 2020/08/19 17:49:30 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Destroy a vector +** \param vec Vector to destroy +** \param del Delete function applied to each element of the vector +** \return NULL +*/ + +void *ft_vecdestroy(t_ftvec *vec, void (*del)(void *elem)) +{ + if (vec == NULL) + return (NULL); + if (del != NULL) + ft_veciter(vec, del); + free(vec->data); + free(vec); + return (NULL); +} diff --git a/libft/src/vec/ft_vecfrom_lst.c b/libft/src/vec/ft_vecfrom_lst.c new file mode 100644 index 0000000..4a16e4c --- /dev/null +++ b/libft/src/vec/ft_vecfrom_lst.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecfrom_lst.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/14 15:59:24 by charles #+# #+# */ +/* Updated: 2020/06/15 09:48:48 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +t_ftvec *ft_vecfrom_lst(t_ftlst *lst) +{ + t_ftvec *vec; + t_ftlst *curr; + + if ((vec = ft_vecnew(ft_lstsize(lst))) == NULL) + return (NULL); + curr = lst; + while (curr != NULL) + { + ft_vecpush(vec, curr->data); + curr = curr->next; + } + return (vec); +} diff --git a/libft/src/vec/ft_vecgrow.c b/libft/src/vec/ft_vecgrow.c new file mode 100644 index 0000000..2213c88 --- /dev/null +++ b/libft/src/vec/ft_vecgrow.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecgrow.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:13:07 by charles #+# #+# */ +/* Updated: 2020/04/02 10:43:01 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Vector Growth factor +*/ + +#define FT_VEC_GROWTH_FACTOR 1.5 + +/* +** \brief Grow the vector capacity by a constant factor +** \param vec Vector to grow +** \return Passed vector of NULL on error +*/ + +t_ftvec *ft_vecgrow(t_ftvec *vec) +{ + size_t new_capacity; + void **new_data; + + if (vec->capacity <= 1) + new_capacity = 2; + else + new_capacity = vec->capacity * FT_VEC_GROWTH_FACTOR; + if ((new_data = (void**)malloc(sizeof(void*) * new_capacity)) == NULL) + return (NULL); + ft_memcpy(new_data, vec->data, vec->size * sizeof(void*)); + free(vec->data); + vec->data = new_data; + vec->capacity = new_capacity; + return (vec); +} diff --git a/libft/src/vec/ft_vecinsert.c b/libft/src/vec/ft_vecinsert.c new file mode 100644 index 0000000..1682daa --- /dev/null +++ b/libft/src/vec/ft_vecinsert.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecinsert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/02 10:46:59 by charles #+# #+# */ +/* Updated: 2020/04/02 11:04:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Insert element in vector +** \param vec Vector where element is inserted +** \param i Index where element should be inserted, +** bound checking is performed +** \param elem Element to insert +** \return Passed vector or NULL on error +*/ + +t_ftvec *ft_vecinsert(t_ftvec *vec, size_t i, void *elem) +{ + if (i > vec->size) + return (NULL); + if (vec->capacity <= vec->size) + if (ft_vecgrow(vec) == NULL) + return (NULL); + ft_memmove(vec->data + i + 1, vec->data + i, + (vec->size - i) * sizeof(void*)); + vec->data[i] = elem; + vec->size++; + return (vec); +} diff --git a/libft/src/vec/ft_vecinsert_safe.c b/libft/src/vec/ft_vecinsert_safe.c new file mode 100644 index 0000000..24e8cac --- /dev/null +++ b/libft/src/vec/ft_vecinsert_safe.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecinsert_safe.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/09 13:41:03 by charles #+# #+# */ +/* Updated: 2020/06/09 13:41:04 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +t_ftvec *ft_vecinsert_safe(t_ftvec *vec, size_t i, void *elem) +{ + if (elem == NULL) + return (NULL); + return (ft_vecinsert(vec, i, elem)); +} diff --git a/libft/src/vec/ft_veciter.c b/libft/src/vec/ft_veciter.c new file mode 100644 index 0000000..ec4a917 --- /dev/null +++ b/libft/src/vec/ft_veciter.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_veciter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:09:51 by charles #+# #+# */ +/* Updated: 2020/04/01 20:15:13 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Iterate a function over elements of a vector +** \param vec Iterated vector +** \param f Function applied to each elements +*/ + +void ft_veciter(t_ftvec *vec, void (*f)(void *elem)) +{ + size_t i; + + i = 0; + while (i < vec->size) + { + f(vec->data[i]); + i++; + } +} diff --git a/libft/src/vec/ft_veciter_addr.c b/libft/src/vec/ft_veciter_addr.c new file mode 100644 index 0000000..09f6926 --- /dev/null +++ b/libft/src/vec/ft_veciter_addr.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_veciter_addr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/09 13:52:38 by charles #+# #+# */ +/* Updated: 2020/06/09 13:53:30 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +void ft_veciter_addr(t_ftvec *vec, void (*f)(void **addr)) +{ + size_t i; + + i = 0; + while (i < vec->size) + { + f(vec->data + i); + i++; + } +} diff --git a/libft/src/vec/ft_vecnew.c b/libft/src/vec/ft_vecnew.c new file mode 100644 index 0000000..0def9c9 --- /dev/null +++ b/libft/src/vec/ft_vecnew.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:03:49 by charles #+# #+# */ +/* Updated: 2020/04/04 21:24:36 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Create a new vector +** \param capacity Initial capacity of the underlying array +** Can't be lower than 1 +** \return Created vector or NULL on malloc error +*/ + +t_ftvec *ft_vecnew(size_t capacity) +{ + t_ftvec *vec; + + if ((vec = (t_ftvec*)malloc(sizeof(t_ftvec))) == NULL) + return (NULL); + if (capacity == 0) + capacity = 1; + if ((vec->data = (void**)malloc(sizeof(void*) * capacity)) == NULL) + { + free(vec); + return (NULL); + } + vec->capacity = capacity; + vec->size = 0; + return (vec); +} diff --git a/libft/src/vec/ft_vecpop.c b/libft/src/vec/ft_vecpop.c new file mode 100644 index 0000000..5b77b46 --- /dev/null +++ b/libft/src/vec/ft_vecpop.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecpop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:26:27 by charles #+# #+# */ +/* Updated: 2020/04/01 20:26:34 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Pop last element of a vector +** \param vec Vector poped +** \param del Delete function applied to last element +*/ + +void ft_vecpop(t_ftvec *vec, void (*del)(void *elem)) +{ + if (vec->size == 0) + return ; + if (del != NULL) + del(vec->data[vec->size - 1]); + vec->size--; +} diff --git a/libft/src/vec/ft_vecpush.c b/libft/src/vec/ft_vecpush.c new file mode 100644 index 0000000..026ae3d --- /dev/null +++ b/libft/src/vec/ft_vecpush.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecpush.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:22:20 by charles #+# #+# */ +/* Updated: 2020/04/02 10:51:38 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Push element at the end of vector +** \param vec Vector where element will be pushed +** \param pushed Element to push +** \return Passed vector or NULL if couldnt grow vector +*/ + +t_ftvec *ft_vecpush(t_ftvec *vec, void *pushed) +{ + if (vec->capacity <= vec->size) + if (ft_vecgrow(vec) == NULL) + return (NULL); + vec->data[vec->size] = pushed; + vec->size++; + return (vec); +} diff --git a/libft/src/vec/ft_vecpush_safe.c b/libft/src/vec/ft_vecpush_safe.c new file mode 100644 index 0000000..8e5a8d4 --- /dev/null +++ b/libft/src/vec/ft_vecpush_safe.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecpush_safe.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 13:29:48 by charles #+# #+# */ +/* Updated: 2020/04/04 14:24:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Wrapper around ft_vecpush which reject null element +** \param vec Pushed vector +** \param pushed Element pushed which can't be NULL +** \return NULL if pushed is NULL, whatever ft_vecpush returns otherwise +*/ + +t_ftvec *ft_vecpush_safe(t_ftvec *vec, void *pushed) +{ + if (pushed == NULL) + return (NULL); + return (ft_vecpush(vec, pushed)); +} diff --git a/libft/src/vec/ft_vecremove.c b/libft/src/vec/ft_vecremove.c new file mode 100644 index 0000000..28ea541 --- /dev/null +++ b/libft/src/vec/ft_vecremove.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecremove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 22:45:07 by charles #+# #+# */ +/* Updated: 2020/06/09 13:28:26 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Remove element from vector +** \param vec Vector to remove from +** \param i Index of the element to remove +** \param del Delete function applied to ith element +*/ + +void ft_vecremove(t_ftvec *vec, size_t i, void (*del)(void *elem)) +{ + void *tmp; + + if ((tmp = ft_vectake(vec, i)) == NULL) + return ; + if (del != NULL) + del(tmp); +} diff --git a/libft/src/vec/ft_vecreserve.c b/libft/src/vec/ft_vecreserve.c new file mode 100644 index 0000000..105eb16 --- /dev/null +++ b/libft/src/vec/ft_vecreserve.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecreserve.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/07/15 17:22:08 by charles #+# #+# */ +/* Updated: 2020/08/20 23:21:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Set vector capacity to at least a certain size +** \param vec Reserved vector +** \param capacity Minimum required capacity +** \return The Vector or NULL on error +*/ + +t_ftvec *ft_vecreserve(t_ftvec *vec, size_t capacity) +{ + while (vec->capacity < capacity) + { + if (ft_vecgrow(vec) == NULL) + return (NULL); + } + return (vec); +} diff --git a/libft/src/vec/ft_vecsort.c b/libft/src/vec/ft_vecsort.c new file mode 100644 index 0000000..8aa5c2a --- /dev/null +++ b/libft/src/vec/ft_vecsort.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 15:53:23 by charles #+# #+# */ +/* Updated: 2020/04/04 19:30:31 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Wrapper around ft_qsort +** \param vec Vector to sort +** \param cmp Function to compare each vector element +*/ + +void ft_vecsort(t_ftvec *vec, t_ftcompar_func cmp) +{ + ft_qsort(vec->data, vec->size, sizeof(void*), cmp); +} diff --git a/libft/src/vec/ft_vecswallow.c b/libft/src/vec/ft_vecswallow.c new file mode 100644 index 0000000..614022d --- /dev/null +++ b/libft/src/vec/ft_vecswallow.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecswallow.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/07/15 17:17:00 by charles #+# #+# */ +/* Updated: 2020/07/15 18:30:37 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Insert all element of a vector in an other vector +** and free the swallowed vector +** \param vec Vector where the element will be inserted +** \param index Index of the insertion +** \param swallowed Vector to swallow +** \return Destination vector or NULL on error +*/ + +t_ftvec *ft_vecswallow_at(t_ftvec *vec, size_t index, t_ftvec *swallowed) +{ + size_t i; + + if (ft_vecreserve(vec, vec->size + swallowed->size) == NULL) + return (NULL); + i = -1; + while (++i < swallowed->size) + ft_vecinsert(vec, index, swallowed->data[i]); + ft_vecdestroy(swallowed, NULL); + return (vec); +} diff --git a/libft/src/vec/ft_vectake.c b/libft/src/vec/ft_vectake.c new file mode 100644 index 0000000..25a9038 --- /dev/null +++ b/libft/src/vec/ft_vectake.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vectake.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/09 13:27:19 by charles #+# #+# */ +/* Updated: 2020/06/09 13:29:02 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +void *ft_vectake(t_ftvec *vec, size_t i) +{ + void *taken; + + if (vec->size == 0 || i > vec->size - 1) + return (NULL); + taken = vec->data[i]; + ft_memmove(vec->data + i, vec->data + i + 1, + (vec->size - i - 1) * sizeof(void*)); + vec->size--; + return (taken); +} diff --git a/libft/src/vec/ft_vecunwrap.c b/libft/src/vec/ft_vecunwrap.c new file mode 100644 index 0000000..c1ab476 --- /dev/null +++ b/libft/src/vec/ft_vecunwrap.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecunwrap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/09 13:49:50 by charles #+# #+# */ +/* Updated: 2020/06/09 13:50:33 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +void **ft_vecunwrap(t_ftvec *vec) +{ + void **tmp; + + tmp = vec->data; + free(vec); + return (tmp); +} |
