|
@@ -8,89 +8,93 @@ Add<Output=Self> + AddAssign + Sub<Output=Self> + SubAssign +
|
|
|
Mul<Output=Self> + MulAssign + Div<Output=Self> + DivAssign +
|
|
|
PartialEq {
|
|
|
/// Function returning the whole number in the requested type.
|
|
|
- fn whole(value: u32) -> Self;
|
|
|
+ ///
|
|
|
+ /// # Safety
|
|
|
+ /// The caller must make sure, that the given value can be represented in the target type.
|
|
|
+ /// Otherwise behaviour is undefined.
|
|
|
+ unsafe fn whole(value: u32) -> Self;
|
|
|
}
|
|
|
|
|
|
impl Numeric for f32 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for f64 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for i8 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for i16 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for i32 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for i64 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for i128 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for isize {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for u8 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for u16 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for u32 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for u64 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for u128 {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
|
|
|
|
impl Numeric for usize {
|
|
|
- fn whole(value: u32) -> Self {
|
|
|
+ unsafe fn whole(value: u32) -> Self {
|
|
|
value as Self
|
|
|
}
|
|
|
}
|
|
@@ -101,41 +105,41 @@ mod tests {
|
|
|
|
|
|
#[test]
|
|
|
fn floats_are_numeric() {
|
|
|
- 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);
|
|
|
+ assert_eq!(unsafe { f32::whole(0) }, 0.0);
|
|
|
+ assert_eq!(unsafe { f32::whole(1) }, 1.0);
|
|
|
+ assert_eq!(unsafe { f64::whole(0) }, 0.0);
|
|
|
+ assert_eq!(unsafe { f64::whole(1) }, 1.0);
|
|
|
}
|
|
|
|
|
|
#[test]
|
|
|
fn integers_are_numeric() {
|
|
|
// 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);
|
|
|
+ assert_eq!(unsafe { i8::whole(255) }, -1);
|
|
|
+
|
|
|
+ assert_eq!(unsafe { i8::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { i8::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { i16::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { i16::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { i32::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { i32::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { i64::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { i64::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { i128::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { i128::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { isize::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { isize::whole(1) }, 1);
|
|
|
+
|
|
|
+ assert_eq!(unsafe { u8::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { u8::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { u16::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { u16::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { u32::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { u32::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { u64::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { u64::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { u128::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { u128::whole(1) }, 1);
|
|
|
+ assert_eq!(unsafe { usize::whole(0) }, 0);
|
|
|
+ assert_eq!(unsafe { usize::whole(1) }, 1);
|
|
|
}
|
|
|
}
|