19 个版本 (9 个重大变更)
0.10.2 | 2021 年 11 月 7 日 |
---|---|
0.9.3 | 2021 年 10 月 14 日 |
#896 in 数据结构
每月下载量 33
145KB
3.5K SLoC
Fixed Bitmaps
实现围绕原始 Rust 无符号整数的位图功能。我在想要一个简单的数据结构来使用位标志后,最终制作了这个库。当然,其他选项肯定存在,但有些看起来很吓人,而有些则在我制作这个之后才找到,而且,我只是想制作一个我愿意发布的库!
这些位图仅用于当您想要一个数据结构来存储布尔标志时,这些标志可以以尽可能压缩的格式进行 AND、OR 和 XOR 操作,同时仍然具有足够的函数来轻松查看位图进行显示或获取特定的位。使用此库非常简单,如果您想要一个相对较小、稳定、快速且易于使用的依赖项,这可能就是您需要的!
这个库不是 灵活的!您可以使用这个库制作的最大的位图是 128 位长,因此如果您需要更大的位图,您可能希望访问其他实现此功能的库。我会推荐的一个,这个库最终与它非常相似,是 bit-vec。
功能
- 现在所有基本的无符号整数类型都有了包装,从
u8
到u128
,还包括对usize
的包装 (BitmapArch
)。 - 支持位运算(AND、OR、XOR、NOT)和算术运算(加、减、乘、除)在位图之间以及位图与其相应整数类型之间进行。
- 实现了
Display
以显示位图的全部 1 和 0。 (然而,最终可能会将其改为Debug
特性,这将在发布 1.0.0 之前需要考虑)。 - 现在支持在
Bitmap
和其关联的整数类型之间使用专用方法或解引用运算符*
进行轻松转换。 - 现在支持左右移位
代码示例
use fixed_bitmaps::Bitmap64;
// Multiple ways to create a new bitmap
let empty = Bitmap64::default();
let empty = Bitmap64::new(false);
let full = Bitmap64::from(u64::MAX);
let full = Bitmap64::new(true);
let mask = Bitmap64::create_bit_mask(2, 6, true); // Creates bitmap with last bits 111100
let mask = Bitmap64::create_bit_mask(2, 6, false); // Creates bitmap 11..11000011
// Equivalent ways to create a bitmap with last bits 1001
let bitmap = Bitmap64::from(9);
let bitmap = Bitmap64::from(0b1001);
// Sets the 7th least significant bit when creating a new
// bitmap (indexing starts at 0)
let mut bitmap = Bitmap64::from_set(6).unwrap();
// Use the set() method to work with specific bits
bitmap.set(6, false).unwrap();
bitmap.set(42, true).unwrap();
// Use get() to know the value of a specific bit
println!("Bit at index 42: {}", bitmap.get(42).unwrap());
// Freely use boolean operators &, |, and ^
let bitmap1 = Bitmap64::from(0b1001);
let bitmap2 = Bitmap64::from(0b1010);
let and = bitmap1 & bitmap2;
let or = bitmap1 | bitmap2;
let xor = bitmap1 ^ bitmap2;
// The following also works exactly the same
let and = bitmap1 & 0b1010;
let or = bitmap1 | 0b1010;
let xor = bitmap1 ^ 0b1010;
// You can also use the not operator ! to get the flipped version of
// the bitmap
let flipped = !bitmap;
// Aritmetic operators are currently used as exactly that, the following
// is guarunteed to continue working as it does
let add = bitmap1 + 10;
let sub = bitmap1 - 4;
let mul = bitmap2 * 2;
let div = bitmap2 / 2;
// The following works exactly as above, but is likely to change in
// favour of set operations in the major update to 1.0.0
let add = bitmap1 + Bitmap64::from(10);
let sub = bitmap1 - Bitmap64::from(4);
let mul = bitmap2 * Bitmap64::from(2);
let div = bitmap2 / Bitmap64::from(2);
// Left and right shifts work exactly as they do with integers
let lsh = bitmap1 << 3;
let rsh = bitmap2 >> 1;
待完成
- 文档总是需要改进的,任何文档更改或小错误修复都会导致补丁更新。
- 每当定义和实现了一个新的结构或定义了一个新的函数时,将发布一个小更新。
- 当这一部分经过充分测试和基准测试,并且我可能遗漏的任何其他重要组件都添加后,我将发布fixed_bitmaps 1.0.0作为主要更新,以表明它已准备好全面生产。
- 最终要创建的最终结构可能是
BitmapLarge
结构,或类似的东西。这将有一个固定的尺寸,但用户可以定义这个尺寸是多少。目标是创建一个不能增长或缩小的结构,但可以从一开始就有一个大容量。这类似于bit-vec,只是没有动态增长属性,所以我认为它应该更容易在栈上而不是在堆上存储,从而获得更好的性能。
贡献
欢迎贡献,无论是更好的文档、错误修复还是代码本身的优化!
在做出更改时,仅对以下文件进行更改(除非你打算添加新的模块或其他类似的东西)
fixed_bitmaps/src/primitives/bitmap128.rs
fixed_bitmaps/tests/primitives/bitmap128.rs
fixed_bitmaps/src/oversized/bitmap_kb.rs
fixed_bitmaps/tests/oversized/bitmap_kb.rs
然后你可以在该项目上运行cargo run
,它将通过各自目录中的所有其他文件传播更改,适应每个模块旨在支持的特定原语。
运行cargo test
以确保你的更改通过了当前实现的测试,或者运行你设置的新测试!
依赖项
~0.4–1MB
~22K SLoC