1 /******************************************************************************
2 ###############################################################################
3 # Copyright (c) [2017-2020] [ICT/CAS] #
4 # Licensed under the ORAN Software License v1.0 (License) #
5 ###############################################################################
6 ******************************************************************************/
10 #ifndef _VOS_LINKLIST_H
11 #define _VOS_LINKLIST_H
18 typedef struct cl_lib_listnode
20 struct cl_lib_listnode *next;
21 struct cl_lib_listnode *prev;
26 #define LIST_NAME_LEN (48)
29 typedef struct cl_lib_list
31 struct cl_lib_listnode *head;
32 struct cl_lib_listnode *tail;
33 char name[LIST_NAME_LEN];
34 unsigned long moduleID;
36 int ( *cmp ) ( void *val1, void *val2 );
37 void ( *del ) ( void *val );
42 #define cl_lib_listhead(X) ((X)->head)
45 #define cl_lib_listtail(X) ((X)->tail)
48 #define cl_lib_nextnode(X) ((X) = (X)->next)
51 #define cl_lib_prevnode(X) ((X) = (X)->prev)
54 #define cl_lib_listcount(X) ((X)->count)
57 #define cl_lib_list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
60 #define cl_lib_getdata(X) ((X)->data)
64 * @param[in] name list名 最大长度 LIST_NAME_LEN
65 * @param[in] moduleID 创建list的模块ID
66 * @return 成功时返回新list地址,失败则返回NULL。
68 struct cl_lib_list *cl_lib_list_new (char *name,unsigned long moduleID);
73 * free并删除linklist中的所有节点,然后free该list
74 * !!!注意,如果data也需要free,则需要实现list的del成员
75 * @param[in] plist1 要删除的list
77 void cl_lib_list_delete ( struct cl_lib_list * plist1 );
80 * 将数据添加到链表尾,直接传入要添加的数据,该API会自动创建节点
81 * @param[in] plist1 待添加的list
82 * @param[in] val 待添加的数据
84 void cl_lib_listnode_add ( struct cl_lib_list * plist1, void * val );
88 * 将数据添加到链表头,直接传入要添加的数据,该API会自动创建节点
89 * @param[in] plist1 待添加的list
90 * @param[in] val 待添加的数据
92 void cl_lib_listnode_add_toHead ( struct cl_lib_list * plist1, void * val );
95 * 删除数据等于val的节点,!!!不会free 数据
96 * @param[in] plist1 待删除的list
97 * @param[in] val 待删除的数据
99 void cl_lib_listnode_delete ( struct cl_lib_list * plist1, void * val );
102 * 根据注册的cmp函数删除节点,cmd 返回值为0 时删除,!!!不会free 数据
103 * @param[in] plist1 待删除的list
104 * @param[in] val cmp 函数参数
105 * @return 成功时返回被删除节点数据地址,用于free数据,失败则返回NULL。
107 void *cl_lib_listnode_cmp_delete ( struct cl_lib_list * plist1, void * val );
111 * @param[in] plist1 待插入数据的list
112 * @param[in] currentnode 当前节点
113 * @param[in] val 待插入数据
115 void cl_lib_list_add_node_prev ( plist plist1, plistnode currentnode, void *val );
119 * @param[in] plist1 待插入数据的list
120 * @param[in] currentnode 当前节点
121 * @param[in] val 待插入数据
123 void cl_lib_list_add_node_next ( plist plist1, plistnode currentnode, void *val );
127 * !!!用此API 需要确保 plist->cmp 成员已赋值,否则无法查找
128 * !!!不可修改获得节点的 prev 和 next指针
130 * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据
131 * @param[in] plist1 要查找的list
132 * @param[in] data 进行比较的数据
133 * @return 找到返回节点指针,未找到返回 NULL。
135 plistnode cl_lib_listnode_lookup_by_val( plist plist1, void *data );
139 * 节点查找 API,根据给定val和cmp方法查找
140 * !!!不可修改获得节点的 prev 和 next指针
142 * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据
143 * @param[in] plist1 要查找的list
144 * @param[in] cmp 比较函数,当val1 与val2相等时返回0,不相等时返回非0值
145 * @param[in] data 进行比较的数据
146 * @return 找到返回节点指针,未找到返回 NULL。
148 plistnode cl_lib_listnode_lookup_by_func( plist plist1, int (*cmp)(void *val1, void *val2),void *data);
152 * 查找到的节点,如果想要从链表中删除,必须使用该接口
153 * !!!注意,如果data也需要free,则需要实现list的del成员
154 * @param[in] plist1 list
155 * @param[in] node 要删除的节点
157 void cl_lib_list_delete_node ( plist plist1, plistnode node );
164 #endif /* _VOS_LINKLIST_H */