48 "LIST(<type>).base and LIST(<type>).impl.base will not alias each other");
70#define LIST_DTOR_FREE ((void *)1)
80#define LIST_SIZE(list) gv_list_size_((list)->impl)
90#define LIST_IS_EMPTY(list) (LIST_SIZE(list) == 0)
101#define LIST_TRY_APPEND(list, item) \
102 gv_list_try_append_(&(list)->impl, \
103 ((list)->scratch = (item), &(list)->scratch), \
104 sizeof((list)->base[0]))
124#define LIST_APPEND(list, ...) \
126 (list)->scratch = (__VA_ARGS__); \
127 const size_t slot_ = \
128 gv_list_append_slot_(&(list)->impl, sizeof((list)->base[0])); \
129 (list)->base[slot_] = (list)->scratch; \
142#define LIST_PREPEND(list, item) \
144 (list)->scratch = (item); \
145 const size_t slot_ = \
146 gv_list_prepend_slot_(&(list)->impl, sizeof((list)->base[0])); \
147 (list)->base[slot_] = (list)->scratch; \
159#define LIST_GET(list, index) \
160 ((list)->base[gv_list_get_((list)->impl, (index))])
172#define LIST_AT(list, index) \
173 (&(list)->base[gv_list_get_((list)->impl, (index))])
184#define LIST_FRONT(list) LIST_AT((list), 0)
195#define LIST_BACK(list) LIST_AT((list), LIST_SIZE(list) - 1)
206#define LIST_SET(list, index, item) \
208 (list)->scratch = (item); \
209 const size_t slot_ = gv_list_get_((list)->impl, (index)); \
210 LIST_DTOR_((list), slot_); \
211 (list)->base[slot_] = (list)->scratch; \
222#define LIST_REMOVE(list, item) \
225 (list)->scratch = (item); \
227 const size_t found_ = gv_list_find_((list)->impl, &(list)->scratch, \
228 sizeof((list)->base[0])); \
229 if (found_ == SIZE_MAX) { \
233 LIST_DTOR_((list), found_); \
234 gv_list_remove_(&(list)->impl, found_, sizeof((list)->base[0])); \
244#define LIST_CLEAR(list) \
246 for (size_t i_ = 0; i_ < LIST_SIZE(list); ++i_) { \
247 const size_t slot_ = gv_list_get_((list)->impl, i_); \
248 LIST_DTOR_((list), slot_); \
250 gv_list_clear_(&(list)->impl, sizeof((list)->base[0])); \
261#define LIST_RESERVE(list, capacity) \
262 gv_list_reserve_(&(list)->impl, capacity, sizeof((list)->base[0]))
277#define LIST_CONTAINS(list, needle) \
278 gv_list_contains_((list)->impl, \
279 ((void)((list)->base == &(needle)), &(needle)), \
280 sizeof((list)->base[0]))
293#define LIST_COPY(list_type, src) \
294 ((list_type){.impl = gv_list_copy_((src)->impl, sizeof((src)->base[0])), \
295 .dtor = (src)->dtor})
318#define LIST_IS_CONTIGUOUS(list) gv_list_is_contiguous_((list)->impl);
330#define LIST_SYNC(list) gv_list_sync_(&(list)->impl, sizeof((list)->base[0]))
341#define LIST_SORT(list, cmp) \
342 gv_list_sort_(&(list)->impl, (cmp), sizeof((list)->base[0]))
351#define LIST_REVERSE(list) \
352 gv_list_reverse_(&(list)->impl, sizeof((list)->base[0]))
361#define LIST_SHRINK_TO_FIT(list) \
362 gv_list_shrink_to_fit_(&(list)->impl, sizeof((list)->base[0]))
373#define LIST_FREE(list) \
376 gv_list_free_(&(list)->impl); \
391#define LIST_PUSH_BACK(list, ...) LIST_APPEND((list), (__VA_ARGS__))
401#define LIST_POP_FRONT(list) \
402 (gv_list_pop_front_(&(list)->impl, &(list)->scratch, \
403 sizeof((list)->base[0])), \
414#define LIST_POP_BACK(list) \
415 (gv_list_pop_back_(&(list)->impl, &(list)->scratch, \
416 sizeof((list)->base[0])), \
429#define LIST_DROP_BACK(list) \
431 const size_t slot_ = gv_list_get_((list)->impl, LIST_SIZE(list) - 1); \
432 LIST_DTOR_((list), slot_); \
433 gv_list_pop_back_(&(list)->impl, &(list)->scratch, \
434 sizeof((list)->base[0])); \
450#define LIST_DETACH(list, datap, sizep) \
451 gv_list_detach_(&(list)->impl, ((void)(&(list)->base == (datap)), (datap)), \
452 (sizep), sizeof((list)->base[0]))
internal implementation details of list.h