aboutsummaryrefslogtreecommitdiff
path: root/lib/arena.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arena.h')
-rw-r--r--lib/arena.h31
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_