typedef struct X##_list { \
X* entries; \
int count; \
int capacity; \
} X##_list; \
\
int X##_list_init(X##_list *list); \
int X##_list_init_with_allocator(X##_list *list,
const kest_allocator *alloc); \
int X##_list_init_reserved(X##_list *list, size_t n); \
int X##_list_init_reserved_with_allocator(X##_list *list,
size_t n,
const kest_allocator *alloc); \
int X##_list_reserve(X##_list *list, size_t n); \
int X##_list_append(X##_list *list, X x); \
int X##_list_append_ref(X##_list *list, const X *x); \
int X##_list_destroy(X##_list *list); \
int X##_list_destroy_all(X##_list *list, void (*destructor)(X *x)); \
int X##_list_contains(X##_list *list, X x, int (*cmp)(const X*, const X*)); \
int X##_list_contains_ref(X##_list *list, const X *x, int (*cmp)(const X*, const X*)); \
int X##_list_index_of(X##_list *list, X x, int (*cmp)(const X*, const X*)); \
int X##_list_index_of_ref(X##_list *list, const X *x, int (*cmp)(const X*, const X*));\
X *X##_list_head(X##_list *list);\
X *X##_list_tail(X##_list *list);\
int X##_list_pop_tail(X##_list *list);\
int X##_list_pop_destroy_tail(X##_list *list, void (*destructor)(X *x));\
int X##_list_append_list(X##_list *list, X##_list *a);\
int X##_list_drain_destroy(X##_list *list, void (*destructor)(X *x));\
int X##_list_drain(X##_list *list);