#flags #enums #bitflags

enum-flags

EnumFlags 是类似于 C# 的枚举标志实现

6 个版本

0.3.0 2022年2月25日
0.3.0-preview32022年2月24日
0.1.8 2021年8月8日
0.1.6 2021年7月31日

#14 in #flag

Download history 22/week @ 2024-03-13 21/week @ 2024-03-20 56/week @ 2024-03-27 176/week @ 2024-04-03 37/week @ 2024-04-10 14/week @ 2024-04-17 13/week @ 2024-04-24 6/week @ 2024-05-01 8/week @ 2024-05-08 13/week @ 2024-05-15 13/week @ 2024-05-22 38/week @ 2024-05-29 345/week @ 2024-06-05 741/week @ 2024-06-12 818/week @ 2024-06-19 246/week @ 2024-06-26

2,163 每月下载量
2 个crate中使用 (通过 kmip-protocol)

MIT 许可证

20KB
363

LICENSE Documentation Crates.io Version

EnumFlags

EnumFlags 是一个类似于 C# 的枚举标志实现。

示例

由于使用功能 arbitrary_enum_discriminant,需要使用 nightly 频道。

#![feature(arbitrary_enum_discriminant)]
use enum_flags::enum_flags;

#[repr(u8)]  // default: #[repr(usize)]
#[enum_flags]
#[derive(Copy, Clone, PartialEq)] // can be omitted
enum Flags{
    None = 0,
    A = 1,
    B, // 2
    C = 4
}
fn main() {
    let e1: Flags = Flags::A | Flags::C;
    let e2 = Flags::B | Flags::C;

    assert_eq!(e1 | e2, Flags::A | Flags::B | Flags::C); // union
    assert_eq!(e1 & e2, Flags::C); // intersection
    assert_eq!(e1 ^ e2, Flags::A | Flags::B); // toggle
    assert_eq!(e1 & (!Flags::C), Flags::A); // deletion
    assert_eq!(e1 - Flags::C, Flags::A); // deletion

    assert_eq!(format!("{:?}", e1).as_str(), "(Flags::A | Flags::C)");
    assert!(e1.has_a());
    assert!(!e1.has_b());
    assert!(e1.has_flag(Flags::C));
    assert!(e1.contains(Flags::C));
    assert_eq!(match Flags::A | Flags::C {
        Flags::None => "None",
        Flags::A => "A",
        Flags::B => "B",
        Flags::C => "C",
        Flags::__Composed__(v) if v == Flags::A | Flags::B => "A and B",
        Flags::__Composed__(v) if v == Flags::A | Flags::C => "A and C",
        _ => "Others"
    }, "A and C")
}

重大变更

  • 在版本 0.18 之前
    #[derive(Copy, EnumFlags, Clone, PartialEq)]
    enum Flags {
        None = 0,
        A = 1,
        B = 2,
        C = 4
    }
    
  • 从版本 0.30 开始
    #[enum_flags] 
    #[derive(Copy, Clone, PartialEq)]
    enum Flags {
        None = 0,
        A = 1,
        B = 2,
        C = 4
    }
    

依赖项

~1.5MB
~34K SLoC