|
@@ -1,156 +1,97 @@
|
|
use std::fmt::Debug;
|
|
use std::fmt::Debug;
|
|
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
|
|
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
|
|
|
|
|
|
-/// Trait representing all numeric primitives.
|
|
|
|
|
|
+/// Trait representing all numeric primitives and `Complex`.
|
|
pub trait Numeric:
|
|
pub trait Numeric:
|
|
Sized + Copy + Clone + Debug +
|
|
Sized + Copy + Clone + Debug +
|
|
Add<Output=Self> + AddAssign + Sub<Output=Self> + SubAssign +
|
|
Add<Output=Self> + AddAssign + Sub<Output=Self> + SubAssign +
|
|
Mul<Output=Self> + MulAssign + Div<Output=Self> + DivAssign +
|
|
Mul<Output=Self> + MulAssign + Div<Output=Self> + DivAssign +
|
|
PartialEq {
|
|
PartialEq {
|
|
- /// Function returning the 0 value for the given type.
|
|
|
|
- fn zero() -> Self;
|
|
|
|
-
|
|
|
|
- /// Function returning the 1 value for the given type.
|
|
|
|
- fn one() -> Self;
|
|
|
|
|
|
+ /// Function returning the whole number in the requested type.
|
|
|
|
+ fn whole(value: u32) -> Self;
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for f32 {
|
|
impl Numeric for f32 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0.0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1.0
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for f64 {
|
|
impl Numeric for f64 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0.0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1.0
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for i8 {
|
|
impl Numeric for i8 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for i16 {
|
|
impl Numeric for i16 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for i32 {
|
|
impl Numeric for i32 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for i64 {
|
|
impl Numeric for i64 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for i128 {
|
|
impl Numeric for i128 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for isize {
|
|
impl Numeric for isize {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for u8 {
|
|
impl Numeric for u8 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for u16 {
|
|
impl Numeric for u16 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for u32 {
|
|
impl Numeric for u32 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for u64 {
|
|
impl Numeric for u64 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for u128 {
|
|
impl Numeric for u128 {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl Numeric for usize {
|
|
impl Numeric for usize {
|
|
- fn zero() -> Self {
|
|
|
|
- 0
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fn one() -> Self {
|
|
|
|
- 1
|
|
|
|
|
|
+ fn whole(value: u32) -> Self {
|
|
|
|
+ value as Self
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -160,38 +101,41 @@ mod tests {
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn floats_are_numeric() {
|
|
fn floats_are_numeric() {
|
|
- assert_eq!(f32::zero(), 0.0);
|
|
|
|
- assert_eq!(f32::one(), 1.0);
|
|
|
|
- assert_eq!(f64::zero(), 0.0);
|
|
|
|
- assert_eq!(f64::one(), 1.0);
|
|
|
|
|
|
+ assert_eq!(f32::whole(0), 0.0);
|
|
|
|
+ assert_eq!(f32::whole(1), 1.0);
|
|
|
|
+ assert_eq!(f64::whole(0), 0.0);
|
|
|
|
+ assert_eq!(f64::whole(1), 1.0);
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn integers_are_numeric() {
|
|
fn integers_are_numeric() {
|
|
- assert_eq!(i8::zero(), 0);
|
|
|
|
- assert_eq!(i8::one(), 1);
|
|
|
|
- assert_eq!(i16::zero(), 0);
|
|
|
|
- assert_eq!(i16::one(), 1);
|
|
|
|
- assert_eq!(i32::zero(), 0);
|
|
|
|
- assert_eq!(i32::one(), 1);
|
|
|
|
- assert_eq!(i64::zero(), 0);
|
|
|
|
- assert_eq!(i64::one(), 1);
|
|
|
|
- assert_eq!(i128::zero(), 0);
|
|
|
|
- assert_eq!(i128::one(), 1);
|
|
|
|
- assert_eq!(isize::zero(), 0);
|
|
|
|
- assert_eq!(isize::one(), 1);
|
|
|
|
-
|
|
|
|
- assert_eq!(u8::zero(), 0);
|
|
|
|
- assert_eq!(u8::one(), 1);
|
|
|
|
- assert_eq!(u16::zero(), 0);
|
|
|
|
- assert_eq!(u16::one(), 1);
|
|
|
|
- assert_eq!(u32::zero(), 0);
|
|
|
|
- assert_eq!(u32::one(), 1);
|
|
|
|
- assert_eq!(u64::zero(), 0);
|
|
|
|
- assert_eq!(u64::one(), 1);
|
|
|
|
- assert_eq!(u128::zero(), 0);
|
|
|
|
- assert_eq!(u128::one(), 1);
|
|
|
|
- assert_eq!(usize::zero(), 0);
|
|
|
|
- assert_eq!(usize::one(), 1);
|
|
|
|
|
|
+ // not sure yet, if I want this to be possible
|
|
|
|
+ assert_eq!(i8::whole(255), -1);
|
|
|
|
+
|
|
|
|
+ assert_eq!(i8::whole(0), 0);
|
|
|
|
+ assert_eq!(i8::whole(1), 1);
|
|
|
|
+ assert_eq!(i16::whole(0), 0);
|
|
|
|
+ assert_eq!(i16::whole(1), 1);
|
|
|
|
+ assert_eq!(i32::whole(0), 0);
|
|
|
|
+ assert_eq!(i32::whole(1), 1);
|
|
|
|
+ assert_eq!(i64::whole(0), 0);
|
|
|
|
+ assert_eq!(i64::whole(1), 1);
|
|
|
|
+ assert_eq!(i128::whole(0), 0);
|
|
|
|
+ assert_eq!(i128::whole(1), 1);
|
|
|
|
+ assert_eq!(isize::whole(0), 0);
|
|
|
|
+ assert_eq!(isize::whole(1), 1);
|
|
|
|
+
|
|
|
|
+ assert_eq!(u8::whole(0), 0);
|
|
|
|
+ assert_eq!(u8::whole(1), 1);
|
|
|
|
+ assert_eq!(u16::whole(0), 0);
|
|
|
|
+ assert_eq!(u16::whole(1), 1);
|
|
|
|
+ assert_eq!(u32::whole(0), 0);
|
|
|
|
+ assert_eq!(u32::whole(1), 1);
|
|
|
|
+ assert_eq!(u64::whole(0), 0);
|
|
|
|
+ assert_eq!(u64::whole(1), 1);
|
|
|
|
+ assert_eq!(u128::whole(0), 0);
|
|
|
|
+ assert_eq!(u128::whole(1), 1);
|
|
|
|
+ assert_eq!(usize::whole(0), 0);
|
|
|
|
+ assert_eq!(usize::whole(1), 1);
|
|
}
|
|
}
|
|
}
|
|
}
|