这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
介绍一个类似Linux的链表实现,和 Linux 的实现对比。
TBOX 中的 list_entry
元素在外部维护的双向链表。
类似Linux的链表结构,链表容器本身不存储元素,不开辟内存空间,仅仅是一个节点头,这样比较节省内存,更加灵活。(尤其是在多个链表间元素迁移的时候,或者多个链表需要统一内存池维护的时候)。
存储方式
/*! the doubly-linked list entry type
*
* <pre>
* list: list => ... => last
* | |
* <---------------
*
* </pre>
*/
typedef struct __tb_list_entry_t
{
/// the next entry
struct __tb_list_entry_t* next;
/// the prev entry
struct __tb_list_entry_t* prev;
}tb_list_entry_t, *tb_list_entry_ref_t;
/// the list entry head type
typedef struct __tb_list_entry_head_t
{
/// the next entry
struct __tb_list_entry_t* next;
/// the prev entry
struct __tb_list_entry_t* prev;
/// the list size
tb_size_t size;
/// the iterator
tb_iterator_t itor;
/// the entry offset
tb_size_t eoff;
/// the entry copy func
tb_entry_copy_t copy;
}tb_list_entry_head_t, *tb_list_entry_head_ref_t;
tb_list_entry_init
// 初始化链表,需要指定外置元素的结构体类型,链表的节点名字
tb_list_entry_head_t list;
#define tb_list_entry_init(list, type, entry, copy) tb_list_entry_init_(list, tb_offsetof(type, entry), sizeof(type), copy)
初始化链表,需要指定外置元素的结构体类型,链表的节点名字
参数说明
- list:指定链表
- type:外置元素的结构
- entry:链表的节点名字
- copy:the entry copy func
list_entry_exit
void list_entry_exit(list_entry_head_ref_t list);
销毁双链表
tb_list_entry_clear
static __tb_inline__ tb_void_t tb_list_entry_clear(tb_list_entry_head_ref_t list)
清除双链表
tb_list_entry_head
static __tb_inline__ tb_list_entry_ref_t tb_list_entry_head(tb_list_entry_head_ref_t list)
返回头结点
tb_list_entry_last
static __tb_inline__ tb_list_entry_ref_t tb_list_entry_last(tb_list_entry_head_ref_t list)
返回尾结点
tb_list_entry_insert_prev
static __tb_inline__ tb_void_t tb_list_entry_insert_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)
插入上一项
tb_list_entry_insert_next
static __tb_inline__ tb_void_t tb_list_entry_insert_next(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)
在之前新的元素后面插入一个新元素
tb_list_entry_insert_head
static __tb_inline__ tb_void_t tb_list_entry_insert_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
在链表头部插入元素,并返回新元素的迭代器索引。
tb_list_entry_insert_tail
static __tb_inline__ tb_void_t tb_list_entry_insert_tail(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
链表尾部插入元素
注意:所有操作都是在外置结构体中的list_entry节点上操作
tb_list_entry_replace
static __tb_inline__ tb_void_t tb_list_entry_replace(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)
替换该项
tb_list_entry_replace_head
static __tb_inline__ tb_void_t tb_list_entry_replace_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
替换头节点
tb_list_entry_replace_last
static __tb_inline__ tb_void_t tb_list_entry_replace_last(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
替换尾节点
tb_list_entry_remove
static __tb_inline__ tb_void_t tb_list_entry_remove(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
移除指定的元素
tb_list_entry_remove_next
tb_list_entry_remove_prev
tb_list_entry_remove_head
tb_list_entry_remove_last
static __tb_inline__ tb_void_t tb_list_entry_remove_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t next)
static __tb_inline__ tb_void_t tb_list_entry_remove_head(tb_list_entry_head_ref_t list)
static __tb_inline__ tb_void_t tb_list_entry_remove_last(tb_list_entry_head_ref_t list)
移除元素
tb_list_entry_moveto_prev
static __tb_inline__ tb_void_t tb_list_entry_moveto_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)
移到上一项
tb_list_entry_moveto_next
static __tb_inline__ tb_void_t tb_list_entry_moveto_next(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)
移到下一项
tb_list_entry_moveto_head
static __tb_inline__ tb_void_t tb_list_entry_moveto_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
移到头节点
tb_list_entry_moveto_tail
static __tb_inline__ tb_void_t tb_list_entry_moveto_tail(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)
移到尾节点
tb_list_entry
#define tb_list_entry(head, entry) ((((tb_byte_t*)(entry)) - (head)->eoff))
访问具体某个节点的元素数据
tb_for_all_if
tb_for_all_if(type, item, iterator, cond)
如果条件符合,则使用迭代器遍历所有元素
hash_map
存储方式:
typedef struct __tb_hash_map_item_t
{
/// the item name
tb_pointer_t name;
/// the item data
tb_pointer_t data;
}tb_hash_map_item_t, *tb_hash_map_item_ref_t;
使用场景:
- 哈希表
tb_hash_map_init
tb_hash_map_ref_t tb_hash_map_init(tb_size_t bucket_size, tb_element_t element_name, tb_element_t element_data);
初始化哈希表
tb_hash_map_exit
tb_void_t tb_hash_map_exit(tb_hash_map_ref_t hash_map);
退出哈希表
tb_hash_map_clear
tb_void_t tb_hash_map_clear(tb_hash_map_ref_t hash_map);
清理哈希表
tb_hash_map_get
tb_pointer_t tb_hash_map_get(tb_hash_map_ref_t hash_map, tb_cpointer_t name);
获取哈希表值
tb_hash_map_find
tb_size_t tb_hash_map_find(tb_hash_map_ref_t hash_map, tb_cpointer_t name);
通过名称查找项目
tb_hash_map_insert
tb_size_t tb_hash_map_insert(tb_hash_map_ref_t hash_map, tb_cpointer_t name, tb_cpointer_t data);
通过名称插入项目数据
tb_hash_map_remove
tb_void_t tb_hash_map_remove(tb_hash_map_ref_t hash_map, tb_cpointer_t name);
通过名称中删除项
tb_hash_map_size
tb_size_t tb_hash_map_size(tb_hash_map_ref_t hash_map);
返回容器容量
tb_hash_map_init
tb_size_t tb_hash_map_maxn(tb_hash_map_ref_t hash_map);
返回容器最大容量