95 lines
5.1 KiB
C
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
|