1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use super::*; mod float; mod real; pub use float::*; pub use real::*; pub trait UNum: Sized + Copy + Debug + Display + Add<Output = Self> + AddAssign + Sub<Output = Self> + SubAssign + Mul<Output = Self> + MulAssign + Div<Output = Self> + DivAssign + PartialEq + PartialOrd { const ZERO: Self; const ONE: Self; } pub trait Num: UNum + Neg<Output = Self> { fn abs(self) -> Self { if self >= Self::ZERO { self } else { -self } } } impl<T: UNum + Neg<Output = T>> Num for T {} macro_rules! impl_uint { ($($t:ty),*) => { $( impl UNum for $t { const ZERO: Self = 0; const ONE: Self = 1; } )* }; } macro_rules! impl_int { ($($t:ty),*) => { $( impl UNum for $t { const ZERO: Self = 0; const ONE: Self = 1; } )* }; } impl_uint! { u8, u16, u32, u64, usize } impl_int! { i8, i16, i32, i64, isize }