diff options
| author | spl3g <spleefer6@yandex.ru> | 2025-03-19 18:08:58 +0300 |
|---|---|---|
| committer | spl3g <spleefer6@yandex.ru> | 2025-03-19 18:09:16 +0300 |
| commit | 269014e7843fabf395fca10c3364e50825f0fe20 (patch) | |
| tree | 0f1c3d7e76314f619e53bab13bcb360054b1da0e /lib/arena.h | |
| parent | 35ac34c2f18ab84e0551b61f6e7421a559f58919 (diff) | |
Add arena string builder
Diffstat (limited to 'lib/arena.h')
| -rw-r--r-- | lib/arena.h | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/lib/arena.h b/lib/arena.h index 7535f8a..1f53355 100644 --- a/lib/arena.h +++ b/lib/arena.h @@ -34,18 +34,32 @@ void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz); #define ARENA_REGION_DEFAULT_CAPACITY (8*1024) #define ARENA_DA_INIT_CAP (2) -#define arena_da_append(a, da, item) \ - do { \ - if ((da)->len >= (da)->cap) { \ - size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \ - (da)->data = arena_realloc( \ - (a), (da)->data, \ - (da)->cap*sizeof(*(da)->data), \ - new_cap*sizeof(*(da)->data)); \ - (da)->cap = new_cap; \ - } \ - \ - (da)->data[(da)->len++] = (item); \ +#define arena_da_reserve(a, da, expected_size) \ + do { \ + if ((expected_size) >= (da)->cap) { \ + size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \ + while (new_cap < expected_size) { \ + new_cap *= 2; \ + } \ + (da)->data = arena_realloc( \ + (a), (da)->data, \ + (da)->cap*sizeof(*(da)->data), \ + new_cap*sizeof(*(da)->data)); \ + (da)->cap = new_cap; \ + } \ + } while (0) + +#define arena_da_append(a, da, item) \ + do { \ + arena_da_reserve((a), (da), (da)->len + 1); \ + (da)->data[(da)->len++] = (item); \ + } while (0) + +#define arena_da_append_many(a, da, items, items_len) \ + do { \ + arena_da_reserve((a), (da), (da)->len+len); \ + memcpy((da)->data+(da)->len, (items), sizeof(*(da)->data)*items_len); \ + (da)->len += len; \ } while (0) #endif //ARENA_H_ |
