通用基數樹/稀疏陣列

非常簡單和最小化,支援任意大小的條目,最大可達 GENRADIX_NODE_SIZE。

genradix 使用它將儲存的型別來定義,示例如下

static GENRADIX(struct foo) foo_genradix;

主要操作有

  • genradix_init(radix) - 初始化一個空的 genradix

  • genradix_free(radix) - 釋放 genradix 擁有的所有記憶體並重新初始化它

  • genradix_ptr(radix, idx) - 獲取指向 idx 處條目的指標,如果該條目不存在則返回 NULL

  • genradix_ptr_alloc(radix, idx, gfp) - 獲取指向條目的指標,如果需要則分配它

  • genradix_for_each(radix, iter, p) - 遍歷 genradix 中的每個條目

基數樹每次分配一頁條目,因此可能存在從未明確分配過的條目——它們將被初始化為全零。

在內部,genradix 只是一個頁的基數樹,索引以位元組偏移量的方式工作。此標頭檔案中的包裝器使用基數包含的型別的大小(sizeof)從索引計算位元組偏移量——請參閱 __idx_to_offset。

通用基數樹函式

genradix_init

genradix_init (_radix)

初始化一個 genradix

引數

_radix

要初始化的 genradix

描述

不會失敗

genradix_free

genradix_free (_radix)

釋放 genradix 擁有的所有記憶體

引數

_radix

要釋放的 genradix

描述

釋放後,_radix 將被重新初始化併為空

genradix_ptr

genradix_ptr (_radix, _idx)

獲取指向 genradix 條目的指標

引數

_radix

要訪問的 genradix

_idx

要獲取的索引

描述

返回指向 _idx 處條目的指標,如果該條目不存在則返回 NULL。

genradix_ptr_alloc

genradix_ptr_alloc (_radix, _idx, _gfp)

獲取指向 genradix 條目的指標,如果需要則分配它

引數

_radix

要訪問的 genradix

_idx

要獲取的索引

_gfp

gfp 掩碼

描述

返回指向 _idx 處條目的指標,或在分配失敗時返回 NULL

genradix_iter_init

genradix_iter_init (_radix, _idx)

初始化一個 genradix_iter

引數

_radix

將被遍歷的 genradix

_idx

開始遍歷的索引

genradix_iter_peek

genradix_iter_peek (_iter, _radix)

獲取迭代器當前位置處或之上的第一個條目

引數

_iter

一個 genradix_iter

_radix

正在被遍歷的 genradix

描述

如果 _iter 當前位置處或之上不再有條目,則返回 NULL

genradix_iter_peek_prev

genradix_iter_peek_prev (_iter, _radix)

獲取迭代器當前位置處或之下的第一個條目

引數

_iter

一個 genradix_iter

_radix

正在被遍歷的 genradix

描述

如果 _iter 當前位置處或之下不再有條目,則返回 NULL

genradix_for_each

genradix_for_each (_radix, _iter, _p)

遍歷 genradix 中的條目

引數

_radix

要遍歷的 genradix

_iter

一個 genradix_iter,用於跟蹤當前位置

_p

指向 genradix 條目型別的指標

描述

每次迭代時,_p 將指向當前條目,_iter.pos 將是當前條目的索引。

genradix_for_each_reverse

genradix_for_each_reverse (_radix, _iter, _p)

反向遍歷 genradix 中的條目

引數

_radix

要遍歷的 genradix

_iter

一個 genradix_iter,用於跟蹤當前位置

_p

指向 genradix 條目型別的指標

描述

每次迭代時,_p 將指向當前條目,_iter.pos 將是當前條目的索引。

genradix_prealloc

genradix_prealloc (_radix, _nr, _gfp)

在通用基數樹中預分配條目

引數

_radix

要預分配的 genradix

_nr

要預分配的條目數量

_gfp

gfp 掩碼

描述

成功返回 0,失敗返回 -ENOMEM