1pub use crate::algebra::traits::*;
3use crate::impl_algebra;
4
5#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
7pub struct BitAnd<T>(pub T);
8
9#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
11pub struct BitOr<T>(pub T);
12
13#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
15pub struct BitXor<T>(pub T);
16
17macro_rules! implement {
18 ($($t:tt),*) => {
19 $(impl_algebra!(BitAnd<$t>; op: |a: Self, b: Self| Self(a.0 & b.0); id: Self(!0); commu; assoc; idem;);)*
20 $(impl_algebra!(BitOr<$t>; op: |a: Self, b: Self| Self(a.0 | b.0); id: Self(0); commu; assoc; idem;);)*
21 $(impl_algebra!(BitXor<$t>; op: |a: Self, b: Self| Self(a.0 ^ b.0); id: Self(0); inv: |a| a; commu; assoc;);)*
22 };
23}
24
25implement!(u8, u16, u32, u64, u128, usize);