49 "LIST(<type>).base and LIST(<type>).impl.base will not alias each other");
82#define LIST_DTOR_FREE ((void *)1)
92#define LIST_SIZE(list) gv_list_size_((list)->impl)
102#define LIST_IS_EMPTY(list) (LIST_SIZE(list) == 0)
114#define LIST_TRY_APPEND(list, item) \
115 gv_list_try_append_(&(list)->impl, (TYPEOF((list)->base[0])[1]){item}, \
116 sizeof((list)->base[0]))
118#define LIST_TRY_APPEND(list, item) \
119 gv_list_try_append_(&(list)->impl, \
120 ((list)->scratch = (item), &(list)->scratch), \
121 sizeof((list)->base[0]))
143#define LIST_APPEND(list, ...) \
145 TYPEOF((list)->base[0]) scratch_ = (__VA_ARGS__); \
146 const size_t slot_ = \
147 gv_list_append_slot_(&(list)->impl, sizeof((list)->base[0])); \
148 (list)->base[slot_] = scratch_; \
151#define LIST_APPEND(list, ...) \
153 (list)->scratch = (__VA_ARGS__); \
154 const size_t slot_ = \
155 gv_list_append_slot_(&(list)->impl, sizeof((list)->base[0])); \
156 (list)->base[slot_] = (list)->scratch; \
171#define LIST_PREPEND(list, item) \
173 TYPEOF((list)->base[0]) scratch_ = (item); \
174 const size_t slot_ = \
175 gv_list_prepend_slot_(&(list)->impl, sizeof((list)->base[0])); \
176 (list)->base[slot_] = scratch_; \
179#define LIST_PREPEND(list, item) \
181 (list)->scratch = (item); \
182 const size_t slot_ = \
183 gv_list_prepend_slot_(&(list)->impl, sizeof((list)->base[0])); \
184 (list)->base[slot_] = (list)->scratch; \
197#define LIST_GET(list, index) \
198 ((list)->base[gv_list_get_((list)->impl, (index))])
210#define LIST_AT(list, index) \
211 (&(list)->base[gv_list_get_((list)->impl, (index))])
222#define LIST_FRONT(list) LIST_AT((list), 0)
233#define LIST_BACK(list) LIST_AT((list), LIST_SIZE(list) - 1)
245#define LIST_SET(list, index, item) \
247 TYPEOF((list)->base[0]) scratch_ = (item); \
248 const size_t slot_ = gv_list_get_((list)->impl, (index)); \
249 LIST_DTOR_((list), slot_); \
250 (list)->base[slot_] = scratch_; \
253#define LIST_SET(list, index, item) \
255 (list)->scratch = (item); \
256 const size_t slot_ = gv_list_get_((list)->impl, (index)); \
257 LIST_DTOR_((list), slot_); \
258 (list)->base[slot_] = (list)->scratch; \
271#define LIST_REMOVE(list, item) \
273 const size_t found_ = \
274 gv_list_find_((list)->impl, (TYPEOF((list)->base[0])[1]){item}, \
275 sizeof((list)->base[0])); \
276 if (found_ == SIZE_MAX) { \
280 LIST_DTOR_((list), found_); \
281 gv_list_remove_(&(list)->impl, found_, sizeof((list)->base[0])); \
284#define LIST_REMOVE(list, item) \
287 (list)->scratch = (item); \
289 const size_t found_ = gv_list_find_((list)->impl, &(list)->scratch, \
290 sizeof((list)->base[0])); \
291 if (found_ == SIZE_MAX) { \
295 LIST_DTOR_((list), found_); \
296 gv_list_remove_(&(list)->impl, found_, sizeof((list)->base[0])); \
307#define LIST_CLEAR(list) \
309 for (size_t i_ = 0; i_ < LIST_SIZE(list); ++i_) { \
310 const size_t slot_ = gv_list_get_((list)->impl, i_); \
311 LIST_DTOR_((list), slot_); \
313 gv_list_clear_(&(list)->impl, sizeof((list)->base[0])); \
324#define LIST_RESERVE(list, capacity) \
325 gv_list_reserve_(&(list)->impl, capacity, sizeof((list)->base[0]))
340#define LIST_CONTAINS(list, needle) \
341 gv_list_contains_((list)->impl, \
342 ((void)((list)->base == &(needle)), &(needle)), \
343 sizeof((list)->base[0]))
356#define LIST_COPY(list_type, src) \
357 ((list_type){.impl = gv_list_copy_((src)->impl, sizeof((src)->base[0])), \
358 .dtor = (src)->dtor})
370#define LIST_SYNC(list) gv_list_sync_(&(list)->impl, sizeof((list)->base[0]))
381#define LIST_SORT(list, cmp) \
382 gv_list_sort_(&(list)->impl, (cmp), sizeof((list)->base[0]))
391#define LIST_REVERSE(list) \
392 gv_list_reverse_(&(list)->impl, sizeof((list)->base[0]))
401#define LIST_SHRINK_TO_FIT(list) \
402 gv_list_shrink_to_fit_(&(list)->impl, sizeof((list)->base[0]))
413#define LIST_FREE(list) \
416 gv_list_free_(&(list)->impl); \
431#define LIST_PUSH_BACK(list, ...) LIST_APPEND((list), (__VA_ARGS__))
442#define LIST_POP_FRONT(list) \
443 (*(TYPEOF((list)->base))gv_list_pop_front_(&(list)->impl, \
444 (TYPEOF((list)->base[0])[1]){0}, \
445 sizeof((list)->base[0])))
447#define LIST_POP_FRONT(list) \
448 ((void)gv_list_pop_front_(&(list)->impl, &(list)->scratch, \
449 sizeof((list)->base[0])), \
462#define LIST_POP_BACK(list) \
463 (*(TYPEOF((list)->base))gv_list_pop_back_(&(list)->impl, \
464 (TYPEOF((list)->base[0])[1]){0}, \
465 sizeof((list)->base[0])))
467#define LIST_POP_BACK(list) \
468 ((void)gv_list_pop_back_(&(list)->impl, &(list)->scratch, \
469 sizeof((list)->base[0])), \
483#define LIST_DROP_BACK(list) \
485 const size_t slot_ = gv_list_get_((list)->impl, LIST_SIZE(list) - 1); \
486 LIST_DTOR_((list), slot_); \
487 (void)gv_list_pop_back_(&(list)->impl, (char[sizeof((list)->base[0])]){0}, \
488 sizeof((list)->base[0])); \
504#define LIST_DETACH(list, datap, sizep) \
505 gv_list_detach_(&(list)->impl, ((void)(&(list)->base == (datap)), (datap)), \
506 (sizep), sizeof((list)->base[0]))
internal implementation details of list.h