通用基数树/稀疏数组

非常简单和最小化,支持任意大小的条目,最大可达 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