mclangc/src/include/dyn_arr.h
2024-07-24 01:55:53 +03:00

95 lines
5.1 KiB
C

#ifndef _H_MCL_DYN_ARR
#define _H_MCL_DYN_ARR
#include <stdio.h>
#define DEFINE_DA(name, type) \
typedef struct mcl_da_##name##_s { \
type* items; \
size_t count; \
size_t capacity; \
} mcl_da_##name##_t; \
type mcl_da_##name##_pop(mcl_da_##name##_t* da); \
void mcl_da_##name##_push(mcl_da_##name##_t* da, type item); \
void mcl_da_##name##_free(mcl_da_##name##_t* da); \
#define DEFINE_DA_IMPL(name, type) \
type mcl_da_##name##_pop(mcl_da_##name##_t* da) { \
if (da->capacity <= 0 || da->count <= 0) \
return NULL; \
if (da->count < da->capacity / 2) { \
da->capacity /= 2; \
da->items = realloc(da->items, \
da->capacity * sizeof(type)); \
assert(da->items && "Out of memory"); \
} \
return da->items[(da->count--) - 1]; \
} \
void mcl_da_##name##_push(mcl_da_##name##_t* da, type item) { \
if (da->capacity <= da->count) { \
if (da->capacity == 0) { \
da->capacity = 8; \
} else { \
da->capacity *= 2; \
} \
da->items = realloc(da->items, \
da->capacity * sizeof(type)); \
assert(da->items && "Out of memory"); \
} \
da->items[da->count++] = item; \
} \
void mc_da_##name##_free(mcl_da_##name##_t* da) { \
free(da->items); \
}
#define DEFINE_PTR_DA(name, type) \
typedef struct mcl_ptr_da_##name##_s { \
type** items; \
size_t count; \
size_t capacity; \
} mcl_ptr_da_##name##_t; \
type* mcl_da_##name##_pop(mcl_da_##name##_t* da); \
void mcl_da_##name##_push(mcl_da_##name##_t* da, type* item);
#define DEFINE_PTR_DA_IMPL(type) \
type* mcl_ptr_da_##name##_pop(mcl_da_##name##_t* da) { \
if (da->capacity <= 0 || da->count <= 0) \
return NULL; \
if (da->count < da->capacity / 2) { \
da->capacity /= 2; \
da->items = realloc(da->items, \
da->capacity * sizeof(type*)); \
assert(da->items && "Out of memory"); \
} \
return da->items[(da->count--) - 1]; \
} \
void mcl_ptr_da_##name##_push(mcl_da_##name##_t* da, type* item) { \
if (da->capacity <= da->count) { \
if (da->capacity == 0) { \
da->capacity = 8; \
} else { \
da->capacity *= 2; \
} \
da->items = realloc(da->items, \
da->capacity * sizeof(type*)); \
assert(da->items && "Out of memory"); \
} \
da->items[da->count++] = item; \
} \
void mc_ptr_da_##name##_free(mcl_da_##name##_* da) { \
free(da->items); \
}
#define MCL_DA_FOR_IN(type, da, item, body) do { \
type item; \
for (int i = 0; i < (da)->count; i++) { \
item = ((da)->items)[i]; \
body \
} \
} while (0)
#endif