4 个版本
0.4.3 | 2023 年 7 月 27 日 |
---|---|
0.4.2 | 2023 年 7 月 27 日 |
0.3.6 |
|
0.2.0 |
|
0.1.1 |
|
#908 in 数据结构
每月 70 次下载
275KB
3.5K SLoC
grit-bitvec
此软件包提供 BitVec 数据结构的变体,这是一个可以存储不属 8/16/32/64/128 大小类别的固定大小位宽数据元素的向量。例如,你不必将每个布尔值存储在一个字节的向量中,而是可以将其存储为一位。另一个例子是将范围在 0-3 的无符号整数存储为正好 2 位,0-7 为 3 位,0-15 为 4 位,甚至可以将范围在 -1024 到 1023 的有符号整数存储为 11 位,或者将一个具有 4 个布尔值和 1 个 u8 的结构体(范围在 0-7)存储为总共 7 位。
RawBitVec
:所有其他变体封装的基础结构。需要将BitProto
传递给每个函数,如果同一个RawBitVec
实例上的所有方法调用没有使用相同的BitProto
,则是不安全的。CProtoBitVec<BIT_WIDTH>
:一个包装器,它将所需的BitProto
存储在为每个单独的<BIT_WIDTH>
创建的单态化常量中。SProtoBitVec
:一个包装器,在每个实例中保持对所需的BitProto
的静态引用。LProtoBitVec
:一个包装器,在每个实例中保持对BitProto
的完整副本。- 类型化的位向量
TypedBitVec<T>
:一个包装器,不仅存储了BitProto
,而且还包括将原始返回位转换为类型<T>
所需的函数
所有版本都使用usize
作为底层数据块类型,以利用对本地大小字的任何可能的算术优化,这意味着支持的位宽最大与usize::BITS
这允许在元素数量可能很大的应用中显著提高内存使用效率,但会以访问元素的处理时间为代价。
附加的处理成本在大多数情况下并不严重,因为大多数操作都是通过位操作和简单的算术来完成的,并且在使用常数传播时还可以进一步减少许多位操作函数的复杂度。然而,它们并不是免费的,并且在BitVec
中间插入或删除元素的运算可能会更昂贵,因为需要为每个元素运行这些检查和位移,而不是像ptr::copy()
那样在内部使用Vec
默认情况下,启用了small_int_impls
功能,为bool
和小于16位的整数类型(例如u8_as_u3
或i16_as_i11
)提供了简单的TypedBitElem
实现,可以通过激活large_int_impls
功能来获取小于usize::BITS
的位宽的类似实现
已测试的函数
- new()
- with_capacity()
- len()
- cap()
- free()
- clear()
- grow_exact_for_total_elements_if_needed()
- grow_exact_for_additional_elements_if_needed()
- grow_for_total_elements_if_needed()
- grow_for_additional_elements_if_needed
- push()
- pop()
- insert()
- remove()
- insert_bitvec()
- insert_iter()
- remove_range()
- trim_range()
- swap()
- swap_pop()
- shrink_excess_capacity()
- append_bitvec()
- append_iter()
- get()
- set()
- replace()
- drain()
- into_iter()
- discard_from_end()
该crate目前文档不完整,处于“不稳定”阶段。API将来可能会有变化