Last active
August 28, 2020 21:21
-
-
Save YoussefLagtab/5bcfc51c51bf930993c938bd3b5e6ca3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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