20#define rb_darray(T) struct { rb_darray_meta_t meta; T data[]; } *
26#define rb_darray_get(ary, idx) ((ary)->data[(idx)])
32#define rb_darray_set(ary, idx, element) ((ary)->data[(idx)] = (element))
38#define rb_darray_ref(ary, idx) (&((ary)->data[(idx)]))
44#define rb_darray_append(ptr_to_ary, element) do { \
45 rb_darray_ensure_space((ptr_to_ary), \
46 sizeof(**(ptr_to_ary)), \
47 sizeof((*(ptr_to_ary))->data[0])); \
48 rb_darray_set(*(ptr_to_ary), \
49 (*(ptr_to_ary))->meta.size, \
51 (*(ptr_to_ary))->meta.size++; \
54#define rb_darray_insert(ptr_to_ary, idx, element) do { \
55 rb_darray_ensure_space((ptr_to_ary), \
56 sizeof(**(ptr_to_ary)), \
57 sizeof((*(ptr_to_ary))->data[0])); \
59 rb_darray_ref(*(ptr_to_ary), idx + 1), \
60 rb_darray_ref(*(ptr_to_ary), idx), \
61 (*(ptr_to_ary))->data[0], \
62 rb_darray_size(*(ptr_to_ary)) - idx); \
63 rb_darray_set(*(ptr_to_ary), idx, element); \
64 (*(ptr_to_ary))->meta.size++; \
69#define rb_darray_foreach(ary, idx_name, elem_ptr_var) \
70 for (size_t idx_name = 0; idx_name < rb_darray_size(ary) && ((elem_ptr_var) = rb_darray_ref(ary, idx_name)); ++idx_name)
74#define rb_darray_for(ary, idx_name) \
75 for (size_t idx_name = 0; idx_name < rb_darray_size(ary); ++idx_name)
84#define rb_darray_make(ptr_to_ary, size) \
85 rb_darray_make_impl((ptr_to_ary), size, sizeof(**(ptr_to_ary)), sizeof((*(ptr_to_ary))->data[0]))
92#define rb_darray_resize_capa(ptr_to_ary, capa) \
93 rb_darray_resize_capa_impl((ptr_to_ary), capa, sizeof(**(ptr_to_ary)), sizeof((*(ptr_to_ary))->data[0]))
95#define rb_darray_data_ptr(ary) ((ary)->data)
105rb_darray_clear(
void *ary)
107 rb_darray_meta_t *meta = ary;
116rb_darray_size(
const void *ary)
118 const rb_darray_meta_t *meta = ary;
119 return meta ? meta->size : 0;
124rb_darray_pop(
void *ary,
size_t count)
126 rb_darray_meta_t *meta = ary;
133rb_darray_capa(
const void *ary)
135 const rb_darray_meta_t *meta = ary;
136 return meta ? meta->capa : 0;
141rb_darray_free(
void *ary)
149rb_darray_resize_capa_impl(
void *ptr_to_ary,
size_t new_capa,
size_t header_size,
size_t element_size)
151 rb_darray_meta_t **ptr_to_ptr_to_meta = ptr_to_ary;
152 rb_darray_meta_t *meta = *ptr_to_ptr_to_meta;
154 rb_darray_meta_t *new_ary =
xrealloc(meta, new_capa * element_size + header_size);
164 new_ary->capa = new_capa;
168 memcpy(ptr_to_ary, &new_ary,
sizeof(new_ary));
175rb_darray_ensure_space(
void *ptr_to_ary,
size_t header_size,
size_t element_size)
177 rb_darray_meta_t **ptr_to_ptr_to_meta = ptr_to_ary;
178 rb_darray_meta_t *meta = *ptr_to_ptr_to_meta;
179 size_t current_capa = rb_darray_capa(meta);
180 if (rb_darray_size(meta) < current_capa)
return;
183 size_t new_capa = current_capa == 0 ? 1 : current_capa * 2;
185 rb_darray_resize_capa_impl(ptr_to_ary, new_capa, header_size, element_size);
189rb_darray_make_impl(
void *ptr_to_ary,
size_t array_size,
size_t header_size,
size_t element_size)
191 rb_darray_meta_t **ptr_to_ptr_to_meta = ptr_to_ary;
192 if (array_size == 0) {
193 *ptr_to_ptr_to_meta = NULL;
197 rb_darray_meta_t *meta =
xcalloc(array_size * element_size + header_size, 1);
199 meta->size = array_size;
200 meta->capa = array_size;
204 memcpy(ptr_to_ary, &meta,
sizeof(meta));
#define RUBY_ASSERT(...)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
#define xfree
Old name of ruby_xfree.
#define xrealloc
Old name of ruby_xrealloc.
#define xcalloc
Old name of ruby_xcalloc.