9c054361106877f0f3277213cdd3c2fe73f9729a
[scp/ocu/5gnr.git] / Include / vos_linklist.h
1 /******************************************************************************
2 ###############################################################################
3 #   Copyright (c) [2017-2020] [ICT/CAS]                                        #
4 #   Licensed under the ORAN Software License v1.0 (License)             #
5 ###############################################################################
6 ******************************************************************************/
7
8
9
10 #ifndef _VOS_LINKLIST_H
11 #define _VOS_LINKLIST_H
12
13 #ifdef __cplusplus
14 extern"C"{
15 #endif
16
17 /** 链表节点 */
18 typedef struct cl_lib_listnode
19 {
20     struct cl_lib_listnode *next;
21     struct cl_lib_listnode *prev;
22     void *data;
23 }*plistnode;
24
25 /** 链表名长度 */
26 #define LIST_NAME_LEN (48)
27
28 /** 链表节 */
29 typedef struct cl_lib_list
30 {
31     struct cl_lib_listnode *head;
32     struct cl_lib_listnode *tail;
33     char name[LIST_NAME_LEN];
34     unsigned long moduleID;
35     unsigned int count;
36     int ( *cmp ) ( void *val1, void *val2 );
37     void ( *del ) ( void *val );
38 }*plist;
39
40
41 /** 获得链表头 */
42 #define cl_lib_listhead(X) ((X)->head)
43
44 /** 获得链表尾 */
45 #define cl_lib_listtail(X) ((X)->tail)
46
47 /** 获得下个节点 */
48 #define cl_lib_nextnode(X) ((X) = (X)->next)
49
50 /** 获得上个节点 */
51 #define cl_lib_prevnode(X) ((X) = (X)->prev)
52
53 /** 获得链表中节点数量 */
54 #define cl_lib_listcount(X) ((X)->count)
55
56 /** 链表为空 */
57 #define cl_lib_list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
58
59 /** 获得节点中的数据 */
60 #define cl_lib_getdata(X) ((X)->data)
61
62 /** 
63  * 创建一个linklist
64  * @param[in]   name      list名  最大长度 LIST_NAME_LEN
65  * @param[in]   moduleID  创建list的模块ID
66  * @return      成功时返回新list地址,失败则返回NULL。
67  */ 
68 struct cl_lib_list *cl_lib_list_new (char *name,unsigned long moduleID);
69
70
71
72 /** 
73  * free并删除linklist中的所有节点,然后free该list
74  * !!!注意,如果data也需要free,则需要实现list的del成员
75  * @param[in]   plist1      要删除的list
76  */
77 void cl_lib_list_delete ( struct cl_lib_list * plist1 );
78
79 /** 
80  * 将数据添加到链表尾,直接传入要添加的数据,该API会自动创建节点
81  * @param[in]   plist1      待添加的list
82  * @param[in]   val         待添加的数据
83  */
84 void cl_lib_listnode_add ( struct cl_lib_list * plist1, void * val );
85
86
87 /** 
88  * 将数据添加到链表头,直接传入要添加的数据,该API会自动创建节点
89  * @param[in]   plist1      待添加的list
90  * @param[in]   val         待添加的数据
91  */
92 void cl_lib_listnode_add_toHead ( struct cl_lib_list * plist1, void * val );
93
94 /** 
95  * 删除数据等于val的节点,!!!不会free 数据
96  * @param[in]   plist1      待删除的list
97  * @param[in]   val         待删除的数据
98  */
99 void cl_lib_listnode_delete ( struct cl_lib_list * plist1, void * val );
100
101 /** 
102  * 根据注册的cmp函数删除节点,cmd 返回值为0 时删除,!!!不会free 数据
103  * @param[in]   plist1      待删除的list
104  * @param[in]   val         cmp 函数参数
105  * @return      成功时返回被删除节点数据地址,用于free数据,失败则返回NULL。
106  */
107 void *cl_lib_listnode_cmp_delete ( struct cl_lib_list * plist1, void * val );
108
109 /** 
110  * 在当前节点前插入数据
111  * @param[in]   plist1      待插入数据的list
112  * @param[in]   currentnode 当前节点
113  * @param[in]   val         待插入数据
114  */
115 void cl_lib_list_add_node_prev ( plist plist1, plistnode currentnode, void *val );
116
117 /** 
118  * 在当前节点后插入数据
119  * @param[in]   plist1      待插入数据的list
120  * @param[in]   currentnode 当前节点
121  * @param[in]   val         待插入数据
122  */
123 void cl_lib_list_add_node_next ( plist plist1, plistnode currentnode, void *val );
124
125 /** 
126  * 节点查找 API,根据给定val查找
127  * !!!用此API 需要确保 plist->cmp 成员已赋值,否则无法查找
128  * !!!不可修改获得节点的 prev 和 next指针
129  * !!!不可释放获得节点
130  * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据
131  * @param[in]   plist1      要查找的list
132  * @param[in]   data        进行比较的数据
133  * @return      找到返回节点指针,未找到返回 NULL。
134  */
135 plistnode cl_lib_listnode_lookup_by_val( plist plist1, void *data );
136
137
138 /** 
139  * 节点查找 API,根据给定val和cmp方法查找
140  * !!!不可修改获得节点的 prev 和 next指针
141  * !!!不可释放获得节点
142  * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据
143  * @param[in]   plist1      要查找的list
144  * @param[in]   cmp         比较函数,当val1 与val2相等时返回0,不相等时返回非0值
145  * @param[in]   data        进行比较的数据
146  * @return      找到返回节点指针,未找到返回 NULL。
147  */
148 plistnode cl_lib_listnode_lookup_by_func( plist plist1, int (*cmp)(void *val1, void *val2),void *data);
149
150
151 /** 
152  * 查找到的节点,如果想要从链表中删除,必须使用该接口
153  * !!!注意,如果data也需要free,则需要实现list的del成员
154  * @param[in]   plist1      list
155  * @param[in]   node        要删除的节点
156  */
157 void cl_lib_list_delete_node ( plist plist1, plistnode node );
158
159
160 #ifdef __cplusplus
161 }
162 #endif
163
164 #endif /* _VOS_LINKLIST_H */