use std::{ fmt::{ self, Debug, Display, LowerHex, UpperHex, Octal, Binary, }, ops::{ BitAnd, BitOr, BitXor, BitAndAssign, BitOrAssign, BitXorAssign, Not, }, }; use bitflags::bitflags; // Ideally we'd actually want this to work, but currently need something like `num`'s `Zero` // With some design work it could be made possible #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] struct MyInt(u8); impl BitAnd for MyInt { type Output = Self; fn bitand(self, other: Self) -> Self { MyInt(self.0 & other.0) } } impl BitOr for MyInt { type Output = Self; fn bitor(self, other: Self) -> Self { MyInt(self.0 | other.0) } } impl BitXor for MyInt { type Output = Self; fn bitxor(self, other: Self) -> Self { MyInt(self.0 ^ other.0) } } impl BitAndAssign for MyInt { fn bitand_assign(&mut self, other: Self) { self.0 &= other.0 } } impl BitOrAssign for MyInt { fn bitor_assign(&mut self, other: Self) { self.0 |= other.0 } } impl BitXorAssign for MyInt { fn bitxor_assign(&mut self, other: Self) { self.0 ^= other.0 } } impl Debug for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { Debug::fmt(&self.0, f) } } impl Display for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { Display::fmt(&self.0, f) } } impl LowerHex for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { LowerHex::fmt(&self.0, f) } } impl UpperHex for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { UpperHex::fmt(&self.0, f) } } impl Octal for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { Octal::fmt(&self.0, f) } } impl Binary for MyInt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { Binary::fmt(&self.0, f) } } impl Not for MyInt { type Output = MyInt; fn not(self) -> Self { MyInt(!self.0) } } bitflags! { struct Flags128: MyInt { const A = MyInt(0b0000_0001u8); const B = MyInt(0b0000_0010u8); const C = MyInt(0b0000_0100u8); } } fn main() {}