htils
1
A small set of utilities for C programming.
Toggle main menu visibility
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
18
typedef
struct
da_header
{
19
u64
cap
;
20
u64
len
;
21
}
da_header_t
;
22
24
#define DA_HEADER_SIZE \
25
((sizeof(da_header_t) + _Alignof(max_align_t) - 1) & \
26
~(_Alignof(max_align_t) - 1))
27
40
static
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
arena.h
assert.h
basictypes.h
u64
uint64_t u64
Definition
basictypes.h:22
cstr
char cstr
Definition
basictypes.h:59
DA_HEADER_SIZE
#define DA_HEADER_SIZE
Definition
darray.h:24
da__hdr
static da_header_t * da__hdr(void *da)
Get a dynamic array's header.
Definition
darray.h:40
da_header_t
struct da_header da_header_t
The header of a dynamic array.
da_header
The header of a dynamic array.
Definition
darray.h:18
da_header::len
u64 len
Definition
darray.h:20
da_header::cap
u64 cap
Definition
darray.h:19
include
htils
darray.h
Generated by
1.17.0