#ifndef DBL_LIST_H #define DBL_LIST_H #include "../../common/aliases/aliases.h" #ifdef __cplusplus BEGIN_C_LINKAGE #endif // !__cplusplus #define DBL_NODE(T) T##Node #define DBL_LIST(T) T##List #define CAST_NODE(NODE) ((DBL_NODE(void))(NODE)) #define CAST_LIST(LIST) ((DBL_LIST(void))(LIST)) #define CAST_NODE_PTR(NODE_PTR) ((DBL_NODE(void)*)(NODE_PTR)) #define CAST_LIST_PTR(LIST_PTR) ((DBL_LIST(void)*)(LIST_PTR)) #define DBL_LIST_DECL(T) typedef struct DBL_NODE(T) DBL_NODE(T); \ struct DBL_NODE(T) { \ T *item; \ DBL_NODE(T) *prev; \ DBL_NODE(T) *next; \ }; \ \ typedef struct DBL_LIST(T) DBL_LIST(T); \ struct DBL_LIST(T) { \ DBL_NODE(T) *first; \ DBL_NODE(T) *last; \ u64 node_count; \ } DBL_LIST_DECL(void); #define wapp_dbl_list_node_from_item(T, ITEM_PTR) ((DBL_NODE(T)){ .item = ITEM_PTR }) #define wapp_dbl_list_get(T, LIST_PTR, INDEX) \ (DBL_NODE(T)*)_dbl_list_get(CAST_LIST_PTR(LIST_PTR), INDEX) #define wapp_dbl_list_push_front(T, LIST_PTR, NODE_PTR) \ _dbl_list_push_front(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR)) #define wapp_dbl_list_push_back(T, LIST_PTR, NODE_PTR) \ _dbl_list_push_back(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR)) #define wapp_dbl_list_insert(T, LIST_PTR, NODE_PTR, INDEX) \ _dbl_list_insert(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR), INDEX) #define wapp_dbl_list_pop_front(T, LIST_PTR) \ (DBL_NODE(T)*)_dbl_list_pop_front(CAST_LIST_PTR(LIST_PTR)) #define wapp_dbl_list_pop_back(T, LIST_PTR) \ (DBL_NODE(T)*)_dbl_list_pop_back(CAST_LIST_PTR(LIST_PTR)) #define wapp_dbl_list_remove(T, LIST_PTR, INDEX) \ (DBL_NODE(T)*)_dbl_list_remove(CAST_LIST_PTR(LIST_PTR), INDEX) #define wapp_dbl_list_empty(T, LIST_PTR) \ _dbl_list_empty(CAST_LIST_PTR(LIST_PTR)) DBL_NODE(void) *_dbl_list_get(const DBL_LIST(void) *list, u64 index); void _dbl_list_push_front(DBL_LIST(void) *list, DBL_NODE(void) *node); void _dbl_list_push_back(DBL_LIST(void) *list, DBL_NODE(void) *node); void _dbl_list_insert(DBL_LIST(void) *list, DBL_NODE(void) *node, u64 index); DBL_NODE(void) *_dbl_list_pop_front(DBL_LIST(void) *list); DBL_NODE(void) *_dbl_list_pop_back(DBL_LIST(void) *list); DBL_NODE(void) *_dbl_list_remove(DBL_LIST(void) *list, u64 index); void _dbl_list_empty(DBL_LIST(void) *list); #ifdef __cplusplus END_C_LINKAGE #endif // !__cplusplus #endif // !DBL_LIST_H