bitbag 0.1.1

A useful struct for dealing with bit flags
Documentation

This crate provides [BitBag], a type intended for abstracting over field-less enums. Get started like this:

use bitbag::{BitBag, BitBaggable};
use strum::EnumIter;

#[derive(BitBaggable, EnumIter, Clone, Copy)]
#[repr(u8)]
enum Flags {
A = 0b0001,
B = 0b0010,
C = 0b0100,
}

Basic functionality is provided by [BitBag]

# use bitbag::{BitBag, BitBaggable};
# use strum::EnumIter;
# #[derive(BitBaggable, EnumIter, Clone, Copy)]
# #[repr(u8)]
# enum Flags {
#     A = 0b0001,
#     B = 0b0010,
#     C = 0b0100,
# }
let mut bag = BitBag::<Flags>::new_unchecked(0b0011);
assert!(bag.is_set(Flags::A));
assert!(bag.is_set(Flags::B));
assert!(!bag.is_set(Flags::C));

bag.set(Flags::C);
assert_eq!(*bag, 0b0111);

Additionally deriving [EnumIter], and [Copy] will allow fallible creation, and iteration over the set flags

# use bitbag::{BitBag, BitBaggable};
# use strum::EnumIter;
# #[derive(BitBaggable, EnumIter, Clone, Copy)]
# #[repr(u8)]
# enum Flags {
#     A = 0b0001,
#     B = 0b0010,
#     C = 0b0100,
# }
let result = BitBag::<Flags>::new(0b1000);
assert!(matches!(
result,
Err(e) if e.given() == 0b1000
));

let bag = BitBag::<Flags>::new_unchecked(0b0110);
for flag in &bag {
match flag {
Flags::A => println!("Flag A was set"),
Flags::B => println!("Flag B was set"),
Flags::C => println!("Flag C was set"),
}
};