array.c (1192B)
1 #include <string.h> 2 #include "engine.h" 3 4 void array_init(Array_t *a, size_t elem_size) { 5 a->data = NULL; 6 a->elem_size = elem_size; 7 a->count = 0; 8 a->capacity = 0; 9 } 10 11 void array_free(Array_t *a) { 12 free(a->data); 13 a->data = NULL; 14 a->count = 0; 15 a->capacity = 0; 16 } 17 18 static void array_grow(Array_t *a) { 19 size_t new_cap = a->capacity ? a->capacity * 2 : 8; 20 void *new_data = realloc(a->data, new_cap * a->elem_size); 21 if (!new_data) { 22 fprintf(stderr, "err: array_grow out of memory\n"); 23 exit(EXIT_FAILURE); 24 } 25 a->data = new_data; 26 a->capacity = new_cap; 27 } 28 29 void *array_push(Array_t *a) { 30 if (a->count >= a->capacity) array_grow(a); 31 void *slot = (char*)a->data + a->count * a->elem_size; 32 a->count++; 33 return slot; 34 } 35 36 void *array_pop(Array_t *a, size_t i) { 37 if (i >= a->count) return NULL; 38 return (char*)a->data + i * a->elem_size; 39 } 40 41 void array_remove_swap(Array_t *a, size_t i) { 42 if (i >= a->count) return; 43 if (i != a->count - 1) { 44 void *dst = (char*)a->data + i * a->elem_size; 45 void *src = (char*)a->data + (a->count - 1) * a->elem_size; 46 memcpy(dst, src, a->elem_size); 47 } 48 a->count--; 49 } 50 51 void array_clear(Array_t *a) { 52 a->count = 0; 53 }