6个版本
0.2.1 | 2023年3月10日 |
---|---|
0.1.4 | 2021年8月3日 |
0.1.0 | 2021年7月31日 |
#1005 在 Rust模式
25KB
582 行
bitbag
这个crate提供BitBag
,一种用于跟踪在无字段的枚举中定义的位标志的类型。开始如下
use bitbag::{BitBag, BitBaggable};
use strum::EnumIter;
#[derive(BitBaggable, EnumIter, Clone, Copy)]
#[repr(u8)]
enum Flags {
A = 0b0001,
B = 0b0010,
C = 0b0100,
}
BitBag
提供基本功能
let mut bag = BitBag::<Flags>::new_unchecked(0b0011);
assert!(bag.is_set(Flags::A));
assert!(bag.is_set(Flags::B));
assert!(!bag.is_set(Flags::C));
bag.set(Flags::C);
assert_eq!(*bag, 0b0111);
通过推导BitBaggable
,你还可以获得非常便利的构造函数
use Flags::*;
let bag = A | B | C;
assert!(bag.is_set(Flags::A));
assert!(bag.is_set(Flags::B));
assert!(bag.is_set(Flags::C));
此外,通过推导EnumIter
和Copy
,将允许创建和迭代集合标志
// ⬇ this bit is not defined in Flags
let result = BitBag::<Flags>::new(0b1000);
assert!(matches!(
result,
Err(e) if e.given() == 0b1000
));
let bag = BitBag::<Flags>::new_unchecked(0b0110);
for flag in &bag {
match flag {
Flags::A => println!("Flag A was set"),
Flags::B => println!("Flag B was set"),
Flags::C => println!("Flag C was set"),
}
};
依赖项
~5–15MB
~169K SLoC