#pragma once #include struct ListItem; typedef struct ListItem { void *data; struct ListItem *next; struct ListItem *prev; } ListItem; typedef struct { ListItem *head; ListItem *tail; size_t count; } List; List *list_make(); //frees everything void list_free(List *list); //clears the list, but not data void list_clear(List *list); //clears the list, and data void list_free_data(List *list); void list_push_back(void *data, List *list); void list_push_front(void *data, List *list); void *list_pop_back(List *list); void *list_pop_front(List *list); void *list_pop_at(size_t index, List *list); void list_remove_item(void *data, List *list); void list_remove_at(size_t index, List *list); List *list_splice(size_t index, size_t count, List *list); void *list_peek_front(List *list); void *list_peek_index(List *list, size_t index); ListItem *list_get_index(List *list, size_t index); void *list_peek_back(List *list);