4 typedef struct list_node_s list_node_t;
12 struct list_iterator_s {
16 list_t *list_create(void) {
17 list_t *list = memory_allocate(sizeof(list_t));
25 void *list_node_create(void *element) {
26 list_node_t *node = memory_allocate(sizeof(list_node_t));
27 node->element = element;
33 void list_push(list_t *list, void *element) {
34 list_node_t *node = list_node_create(element);
38 list->tail->next = node;
39 node->prev = list->tail;
45 void *list_pop(list_t *list) {
48 void *element = list->tail->element;
49 list->tail = list->tail->prev;
51 list->tail->next = NULL;
58 void *list_shift(list_t *list) {
61 void *element = list->head->element;
62 list->head = list->head->next;
64 list->head->prev = NULL;
71 int list_length(list_t *list) {
75 list_iterator_t *list_iterator(list_t *list) {
76 list_iterator_t *iter = memory_allocate(sizeof(list_iterator_t));
77 iter->pointer = list->head;
81 void *list_iterator_next(list_iterator_t *iter) {
87 ret = iter->pointer->element;
88 iter->pointer = iter->pointer->next;
93 bool list_iterator_end(list_iterator_t *iter) {
94 return !iter->pointer;
97 static void list_shiftify(list_t *list, void *element) {
98 list_node_t *node = list_node_create(element);
99 node->next = list->head;
101 list->head->prev = node;
108 list_t *list_reverse(list_t *list) {
109 list_t *ret = list_create();
110 for (list_iterator_t *it = list_iterator(list); !list_iterator_end(it); )
111 list_shiftify(ret, list_iterator_next(it));
115 void *list_tail(list_t *list) {
119 list_node_t *node = list->head;
123 return node->element;
126 void *list_head(list_t *list) {
127 return list->head->element;
130 void list_empty(list_t *list) {
136 list_t *list_default(void *item) {
137 list_t *list = list_create();
138 list_push(list, item);