X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Include%2Fvos_linklist.h;fp=Include%2Fvos_linklist.h;h=9c054361106877f0f3277213cdd3c2fe73f9729a;hb=1f71b9a76eacf92b39c1ce6f782f8404a34f60a9;hp=0000000000000000000000000000000000000000;hpb=254694245736881ecfff4eb0d1503bf3f49a21be;p=scp%2Focu%2F5gnr.git diff --git a/Include/vos_linklist.h b/Include/vos_linklist.h new file mode 100644 index 0000000..9c05436 --- /dev/null +++ b/Include/vos_linklist.h @@ -0,0 +1,164 @@ +/****************************************************************************** +############################################################################### +# Copyright (c) [2017-2020] [ICT/CAS] # +# Licensed under the ORAN Software License v1.0 (License) # +############################################################################### +******************************************************************************/ + + + +#ifndef _VOS_LINKLIST_H +#define _VOS_LINKLIST_H + +#ifdef __cplusplus +extern"C"{ +#endif + +/** 链表节点 */ +typedef struct cl_lib_listnode +{ + struct cl_lib_listnode *next; + struct cl_lib_listnode *prev; + void *data; +}*plistnode; + +/** 链表名长度 */ +#define LIST_NAME_LEN (48) + +/** 链表节 */ +typedef struct cl_lib_list +{ + struct cl_lib_listnode *head; + struct cl_lib_listnode *tail; + char name[LIST_NAME_LEN]; + unsigned long moduleID; + unsigned int count; + int ( *cmp ) ( void *val1, void *val2 ); + void ( *del ) ( void *val ); +}*plist; + + +/** 获得链表头 */ +#define cl_lib_listhead(X) ((X)->head) + +/** 获得链表尾 */ +#define cl_lib_listtail(X) ((X)->tail) + +/** 获得下个节点 */ +#define cl_lib_nextnode(X) ((X) = (X)->next) + +/** 获得上个节点 */ +#define cl_lib_prevnode(X) ((X) = (X)->prev) + +/** 获得链表中节点数量 */ +#define cl_lib_listcount(X) ((X)->count) + +/** 链表为空 */ +#define cl_lib_list_isempty(X) ((X)->head == NULL && (X)->tail == NULL) + +/** 获得节点中的数据 */ +#define cl_lib_getdata(X) ((X)->data) + +/** + * 创建一个linklist + * @param[in] name list名 最大长度 LIST_NAME_LEN + * @param[in] moduleID 创建list的模块ID + * @return 成功时返回新list地址,失败则返回NULL。 + */ +struct cl_lib_list *cl_lib_list_new (char *name,unsigned long moduleID); + + + +/** + * free并删除linklist中的所有节点,然后free该list + * !!!注意,如果data也需要free,则需要实现list的del成员 + * @param[in] plist1 要删除的list + */ +void cl_lib_list_delete ( struct cl_lib_list * plist1 ); + +/** + * 将数据添加到链表尾,直接传入要添加的数据,该API会自动创建节点 + * @param[in] plist1 待添加的list + * @param[in] val 待添加的数据 + */ +void cl_lib_listnode_add ( struct cl_lib_list * plist1, void * val ); + + +/** + * 将数据添加到链表头,直接传入要添加的数据,该API会自动创建节点 + * @param[in] plist1 待添加的list + * @param[in] val 待添加的数据 + */ +void cl_lib_listnode_add_toHead ( struct cl_lib_list * plist1, void * val ); + +/** + * 删除数据等于val的节点,!!!不会free 数据 + * @param[in] plist1 待删除的list + * @param[in] val 待删除的数据 + */ +void cl_lib_listnode_delete ( struct cl_lib_list * plist1, void * val ); + +/** + * 根据注册的cmp函数删除节点,cmd 返回值为0 时删除,!!!不会free 数据 + * @param[in] plist1 待删除的list + * @param[in] val cmp 函数参数 + * @return 成功时返回被删除节点数据地址,用于free数据,失败则返回NULL。 + */ +void *cl_lib_listnode_cmp_delete ( struct cl_lib_list * plist1, void * val ); + +/** + * 在当前节点前插入数据 + * @param[in] plist1 待插入数据的list + * @param[in] currentnode 当前节点 + * @param[in] val 待插入数据 + */ +void cl_lib_list_add_node_prev ( plist plist1, plistnode currentnode, void *val ); + +/** + * 在当前节点后插入数据 + * @param[in] plist1 待插入数据的list + * @param[in] currentnode 当前节点 + * @param[in] val 待插入数据 + */ +void cl_lib_list_add_node_next ( plist plist1, plistnode currentnode, void *val ); + +/** + * 节点查找 API,根据给定val查找 + * !!!用此API 需要确保 plist->cmp 成员已赋值,否则无法查找 + * !!!不可修改获得节点的 prev 和 next指针 + * !!!不可释放获得节点 + * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据 + * @param[in] plist1 要查找的list + * @param[in] data 进行比较的数据 + * @return 找到返回节点指针,未找到返回 NULL。 + */ +plistnode cl_lib_listnode_lookup_by_val( plist plist1, void *data ); + + +/** + * 节点查找 API,根据给定val和cmp方法查找 + * !!!不可修改获得节点的 prev 和 next指针 + * !!!不可释放获得节点 + * !!!如果替换获得节点的data数据,如果旧的data需要释放,需自己手动释放data数据 + * @param[in] plist1 要查找的list + * @param[in] cmp 比较函数,当val1 与val2相等时返回0,不相等时返回非0值 + * @param[in] data 进行比较的数据 + * @return 找到返回节点指针,未找到返回 NULL。 + */ +plistnode cl_lib_listnode_lookup_by_func( plist plist1, int (*cmp)(void *val1, void *val2),void *data); + + +/** + * 查找到的节点,如果想要从链表中删除,必须使用该接口 + * !!!注意,如果data也需要free,则需要实现list的del成员 + * @param[in] plist1 list + * @param[in] node 要删除的节点 + */ +void cl_lib_list_delete_node ( plist plist1, plistnode node ); + + +#ifdef __cplusplus +} +#endif + +#endif /* _VOS_LINKLIST_H */