3个稳定版本
2.0.1 | 2023年8月17日 |
---|---|
2.0.0 | 2023年8月12日 |
1.0.0 | 2022年4月21日 |
#1724 in 编码
97KB
1K SLoC
bitman
将变量拆分为位
概述
bitman提供了一种读取和写入变量单独位的方法,以及定义可以按任何类型读取或写入的变量内字段的 capability。
项目愿景
我们对bitman的愿景是一套简单直观的工具,允许高效地与类型的基本位和子字段进行交互,这些类型通常不提供这种访问。
用法
bitman设计得尽可能易于使用,同时不牺牲速度。为此,我们在所有Rust原生日积类型中添加了to_bits()方法。让我们通过查看一个名为my_u8的u8来了解如何创建Bits。
-
my_u8.to_bits()将u8转换为Bits类型。Bits创建了一个u8的包装器,提供了更多方法。因此,my_u8.to_bits()调用最初的成本非常低。它只是将u8复制到Bits类型中。
(注意:为了更明确的错误,请尝试to_named_bits())
-
my_u8.to_bits()还从内部u8提取一个vec
。然后,将得到的vec 存储在Bits变量中,以帮助更快地检索位。(注意:当前,此优化已禁用。我在解决线程代码中引起竞态条件的错误。使用此代码的代码仍将正常工作,但速度不会像优化重新启用时那样快。)
在Bits中写入或读取位是通过索引完成的。我将从一个u8创建一个Bits实例来演示
use bitman::AnyIntegerType;
let mut my_u8 = 0u8;
let mut my_bits = my_u8.to_bits(); // to_bits() makes it easy to make a Bits.
my_bits[0] = true; // Setting a bit is easy as pie.
assert_eq!(my_bits[0], true); // Reading a single bit is easy too!
assert_eq!(my_bits.as_integer(), 128); // Need to read the integer? Easy peasy!
这真的非常简单!
您甚至可以将bools的切片分配到Bits的切片,它将正常工作而不会影响任何其他位!
my_bits[0..2].copy_from_slice(&[true, false]);
当然,您也可以将Bits的切片分配到Bits的切片!
my_bits[2..4].copy_from_slice(my_bits[0..2]);
Bits类型也是可迭代的,因此您可以轻松地迭代Bits中的每个Bit
for bit in my_bits {
println!("{:?}", bit);
}
当然,您也可以可变地迭代Bits,如果需要的话
for mut bit in my_bits {
bit = !bit;
}
开发者信息
自动化工具
我们通过Git钩子在每次提交时自动运行git cliff来生成CHANGELOG.md文件。这确保了变更日志在开发过程中保持最新。我们已添加一个Git钩子,以便在每次提交时启动git cliff。请参阅.git/hooks/post-commit以获取钩子代码。
路线图
多线程
在创建bitman时,我们将其编写为完全支持多线程。这种多线程通过排队任何更改并在后台更新它们,使库的速度大大提高。然而,使数据源(位向量)自动从一种(从整数本身动态提取的位)切换到另一种(位向量)并返回的锁定机制最终证明是问题的,需要废弃并重新实现,以避免在同时更新整数和位向量时出现竞争条件。这些更改不应影响bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。
向量与数组支持
bitman最初的设计目标之一是除了支持单个原始整数之外,还支持原始整数的向量和数组。在开发bitman期间,这个目标不得不被搁置,因为它需要比我们目前的时间更多的规划。然而,我们仍然计划将此功能添加到bitman中。这些更改只会增加bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。
序列化/反序列化支持
我们意识到自动序列化和反序列化整个Bits实例以及Bits实例的整数表示将非常有价值。不幸的是,我们还没有时间编写那段代码。它只会增加bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。
跨边界赋值
如果可以在u16的中部赋值u8,那岂不是很好?我们也这样认为。不幸的是,这不是我们能在当前版本中添加到bitman中的功能。一旦我们的向量和数组支持完成,这还将使向量和数组中的多个项的赋值成为可能。
依赖关系
~205KB