#bitflags #flags #bit #bitmask

no-std bitflag-attr

一个宏,用于从C样式的枚举生成位标志结构

3个版本 (破坏性更新)

0.3.0 2024年5月16日
0.2.0 2024年5月15日
0.1.0 2024年5月15日

#273 in 过程宏

MIT/Apache

32KB
666 代码行

bitflag-attr

Rust Latest version Documentation License

这是一个Rust过程宏crate,可以将C样式的枚举转换为具有类似bitfields crate API的位标志结构。

您可以使用此crate进行以下操作:

  • 提供更友好的C API绑定,其中标志可能或可能无法预先完全了解。

您不能使用此crate来

  • 保证只设置定义的标志对应的位。 bitflag-attr 允许访问底层的位类型,因此可以设置任意位。
  • 定义位字段。 bitflag-attr 仅生成表示某些组合标志存在的位设置的类型。

实现的特性

该宏还将实现一些用于位操作和格式化的特性。

  • core::ops::Not
  • core::ops::BitAnd
  • core::ops::BitOr
  • core::ops::BitXor
  • core::ops::BitAndAssign
  • core::ops::BitOrAssign
  • core::ops::BitXorAssign
  • core::ops::Sub
  • core::ops::SubAssign
  • core::fmt::Debug
  • core::fmt::Binary
  • core::fmt::UpperHex
  • core::fmt::LowerHex
  • core::fmt::Octal
  • From
  • Clone
  • Copy

除了DebugCloneCopy特性之外,所有其他可导出的特性都可以与该类型一起使用

示例

生成标志结构

use bitflag_attr::bitflag;

#[bitflag(u32)]
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
enum Flags {
    /// The value `A`, at bit position `0`.
    A = 0b00000001,
    /// The value `B`, at bit position `1`.
    B = 0b00000010,
    /// The value `C`, at bit position `2`.
    C = 0b00000100,

    /// The combination of `A`, `B`, and `C`.
    ABC = A | B | C,
}

fn main() {
    let e1 = Flags::A | Flags::C;
    let e2 = Flags::B | Flags::C;
    assert_eq!((e1 | e2), Flags::ABC);   // union
    assert_eq!((e1 & e2), Flags::C);     // intersection
    assert_eq!((e1 - e2), Flags::A);     // set difference
    assert_eq!(!e2, Flags::A);           // set complement
}

Rust版本支持

最低支持的Rust版本在Cargo.toml文件中记录。根据需要,在次要版本中可能需要提高此版本。

依赖项

~265–720KB
~17K SLoC