engine

game engine on C
git clone git://git.evenfri.pw/engine.git
Log | Files | Refs | README

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 }