diff options
Diffstat (limited to 'include/dynarr.h')
-rw-r--r-- | include/dynarr.h | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/include/dynarr.h b/include/dynarr.h index 52cacc5..0a7e2c6 100644 --- a/include/dynarr.h +++ b/include/dynarr.h @@ -14,11 +14,15 @@ void *ctx; \ } -void *dapush(void *, void *, size_t, size_t); +void *daextend(void *, void *, size_t, size_t, size_t); -#define dapush(da, ...) \ - dapush((da), ((typeof(__VA_ARGS__)[1]){__VA_ARGS__}), sizeof(__VA_ARGS__), \ - alignof(__VA_ARGS__)) +#define dapush(da, x) \ + ((typeof((da)->buf))(daextend)((da), (typeof(x)[1]){(x)}, 1, sizeof(x), \ + alignof(x))) + +#define daextend(da, xs, n) \ + ((typeof((da)->buf))daextend((da), (xs), (n), sizeof(*(xs)), \ + alignof(*(xs)))) #define DAGROW(da, n) \ do { \ @@ -28,15 +32,6 @@ void *dapush(void *, void *, size_t, size_t); } \ } while (false) -#define DAPUSH(da, x) \ - do { \ - if ((da)->len >= (da)->cap) { \ - (da)->cap = (da)->cap ? (da)->cap * 2 : 1; \ - (da)->buf = bufalloc((da)->buf, (da)->cap, sizeof(*(da)->buf)); \ - } \ - (da)->buf[(da)->len++] = (x); \ - } while (false) - #define DAEXTEND(da, xs, n) \ do { \ if ((da)->len + (n) >= (da)->cap) { \ |