#bit-flags #flags #enums #cargo-toml #enumflags

EnumBitFlags

EnumBitFlags 是枚举标志支持的实现

8个稳定版本

1.0.7 2023年1月5日
1.0.5 2022年12月27日

#212进程宏

每月下载量 31

MIT 许可证

34KB
718

EnumBitFlags

Rust的进程宏crate,允许创建位标志枚举。

如何使用

  1. 首先,您需要将此crate添加到您的 cargo.toml 文件中
[dependencies]
EnumBitFlags = "1.0.7"
  1. 然后,您可以在您的Rust项目中像这样使用它
#[EnumBitFlags]
enum MyFlags {
  Flag_1 = 0x0001,
  Flag_2 = 0x0002,
  Flag_3 = 0x0004
}

fn main() {
  let flags = MyFlags::Flag_1 | MyFlags::Flag_2;
  
  // check if a flag is set (via .contains(...) method)
  if flags.contains(MyFlags::Flag_1) {
    println!("Flag_1 is present");
  }
  
  // check if a flag is set (via AND operation)
  if (flags & MyFlags::Flag_2) == MyFlags::Flag_2 {
    println!("Flag_2 is present");
  }
}

参数

EnumBitFlags支持各种参数,这些参数提供了关于如何构建枚举的额外信息。参数在 EnumBitFlags 参数中以以下格式指定:key=value,key=value,...。或者,您可以使用 : 代替 = (key:value, key:value....)

  • bits 位字段的内存表示。它可以是以下之一:8163264128。如果未指定,则默认值为 32示例

    #[EnumBitFlags(bits=8)]
    enum MyFlags {
      Flag_1 = 0x01,
      Flag_2 = 0x02,
      Flag_3 = 0x04
    }
    
  • empty 空变体的名称。空变体是未设置任何位的情况。如果未指定,将生成 None。空变体的名称不得出现在枚举变体中,并且必须以字母或下划线字符开头,可以包含字母、数字和下划线字符。 示例

    #[EnumBitFlags(empty=Nothing)]
    enum MyFlags {
      Flag_1 = 1,
      Flag_2 = 2,
      Flag_3 = 4
    }
    
    fn main() {
      let f = MyFlags::Nothing;
    }
    
  • disable_empty_generation 禁用生成空(值0)变体。默认情况下,这是 None,但可以使用 empty 属性来更改名称。此属性还将禁用任何手动变体(例如 No_flag = 0示例

    #[EnumBitFlags(disable_empty_generation=true)]
    enum MyFlags {
      Flag_1 = 1,
      Flag_2 = 2,
      Flag_3 = 4
    }
    
    fn main() {
      let f = MyFlags::None; // this code will produce an error as variant None will not be generated
    }
    
    • debug 将在解析后打印出结果结构。 示例
    #[EnumBitFlags(debug=true)]
    enum MyFlags {
      Flag_1 = 1,
      Flag_2 = 2,
      Flag_3 = 4
    }
    

方法

每个 EnumBitFlags 都有几个方法,可以用来轻松地操纵和检查位状态

方法 描述
obj.contains(mask) 如果对象中包含掩码的所有设置位,则返回 true,否则返回 false
obj.contains_one(mask) 如果对象中至少包含掩码中的一个位,则返回 true,否则返回 false
obj.clear() 清除当前对象中的所有位
obj.is_empty() 如果没有设置位,则返回 true,否则返回 false
obj.remove(mask) 移除掩码中的所有设置标志
obj.set(mask) 设置掩码中的所有位
obj.get_value() 返回与位掩码标志关联的数值
  • contains 检查是否包含确切的位标志掩码

    fn contains(&self, obj: <EnumName>) -> bool
    

    obj 不能为空(至少要设置一个位),并且对象中的所有位都必须存在。示例

    #[EnumBitFlags]
    enum MyFlags { A = 1, B = 2, C = 4 }
    
    fn main() {
       let t = MyFlags::A | MyFlags::B;
       if t.contains(MyFlags::A) { 
         /* this code will be executed */ 
       }
       if t.contains(MyFlags::A | MyFlags::B) {
         /* this code will be executed */ 
       }
       if t.contains(MyFlags::A | MyFlags::C) {
         /* this code WILL NOT BE REACHED as flags C is not set in variable t */
       }
    }
    
  • contains_one 检查对象中是否至少包含掩码中的一个位

    fn contains_one(&self, mask: <EnumName>) -> bool
    

    obj 不能为空(至少要设置一个位)。示例

    #[EnumBitFlags]
    enum MyFlags { A = 1, B = 2, C = 4 }
    
    fn main() {
       let t = MyFlags::A | MyFlags::B;
       if t.contains_one(MyFlags::A) { 
         /* this code will be executed */ 
       }
       if t.contains_one(MyFlags::A | MyFlags::B) {
         /* this code will be executed */ 
       }
       if t.contains_one(MyFlags::A | MyFlags::C) {
         /* this code will be executed */
       }
    }
    
  • clear 清除枚举中的所有位

    fn clear(&mut self) 
    

    示例

    #[EnumBitFlags]
    enum MyFlags { A = 1, B = 2, C = 4 }
    
    fn main() {
       let mut t = MyFlags::A | MyFlags::B;
       if t.contains_one(MyFlags::A) { 
         /* this code will be executed */ 
       }
       t.clear();
       if t.contains(MyFlags::A) {
         /* this code will NOT BE REACHED as t was cleared */ 
       }
    }
    

无运行时依赖