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