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
use crate::operators::{Additive, Multiplicative}; use crate::properties::general::Identity; pub trait One: Identity<Multiplicative> + Sized + PartialEq { fn one() -> Self { <Self as Identity<Multiplicative>>::identity() } fn set_one(&mut self) { *self = Self::one() } fn is_one(&self) -> bool { *self == Self::one() } } pub trait Zero: Identity<Additive> + Sized + PartialEq { fn zero() -> Self { <Self as Identity<Additive>>::identity() } fn set_zero(&mut self) { *self = Self::zero(); } fn is_zero(&self) -> bool { *self == Self::zero() } } impl<T> One for T where T: Identity<Multiplicative> + Sized + PartialEq { } impl<T> Zero for T where T: Identity<Additive> + Sized + PartialEq { } pub trait Two: Sized + PartialEq { fn two() -> Self; fn set_two(&mut self) { *self = Self::two(); } fn is_two(&self) -> bool { *self == Self::two() } } pub trait AnyInt: Sized { fn any_num<const N: i32>() -> Self; fn set_any_num<const N: i32>(&mut self); fn is_any_num<const N: i32>(&self) -> bool; }