]> git.lizzy.rs Git - dragonstd.git/blob - array.c
Float mixing
[dragonstd.git] / array.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include "array.h"
4
5 Array array_create(size_t membsiz)
6 {
7         return (Array) {
8                 .membsiz = membsiz,
9                 .siz = 0,
10                 .cap = 0,
11                 .ptr = NULL,
12         };
13 }
14
15
16 static void array_realloc(Array *array)
17 {
18         if (array->siz > array->cap) {
19                 array->cap = array->siz + DRAGONTYPE_ARRAY_REALLOC_EXTRA;
20                 array->ptr = realloc(array->ptr, array->cap * array->membsiz);
21         }
22 }
23
24 static void array_alloc(Array *array, size_t siz)
25 {
26         array->siz += siz;
27         array_realloc(array);
28 }
29
30 void array_insert(Array *array, void *elem, size_t idx)
31 {
32         size_t oldsiz = array->siz;
33         array_alloc(array, 1);
34
35         char *iptr = (char *) array->ptr + idx * array->membsiz;
36         memmove(iptr + array->membsiz, iptr, (oldsiz - idx) * array->membsiz);
37         memcpy(iptr, elem, array->membsiz);
38 }
39
40 void array_append(Array *array, void *elem)
41 {
42         size_t oldsiz = array->siz;
43         array_alloc(array, 1);
44
45         memcpy((char *) array->ptr + oldsiz * array->membsiz, elem, array->membsiz);
46 }
47
48 void array_copy(Array *array, void **ptr, size_t *count)
49 {
50         *count = array->siz;
51         size_t size = array->siz * array->membsiz;
52         *ptr = malloc(size);
53         memcpy(*ptr, array->ptr, size);
54 }