67 lines
1.3 KiB
C
67 lines
1.3 KiB
C
#ifndef ARRAY_H
|
|
# define ARRAY_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <assert.h>
|
|
|
|
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
|