24#define DA_HEADER_SIZE \
25 ((sizeof(da_header_t) + _Alignof(max_align_t) - 1) & \
26 ~(_Alignof(max_align_t) - 1))
49#define da_len(darray) ((darray) ? da__hdr(darray)->len : 0)
52#define da_cap(darray) ((darray) ? da__hdr(darray)->cap : 0)
72#define da_new(arena, darray, intitial_capacity) \
74 htils_assert(arena != null && "Arena cannot be null."); \
75 htils_assert(intitial_capacity > 0 && \
76 "Initial capacity must be greater than 0"); \
78 u64 capacity = (intitial_capacity); \
79 u64 alloc_size = DA_HEADER_SIZE + capacity; \
81 da_header_t *header = arena_alloc((arena), darray, alloc_size); \
82 header->cap = capacity; \
83 (darray) = (void *)(header + 1); \
105#define da_append(arena, darray, item) \
107 htils_assert(arena != null && "Arena cannot be null."); \
108 htils_assert(darray != null && "Darray cannot be null."); \
109 htils_assert(item != null && "Item cannot be null."); \
111 if (!(darray) || da__hdr(darray)->len >= da__hdr(darray)->cap) { \
112 u64 old_capacity = da__hdr(darray)->cap; \
113 u64 new_capacity = old_capacity ? old_capacity * 2 : 8; \
114 u64 old_len = da__hdr(darray)->len; \
115 u64 alloc_size = DA_HEADER_SIZE + new_capacity; \
117 da_header_t *header = arena_alloc((arena), darray, alloc_size); \
119 header->cap = new_capacity; \
120 header->len = old_len; \
123 memcpy(header + 1, (darray), old_len * sizeof(*(darray))); \
125 (darray) = (void *)(header + 1); \
128 (darray)[da__hdr(darray)->len++] = (item); \
139#define da_pop(darray) \
141 if (darray && da__hdr(darray)->len > 0) \
142 da__hdr(darray)->len--; \
153#define da_last(darray) \
154 (htils_assert(da__hdr(darray)->len > 0), (darray)[da__hdr(darray)->len - 1])
164#define da_clear(darray) \
167 da__hdr(darray)->len = 0; \
uint64_t u64
Definition basictypes.h:17
char cstr
Definition basictypes.h:50
#define DA_HEADER_SIZE
Definition darray.h:24
static da_header_t * da__hdr(void *da)
Get the da_header.
Definition darray.h:44
struct da_header da_header_t
The header of a dynamic array.