#include "list.h" #include "../malloc/malloc.h" list_node_t *__new_list_node(void *value); list_t *new_list() { list_t *list = malloc(sizeof(list_t)); list->first = 0; list->last = 0; list->size = 0; return list; } list_t *from_array(void **array, u64 size) { int i; list_t *list = new_list(); list->size = size; for (i = 0; i < size; ++i) list_append(list, array[i]); return list; } void list_append(list_t *list, void *value) { list_node_t *node = __new_list_node(value); if (list->last == 0) { list->first = node; list->last = list->first; } else { list->last->next = node; node->previous = list->last; list->last = node; } ++list->size; } void list_prepend(list_t *list, void *value) { list_node_t *node = __new_list_node(value); if (list->last == 0) { list->first = node; list->last = list->first; } else { list->first->previous = node; node->next = list->first; list->first = node; } ++list->size; } void *pop_first(list_t *list) { void *value = list->first->value; list_node_t *node = list->first; list->first = node->next; free(node); --list->size; return value; } void *pop_last(list_t *list) { void *value = list->last->value; list_node_t *node = list->last; list->last = node->previous; free(node); --list->size; return value; } list_node_t *__new_list_node(void *value) { list_node_t *node = malloc(sizeof(list_node_t)); node->value = value; node->next = 0; node->previous = 0; return node; }