htils 1
A small set of utilities for C programming.
Loading...
Searching...
No Matches
darray.h
Go to the documentation of this file.
1#ifndef HTILS_DARRAY
2#define HTILS_DARRAY
3
4/***********************************/
5
6#include <htils/arena.h>
7#include <htils/assert.h>
8#include <htils/basictypes.h>
9
10/***********************************/
11
22
24#define DA_HEADER_SIZE \
25 ((sizeof(da_header_t) + _Alignof(max_align_t) - 1) & \
26 ~(_Alignof(max_align_t) - 1))
27
40static inline da_header_t *da__hdr(void *da) {
41 return (da_header_t *)((cstr *)da - DA_HEADER_SIZE);
42}
43
44//
45//
46//
47
49#define da_len(darray) ((darray) ? da__hdr(darray)->len : 0)
50
52#define da_cap(darray) ((darray) ? da__hdr(darray)->cap : 0)
53
72#define da_new(arena, darray, initial_capacity) \
73 do { \
74 htils_assert(arena != null && "Arena cannot be null."); \
75 htils_assert(initial_capacity > 0 && \
76 "Initial capacity must be greater than 0"); \
77 \
78 u64 capacity = (initial_capacity); \
79 u64 alloc_size = DA_HEADER_SIZE + capacity * sizeof(*(darray)); \
80 \
81 da_header_t *header = __arena_alloc_zeroed((arena), alloc_size); \
82 header->cap = capacity; \
83 header->len = 0; \
84 (darray) = (void *)(header + 1); \
85 } while (0)
86
87//
88//
89//
90
106#define da_append(arena, darray, item) \
107 do { \
108 htils_assert(arena != null && "Arena cannot be null."); \
109 htils_assert(darray != null && "Darray cannot be null."); \
110 \
111 if (!(darray) || da_len(darray) >= da_cap(darray)) { \
112 u64 old_capacity = da_cap(darray); \
113 u64 new_capacity = \
114 old_capacity ? old_capacity + old_capacity / 2 + (old_capacity % 2) \
115 : 8; \
116 u64 old_len = da_len(darray); \
117 u64 alloc_size = DA_HEADER_SIZE + new_capacity * sizeof(*(darray)); \
118 \
119 da_header_t *header = __arena_alloc((arena), alloc_size); \
120 \
121 header->cap = new_capacity; \
122 header->len = old_len; \
123 \
124 if (darray) \
125 memcpy(header + 1, (darray), old_len * sizeof(*(darray))); \
126 \
127 (darray) = (void *)(header + 1); \
128 } \
129 \
130 (darray)[da__hdr(darray)->len++] = (item); \
131 } while (0)
132
133//
134//
135//
136
145#define da_pop(darray) \
146 do { \
147 if (darray && da__hdr(darray)->len > 0) \
148 da__hdr(darray)->len--; \
149 } while (0)
150
151//
152//
153//
154
163#define da_last(darray) \
164 (htils_assert(da__hdr(darray)->len > 0), (darray)[da__hdr(darray)->len - 1])
165
166//
167//
168//
169
178#define da_clear(darray) \
179 do { \
180 if (darray) \
181 da__hdr(darray)->len = 0; \
182 } while (0)
183
184#endif // !HTILS_DARRAY
uint64_t u64
Definition basictypes.h:22
char cstr
Definition basictypes.h:59
#define DA_HEADER_SIZE
Definition darray.h:24
static da_header_t * da__hdr(void *da)
Get a dynamic array's header.
Definition darray.h:40
struct da_header da_header_t
The header of a dynamic array.
The header of a dynamic array.
Definition darray.h:18
u64 len
Definition darray.h:20
u64 cap
Definition darray.h:19