Crates.io | enum-flags |
lib.rs | enum-flags |
version | 0.3.0 |
source | src |
created_at | 2021-07-29 12:22:53.627467 |
updated_at | 2022-02-25 16:11:49.552338 |
description | EnumFlags is a csharp like enum flags implementation. |
homepage | https://github.com/mokeyish/enum-flags |
repository | https://github.com/mokeyish/enum-flags |
max_upload_size | |
id | 428747 |
size | 26,170 |
EnumFlags is a csharp like enum flags implementation.
Since use the feature arbitrary_enum_discriminant
, nightly channel is required.
#![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")
}
#[derive(Copy, EnumFlags, Clone, PartialEq)]
enum Flags {
None = 0,
A = 1,
B = 2,
C = 4
}
#[enum_flags]
#[derive(Copy, Clone, PartialEq)]
enum Flags {
None = 0,
A = 1,
B = 2,
C = 4
}