13个版本
0.7.10 | 2024年6月7日 |
---|---|
0.7.9 | 2024年2月12日 |
0.7.8 | 2023年9月13日 |
0.7.7 | 2023年4月17日 |
0.5.0 | 2019年1月29日 |
#26 在 Rust模式
971,623 每月下载量
在 859 个crate(113个直接使用)中使用
54KB
762 行
Enumflags
enumflags2
实现了经典的位标志数据结构。使用 #[bitflags]
注解枚举,并 BitFlags<YourEnum>
将能够在单个整数空间内存储任意组合的枚举。
特性
- 使用枚举表示单个标志——标志集是一个独立的类型。
- 自动选择未指定的空闲位。
- 在编译时检测错误的BitFlags。
- 与流行的 bitflags crate 具有类似的API。
- 不显式暴露生成的类型。用户仅与
struct BitFlags<Enum>;
交互。 - 调试格式化程序同时打印二进制标志值以及标志枚举:
BitFlags(0b1111, [A, B, C, D])
。 - 可选支持使用
serde
功能标志进行序列化。
示例
use enumflags2::{bitflags, make_bitflags, BitFlags};
#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq)]
enum Test {
A = 0b0001,
B = 0b0010,
C, // unspecified variants pick unused bits automatically
D = 0b1000,
}
// Flags can be combined with |, this creates a BitFlags of your type:
let a_b: BitFlags<Test> = Test::A | Test::B;
let a_c = Test::A | Test::C;
let b_c_d = make_bitflags!(Test::{B | C | D});
// The debug output lets you inspect both the numeric value and
// the actual flags:
assert_eq!(format!("{:?}", a_b), "BitFlags<Test>(0b11, A | B)");
// But if you'd rather see only one of those, that's available too:
assert_eq!(format!("{}", a_b), "A | B");
assert_eq!(format!("{:04b}", a_b), "0011");
// Iterate over the flags like a normal set
assert_eq!(a_b.iter().collect::<Vec<_>>(), &[Test::A, Test::B]);
// Query the contents with contains and intersects
assert!(a_b.contains(Test::A));
assert!(b_c_d.contains(Test::B | Test::C));
assert!(!(b_c_d.contains(a_b)));
assert!(a_b.intersects(a_c));
assert!(!(a_b.intersects(Test::C | Test::D)));
可选功能标志
serde
为BitFlags<T>
实现了Serialize
和Deserialize
。std
为FromBitsError
实现了std::error::Error
。
const fn
兼容的 API
背景: 目前稳定化的 const fn
功能集非常有限。最值得注意的是,const 特性仍处于 RFC 阶段,这使得在 const 上下文中无法使用任何重载运算符。
命名约定: 如果为 const fn
提供一个单独的、更有限的功能,则名称后缀为 _c
。
泛型实现: 如果您尝试编写一个遍历 T: BitFlag
的 const fn
,您将遇到一个错误,解释说目前,const fn
唯一允许的特质边界是 ?Sized
。您可能需要为 BitFlags<T, u8>
、BitFlags<T, u16>
等编写单独的实现——可能由宏生成。这种策略经常被 enumflags2
本身使用;为了避免混乱,文档中只展示了其中一个副本。
自定义 Default
默认情况下,使用 Default
创建 BitFlags<T>
的实例将导致一个空集合。如果这不可取,您可以自定义此
#[bitflags(default = B | C)]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq)]
enum Test {
A = 0b0001,
B = 0b0010,
C = 0b0100,
D = 0b1000,
}
assert_eq!(BitFlags::default(), Test::B | Test::C);
依赖关系
~240–740KB
~18K SLoC