#ifndef lcthw_List_h #define lcthw_List_h #include #include struct ListNode; typedef struct ListNode { struct ListNode *next; struct ListNode *prev; void *value; } ListNode; typedef struct List { int count; ListNode *first; ListNode *last; } List; List *List_create(); void List_destroy(List *list); void List_clear(List *list); void List_clear_destroy(List *list); #define List_count(A) ((A)->count) #define List_first(A) ((A)->first != NULL ? (A)->first->value : NULL) #define List_last(A) ((A)->last != NULL ? (A)->last->value : NULL) void List_push(List *list, void *value); void *List_pop(List *list); void List_unshift(List *list, void *value); void *List_shift(List *list); void *List_remove(List *list, ListNode *node); List *List_copy(List *list); int List_split(List *list, void *split, List *a, List *b); void List_join(List *list, List *b); void List_swap(ListNode *a, ListNode *b); void List_dump(List *list); #define List_validate(A) (assert(A != NULL && List_count(A) > -1 &&\ (List_count(A) > 0 && List_first(A) != NULL) && "invalid *List")) #define LIST_FOREACH(L, F, N, C) ListNode *_node = NULL;\ ListNode *C = NULL;\ for(C = _node = L->F; _node != NULL; C = _node = _node->N) #endif