Skip to content

Instantly share code, notes, and snippets.

@YoussefLagtab
Last active August 28, 2020 21:21
Show Gist options
  • Save YoussefLagtab/5bcfc51c51bf930993c938bd3b5e6ca3 to your computer and use it in GitHub Desktop.
Save YoussefLagtab/5bcfc51c51bf930993c938bd3b5e6ca3 to your computer and use it in GitHub Desktop.
typedef struct s_array_node {
void *content;
size_t content_size;
} t_array_node;
typedef struct s_array_list {
t_array_node **array;
size_t arr_length;
size_t data_length;
} t_array_list;
t_array_node *ft_array_node_new(void *content, size_t content_size)
{
t_array_node *node;
if ((node = (t_array_node *)ft_memalloc(sizeof(t_array_node))) == NULL)
return (NULL);
if (content == NULL)
{
node->content = NULL;
node->content_size = 0;
return (node);
}
if ((node->content = ft_memalloc(content_size)) == NULL)
{
ft_memdel(node);
return (NULL);
}
node->content_size = content_size;
ft_memcpy(node->content, content, content_size);
return (node);
}
t_array_list *ft_array_list_init(t_array_list *array_list)
{
array_list->arr_length = 1;
array_list->data_length = 0;
array_list->array = (t_array_node**)ft_memalloc(sizeof(t_array_node*));
if (array_list->array == NULL)
return (NULL);
return (array_list);
}
t_array_list *ft_array_list_realloc(t_array_list *array_list, size_t new_size)
{
int i;
t_array_node **tmp_array;
i = 0;
tmp_array = array_list->array;
array_list->array = (t_array_node**)ft_memalloc(new_size * sizeof(t_array_node*));
while (i < array_list->data_length)
{
array_list->array[i] = tmp_array[i];
i++;
}
ft_memdel(tmp_array);
array_list->arr_length = new_size;
return (array_list);
}
t_array_list *ft_array_list_add(t_array_list *array_list, void *content, size_t content_size)
{
t_array_node *data;
if (array_list->data_length == array_list->arr_length)
array_list = ft_array_list_realloc(array_list, array_list->arr_length * 2);
data = ft_array_node_new(content, content_size);
array_list->array[array_list->data_length] = data;
array_list->data_length = array_list->data_length + 1;
return (array_list);
}
int ft_array_list_remove_index(t_array_list *array_list, size_t index, void (*del)(t_array_node *))
{
t_array_node *data;
size_t last_index;
if (index >= array_list->data_length)
return (1);
last_index = array_list->data_length - 1;
data = array_list->array[index];
if (last_index != index)
array_list->array[index] = array_list->array[last_index];
array_list->array[last_index] = NULL;
(*del)(data);
array_list->data_length = array_list->data_length - 1;
if (array_list->data_length * 4 <= array_list->arr_length)
array_list = ft_array_list_realloc(array_list, array_list->arr_length / 4);
return (array_list);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment