1 #ifndef lcthw_List_h
2 #define lcthw_List_h
3 
4 #include <stdlib.h>
5 
6 struct ListNode;
7 
8 typedef struct ListNode {
9     struct ListNode *next;
10     struct ListNode *prev;
11     void *value;
12 } ListNode;
13 
14 typedef struct List {
15     int count;
16     ListNode *first;
17     ListNode *last;
18 } List;
19 
20 List *List_create();
21 void List_destroy(List *list);
22 void List_clear(List *list);
23 void List_clear_destroy(List *list);
24 
25 #define List_count(A) ((A)->count)
26 #define List_first(A) ((A)->first != NULL ? (A)->first->value : NULL)
27 #define List_last(A) ((A)->last != NULL ? (A)->last->value : NULL)
28 
29 void List_push(List *list, void *value);
30 void *List_pop(List *list);
31 
32 void List_unshift(List *list, void *value);
33 void *List_shift(List *list);
34 
35 void *List_remove(List *list, ListNode *node);
36 
37 #define LIST_FOREACH(L, S, M, V) ListNode *_node = NULL;\
38     ListNode *V = NULL;\
39     for(V = _node = L->S; _node != NULL; V = _node = _node->M)
40 
41 #endif
42