use core::{
fmt,
hash::Hash,
ops::{
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div,
DivAssign, Mul, MulAssign, Not, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,
},
};
use crate::id::ToU64;
pub trait Id: Copy + Clone + PartialOrd + Ord + PartialEq + Eq + Hash + fmt::Debug {
const ZERO: Self::Ty;
const ONE: Self::Ty;
type Ty: Copy
+ Clone
+ Default
+ fmt::Debug
+ fmt::Display
+ Ord
+ PartialOrd
+ Eq
+ PartialEq
+ Hash
+ ToU64
+ From<u8>
+ Add<Output = Self::Ty>
+ AddAssign<Self::Ty>
+ Sub<Output = Self::Ty>
+ SubAssign<Self::Ty>
+ Mul<Output = Self::Ty>
+ MulAssign<Self::Ty>
+ Div<Output = Self::Ty>
+ DivAssign<Self::Ty>
+ BitOr<Output = Self::Ty>
+ BitOrAssign<Self::Ty>
+ BitAnd<Output = Self::Ty>
+ BitAndAssign<Self::Ty>
+ BitXor<Output = Self::Ty>
+ BitXorAssign<Self::Ty>
+ Not<Output = Self::Ty>
+ Shl<u8, Output = Self::Ty>
+ Shr<u8, Output = Self::Ty>
+ Shl<u32, Output = Self::Ty>
+ Shr<u32, Output = Self::Ty>
+ Shl<u64, Output = Self::Ty>
+ Shr<u64, Output = Self::Ty>
+ Shl<u128, Output = Self::Ty>
+ Shr<u128, Output = Self::Ty>
+ Shl<usize, Output = Self::Ty>
+ Shr<usize, Output = Self::Ty>
+ ShlAssign<Self::Ty>
+ ShrAssign<Self::Ty>;
fn to_raw(&self) -> Self::Ty;
fn from_raw(raw: Self::Ty) -> Self;
}