#ifndef ARRAY_H # define ARRAY_H #include #include #include #include typedef struct Header_s{ int size; int capacity; int type; } Header; #ifndef memset void *memset(void *src, char c, size_t size) { for (int i = 0; i < size; i++) { *(char *)(src + i) = c; } return (src); } #endif typedef void *Array; #define ARRAY_BASE_CAPACITY 64 #define ArraySize(arr) ((Header*)(arr) - 1)->size #define ArrayFree(arr) free(((Header*)(arr) - 1)) #define ArrayPush(arr, x)\ do {\ Header *head = NULL;\ if (!arr) { \ head = malloc(sizeof(x) * ARRAY_BASE_CAPACITY + sizeof(Header));\ head->size = 0;\ head->type = sizeof(x);\ head->capacity = ARRAY_BASE_CAPACITY;\ arr = (void *)(head + 1);\ }\ head = (Header*)(arr)-1;\ assert(sizeof(x) == head->type);\ if (head->size >= head->capacity) {\ head->capacity *= 2;\ head = realloc(head, head->type *head->capacity + sizeof(Header));\ arr = (void *)(head + 1);\ }\ (arr)[head->size++] = x;\ } while(0) #define ArrayClear(arr)\ do {\ assert(arr);\ Header * head = (Header*)(arr)-1;\ memset(arr, 0, head->size * head->type);\ } while(0)\ # ifdef ARRAY_IMPL # endif #endif