33 lines
1.5 KiB
C
33 lines
1.5 KiB
C
// common.h
|
|
#ifndef _ZIG1_COMMON_H__
|
|
#define _ZIG1_COMMON_H__
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
#define SLICE_INIT(Type, initial_cap) ({ \
|
|
Type* arr = calloc(initial_cap, sizeof(Type)); \
|
|
if (!arr) \
|
|
exit(1); \
|
|
(__typeof__(Type*)) { arr }; \
|
|
})
|
|
|
|
#define SLICE_RESIZE(slice, Type, new_cap) ({ \
|
|
uint32_t cap = (new_cap); \
|
|
Type* new_arr = realloc((slice)->arr, cap * sizeof(Type)); \
|
|
if (!new_arr) \
|
|
exit(1); \
|
|
(slice)->arr = new_arr; \
|
|
(slice)->cap = cap; \
|
|
})
|
|
|
|
#define SLICE_ENSURE_CAPACITY(slice, Type, additional) ({ \
|
|
if ((slice)->len + (additional) > (slice)->cap) { \
|
|
SLICE_RESIZE(slice, \
|
|
Type, \
|
|
((slice)->cap * 2 > (slice)->len + (additional)) ? (slice)->cap * 2 : (slice)->len + (additional)); \
|
|
} \
|
|
})
|
|
|
|
#endif
|