#include "xwrap.h" #ifndef L4LIB_BASIC_DATA_STRUCTURE #define L4LIB_BASIC_DATA_STRUCTURE /*********** list ***********/ typedef struct l4lib_list_node{ /* list 中每一個項目用的資料結構,會有很多個 */ struct l4lib_list_node* node_prev; struct l4lib_list_node* node_next; void* node_data; int node_data_size; } ListNode; typedef struct l4lib_list{ /* 管理 list 用的,每個 list 只有一個 */ struct l4lib_list_node* list_first; struct l4lib_list_node* list_last; int list_len; } List; List* list_create(void); void list_free(List*); #define list_prev(node) ((node)->node_prev) #define list_next(node) ((node)->node_next) #define list_len(list) ((list)->list_len) #define list_node_back(list) ((list)->list_last) #define list_node_front(list) ((list)->list_first) #define list_data(node) ((node)->node_data) #define list_datasize(node) ((node)->node_data_size) ListNode* list_insert_prev(List*, ListNode*, const void*, int); ListNode* list_insert_next(List*, ListNode*, const void*, int); void list_remove(List*, ListNode*); #define list_pushback(list,data,size) \ (list_insert_next((list),(list_node_back(list)),(data),(size))) #define list_pushfront(list,data,size) \ (list_insert_prev((list),(list_node_front(list)),(data),(size))) #define list_popback(list) \ (list_remove((list),(list_node_back((list))))) #define list_popfront(list) \ (list_remove((list),(list_node_front((list))))) ListNode* list_goto(ListNode*, int); /*********** stack ***********/ typedef List Stack; #define stack_create() (list_create()) #define stack_free(list) (list_free(list)) #define stack_push(list,data,size) (list_pushback((list),(data),(size))) #define stack_pop(list) (list_popback(list)) #define stack_len(list) (list_len(list)) #define stack_data(list) (list_data(list_node_back(list))) #define stack_datasize(list) (list_datasize(list_node_back(list))) /*********** queue ***********/ typedef List Queue; #define queue_create() (list_create()) #define queue_free(list) (list_free(list)) #define queue_push(list,data,size) (list_pushback((list),(data),(size))) #define queue_pop(list) (list_popfront(list)) #define queue_len(list) (list_len(list)) #define queue_frontdata(list) (list_data(list_node_front(list))) #define queue_frontdatasize(list) (list_datasize(list_node_front(list))) #define queue_backdata(list) (list_data(list_node_back(list))) #define queue_backdatasize(list) (list_datasize(list_node_back(list))) #define queue_data(list) (queue_frontdata(list)) #define queue_datasize(list) (queue_frontdatasize(list)) #endif