summaryrefslogtreecommitdiffstats
path: root/hw1/basic-list.h
blob: 057ecce866710b996f3901cb1eb0414b3ae3f7b5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#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