diff options
| author | spl3g <spleefer6@yandex.ru> | 2025-03-16 19:41:50 +0300 |
|---|---|---|
| committer | spl3g <spleefer6@yandex.ru> | 2025-03-16 19:46:13 +0300 |
| commit | 8ceb8fe77cb431dd4d866cbffd935cb2c101074c (patch) | |
| tree | 4e7d15786113ae3f0ea04a7ef1267e558bfe44ac /lib/arena.h | |
| parent | f8dc21f52bfb47de5bcfd3fb536f99a5bd8e5ca5 (diff) | |
Replace push macro with da_append from tsoding
Diffstat (limited to 'lib/arena.h')
| -rw-r--r-- | lib/arena.h | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/lib/arena.h b/lib/arena.h index 1ddddac..7535f8a 100644 --- a/lib/arena.h +++ b/lib/arena.h @@ -1,3 +1,5 @@ +// Most of the code is from https://github.com/tsoding/arena + #ifndef ARENA_H_ #define ARENA_H_ @@ -19,22 +21,31 @@ struct region { typedef struct { region *beg; region *end; + size_t region_cap; } arena; +arena arena_init_cap(size_t cap); void *arena_alloc(arena *a, size_t size); void arena_free(arena *a); -void grow_da(void *slice, size_t size, arena *arena); - +void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz); #define new(a, t, c) (t *)arena_alloc(a, sizeof(t)*c) -#define ARENA_REGION_DEFAULT_CAPACITY (8*1024); - -// from nullprogram -#define push(slice, arena) \ - ((slice)->len >= (slice)->cap \ - ? grow_da(slice, sizeof(*(slice)->data), arena), \ - (slice)->data + (slice)->len++ \ - : (slice)->data + (slice)->len++) +#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); \ + } while (0) #endif //ARENA_H_ |
