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日

#26Rust模式

Download history 208840/week @ 2024-05-03 215097/week @ 2024-05-10 217743/week @ 2024-05-17 225976/week @ 2024-05-24 234895/week @ 2024-05-31 217165/week @ 2024-06-07 219985/week @ 2024-06-14 238797/week @ 2024-06-21 230431/week @ 2024-06-28 220073/week @ 2024-07-05 234902/week @ 2024-07-12 233274/week @ 2024-07-19 237583/week @ 2024-07-26 230060/week @ 2024-08-02 243217/week @ 2024-08-09 217742/week @ 2024-08-16

971,623 每月下载量
859 个crate(113个直接使用)中使用

MIT/Apache

54KB
762

LICENSE LICENSE Documentation Crates.io Version

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)));

可选功能标志

  • serdeBitFlags<T> 实现了 SerializeDeserialize
  • stdFromBitsError 实现了 std::error::Error

const fn 兼容的 API

背景: 目前稳定化的 const fn 功能集非常有限。最值得注意的是,const 特性仍处于 RFC 阶段,这使得在 const 上下文中无法使用任何重载运算符。

命名约定: 如果为 const fn 提供一个单独的、更有限的功能,则名称后缀为 _c

泛型实现: 如果您尝试编写一个遍历 T: BitFlagconst 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