2026-03-03 00:36:28 +01:00

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