1#![no_std]
2
3use core::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Not};
4
5pub use bitenum_macro::bitenum;
6
7pub trait BitEnum: Into<Self::Scalar> {
8 type Scalar: BitAnd<Output=Self::Scalar> + BitOr<Output=Self::Scalar> + Not<Output=Self::Scalar> + From<u8> + PartialEq + Copy;
9}
10
11pub struct BitEnumSet<Enum: BitEnum>(Enum::Scalar);
12
13impl<Scalar, Enum> BitEnumSet<Enum>
14 where Scalar: BitAnd<Output=Scalar> + BitAndAssign + BitOr<Output=Scalar> + BitOrAssign + Not<Output=Scalar> + PartialEq + From<u8> + Copy,
15 Enum: BitEnum<Scalar=Scalar> {
16 #[inline]
17 pub fn new() -> Self { Self(Enum::Scalar::from(0)) }
18
19 pub fn contains(&self, value: Enum) -> bool {
20 return (self.0 & value.into()) != Scalar::from(0);
21 }
22
23 pub fn insert(&mut self, value: Enum) -> &Self {
24 self.0 |= value.into();
25 self
26 }
27
28 pub fn remove(&mut self, value: Enum) -> &Self {
29 self.0 &= !value.into();
30 self
31 }
32
33 #[inline]
34 pub fn with(&self, value: Enum) -> Self {
35 Self(self.0 | value.into())
36 }
37
38 #[inline]
39 pub fn without(&self, value: Enum) -> Self {
40 Self(self.0 & !value.into())
41 }
42}