arraylist

This commit is contained in:
2020-06-06 19:07:55 +02:00
parent 528d0dd06f
commit ebb7c6eeee
6 changed files with 53 additions and 3 deletions

37
src/array.c Normal file
View File

@ -0,0 +1,37 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
union arraylist_meta {
max_align_t dummy_align;
struct {
size_t len;
size_t cap;
size_t sizeof_one_element;
};
};
void* arraylist_create(size_t array_size, size_t sizeof_one_element) {
union arraylist_meta *arraylist_new = malloc(array_size * sizeof_one_element + sizeof*arraylist_new);
arraylist_new->len = array_size;
arraylist_new->cap = array_size;
arraylist_new->sizeof_one_element = sizeof_one_element;
return arraylist_new+1;
}
void* arraylist_append(void *arraylist_void, void *element_void) {
char *element = element_void;
union arraylist_meta *arraylist = arraylist_void;
--arraylist;
if(arraylist->len == arraylist->cap) {
arraylist->cap = arraylist->len + 10;
arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist);
}
char *arraylist_char = (char*)(arraylist+1);
arraylist_char += arraylist->sizeof_one_element * arraylist->len;
for(size_t i = 0; i < arraylist->sizeof_one_element; ++arraylist_char, ++element, ++i) {
*arraylist_char = *element;
}
++arraylist->len;
return arraylist+1;
}