aboutsummaryrefslogtreecommitdiff
path: root/lib/arena.h
diff options
context:
space:
mode:
authorspl3g <spleefer6@yandex.ru>2025-03-19 18:08:58 +0300
committerspl3g <spleefer6@yandex.ru>2025-03-19 18:09:16 +0300
commit269014e7843fabf395fca10c3364e50825f0fe20 (patch)
tree0f1c3d7e76314f619e53bab13bcb360054b1da0e /lib/arena.h
parent35ac34c2f18ab84e0551b61f6e7421a559f58919 (diff)
Add arena string builder
Diffstat (limited to 'lib/arena.h')
-rw-r--r--lib/arena.h38
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_