快捷宏
快捷宏做与一般化宏相同的事情,但需要较少参数。
为了使用便捷宏。
- 1、结构体的UT_hash_handle字段必须被命名为hh
- 2、对于增加或查找,这个键字段必须是int或者char[]或者指针类型
表格:便捷宏
宏 | 参数 |
HASH_ADD_INT | (head, keyfield_name, item_ptr) |
HASH_REPLACE_INT | (head, keyfield_name, item_ptr, replaced_item_ptr) |
HASH_FIND_INT | (head, key_ptr, item_ptr) |
HASH_ADD_STR | (head, keyfield_name, item_ptr) |
HASH_REPLACE_STR | (head, keyfield_name, item_ptr, replaced_item_ptr) |
HASH_FIND_STR | (head, key_ptr, item_ptr) |
HASH_ADD_PTR | (head, keyfield_name, item_ptr) |
HASH_REPLACE_PTR | (head, keyfield_name, item_ptr, replace_item_ptr) |
HASH_FIND_PTR | (head, key_ptr, item_ptr) |
HASH_DEL | (head, item_ptr) |
HASH_SORT | (head, cmp) |
HASH_COUNT | (head) |
一般的宏
这些宏添加,查找,删除以及排序在一个哈希中的项。如果你的UT_hash_handle被命名为处了hh外的其它名称或者如果你的键数据类型不是int或char[],你需要使用一般宏。
宏 | 参数 |
HASH_ADD | (hh_name, head, keyfield_name, key_len, item_ptr) |
HASH_ADD_BYHASHVALUE | (hh_name,head,keyfield_name,key_len,hashv,item_ptr) |
HASH_ADD_KEYPTR | (hh_name,head,key_ptr,key_len,item_ptr) |
HASH_ADD_KEYPTR_BYHASHVALUE | (hh_name,head,key_ptr,key_len,hashv,item_ptr) |
HASH_ADD_INORDER | (hh_name,head,keyfield_name,key_len,item_ptr,cmp) |
HASH_ADD_BYHASHVALUE_INORDER | (hh_name,head,keyfield_name,key_len,hashv,item_ptr,cmp) |
HASH_ADD_KEYPTR_INORDER | (hh_name,head,key_ptr,key_len,item_ptr,cmp) |
HASH_ADD_KEYPTR_BYHASHVALUE _INORDER | (hh_name,head,key_ptr,key_len,hashv,item_ptr,cmp) |
HASH_REPLACE | (hh_name,head,keyfield_name,key_len,item_ptr, replaced_item_ptr) |
HASH_REPLACE_BYHASHVALUE | (hh_name,head,keyfield_name,key_len,hashv,item_ptr, replaced_item_ptr) |
HASH_REPLACE_INORDER | (hh_name,head,keyfield_name,key_len,item_ptr, replaced_item_ptr,cmp) |
HASH_REPLACE_BYHASHVALUE _INORDER | (hh_name,head,keyfield_name,key_len,hashv,item_ptr, replaced_item_ptr,cmp) |
HASH_FIND | (hh_name, head, key_ptr, key_len, item_ptr) |
HASH_REPLACE_BYHASHVALUE | (hh_name,head,key_ptr,key_len,hashv,item_ptr) |
HASH_DELETE | (hh_name, head, item_ptr) |
HASH_VALUE | (key_ptr, key_len, hashv) |
HASH_SRT | (hh_name, head, cmp) |
HASH_CNT | (hh_name, head) |
HASH_CLEAR | (hh_name, head) |
HASH_SELECT | (dst_hh_name, dst_head, src_hh_name, src_head, condition) |
HASH_ITER | (hh_name, head, item_ptr, tmp_item_ptr) |
HASH_OVERHEAD | (hh_name, head) |
注意:当这个结构体包含一个指向这个键的指针时,使用HASH_ADD_KEYPTR,而不是这个键自身。
HASH_VALUE和..._BYHASHVALUE宏一种性能机制,主要针对j具有不同结构体,在不同哈希表中,具有相同键的特殊情况。它允一旦获取了哈希值,并且接着在..._BYHASHVALUE宏中被传入,节省了重新计算哈希值的开销。
参数描述:
1) hh_name:在这个结构体中UT_hash_handle字段的名称。方便地被称为hh。
2)head:结构体指针变量,它用作这个哈希表的"头"。如此命名,因为它初始指向被添加到这个哈希表的第一项。
3)keyfield_name:在这个结构体中的键字段的名称。(在一个多字段键的情况中,这是这个键的第一个字段。)
4)key_len:这个键字段的长度(字节为单位),例如,对于一个整数键,这是sizeof(int), 而对于字符串键,它是strlen(key)。
5) key_ptr:对于HASH_FIND,这是一个指向这个键的指针,来在哈希表中查找(由于它时一个指针,你不能直接在这里传递一个字面值)。对于HASH_ADD_KEYPTR,这是被添加的项的键的地址。
6) hashv:指定键的哈希值。这是一个用于..._BYHASHVALUE宏的输入参数,以及一个用于HASH_VALUE的输出参数。如果你将要进行重复查找相同键,反复使用一个缓存的哈希值是一种性能优化。
7) item_ptr:指向被添加,删除,替换或查找的结构体的指针,或者在迭代过程中,当前指针。这是用于HASH_ADD, HASH_DELETE和HASH_REPLACE宏的输入参数,以及用于HASH_FIND和HASH_ITER的输出参数。(当使用HASH_ITER来迭代时,tmp_item_ptr是与item_ptr相同类型的另一个变量,被内部使用。)
8) replaced_item_ptr:在HASH_REPLACE宏中使用。这是一个输出参数,其被设置为指向被替换项(如果没有项被替换,它被设置为NULL)。
9) cmp:指向比较函数的指针,这个函数接收两个参数(指向要比较的项的指针),并且返回一个指明第一项是否应该排在第二项前,等于或之后的整数。(如:strcmp)
10) condition:一个函数或宏,它接收单个参数(一个指向一个结构体的void指针,其需要被转成何时的结构体类型)。如果这个结构体应该被选择用于添加到目标哈希表,函数或宏计算为一个非0值。