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 H2OTILS_DARRAY_H
2#define H2OTILS_DARRAY_H
3
4#include <h2o/memory.h>
5
6//
7//
8//
9
10#include <htils/assert.h>
11#include <htils/basictypes.h>
12
13//
14//
15//
16
27
28//
29//
30//
31
33#define H2O_DA_HEADER_SIZE \
34 ((sizeof(h2o_da_header_t) + _Alignof(max_align_t) - 1) & \
35 ~(_Alignof(max_align_t) - 1))
36
37//
38//
39//
40
53static inline h2o_da_header_t *h2o_da__hdr(void *h2o_da) {
54 return (h2o_da_header_t *)((cstr *)h2o_da - H2O_DA_HEADER_SIZE);
55}
56
58#define h2o_da_len(darray) ((darray) ? h2o_da__hdr(darray)->len : 0)
59
61#define h2o_da_cap(darray) ((darray) ? h2o_da__hdr(darray)->cap : 0)
62
78#define h2o_da_new(pool, darray, intitial_capacity) \
79 do { \
80 htils_assert(pool && "pool cannot be null."); \
81 htils_assert(intitial_capacity > 0 && \
82 "Initial capacity must be greater than 0"); \
83 \
84 u64 capacity = (intitial_capacity); \
85 u64 alloc_size = H2O_DA_HEADER_SIZE + capacity; \
86 \
87 h2o_da_header_t *header = h2o_mem_alloc_pool((pool), darray, alloc_size); \
88 header->cap = capacity; \
89 header->len = 0; \
90 (darray) = (void *)(header + 1); \
91 } while (0)
92
93//
94//
95//
96
110#define h2o_da_append(pool, darray, item) \
111 do { \
112 htils_assert(pool && "Pool cannot be null."); \
113 htils_assert(darray && "Darray cannot be null."); \
114 htils_assert(item && "Item cannot be null."); \
115 \
116 if (!(darray) || h2o_da_len(darray) >= h2o_da_cap(darray)) { \
117 u64 old_capacity = h2o_da_cap(darray); \
118 u64 new_capacity = \
119 old_capacity ? old_capacity + old_capacity / 2 + (old_capacity % 2) \
120 : 8; \
121 u64 old_len = h2o_da_len(darray); \
122 u64 alloc_size = H2O_DA_HEADER_SIZE + new_capacity; \
123 \
124 h2o_da_header_t *header = \
125 h2o_mem_alloc_pool((pool), darray, alloc_size); \
126 \
127 header->cap = new_capacity; \
128 header->len = old_len; \
129 \
130 if (darray) \
131 memcpy(header + 1, (darray), old_len * sizeof(*(darray))); \
132 \
133 (darray) = (void *)(header + 1); \
134 } \
135 \
136 (darray)[h2o_da__hdr(darray)->len++] = (item); \
137 } while (0)
138
147#define h2o_da_pop(darray) \
148 do { \
149 if (darray && h2o_da__hdr(darray)->len > 0) \
150 h2o_da__hdr(darray)->len--; \
151 } while (0)
152
161#define h2o_da_last(darray) \
162 (htils_assert(h2o_da__hdr(darray)->len > 0), \
163 (darray)[h2o_da__hdr(darray)->len - 1])
164
173#define h2o_da_clear(darray) \
174 do { \
175 if (darray) \
176 h2o_da__hdr(darray)->len = 0; \
177 } while (0)
178
179#endif // !H2OTILS_DARRAY_H
uint64_t u64
Definition basictypes.h:18
char cstr
Definition basictypes.h:55
#define H2O_DA_HEADER_SIZE
Definition darray.h:33
struct h2o_da_header h2o_da_header_t
The header of a dynamic array.
static h2o_da_header_t * h2o_da__hdr(void *h2o_da)
Get the dynamic array header.
Definition darray.h:53
The header of a dynamic array.
Definition darray.h:23
u64 len
Definition darray.h:25
u64 cap
Definition darray.h:24