pub fn f64_to_i32(v: f64) -> i32 {
v as i32
}
pub fn f64_to_i64(v: f64) -> i64 {
v as i64
}
pub fn f64_to_i8(v: f64) -> i8 {
v as i8
}
pub fn f64_to_u8(v: f64) -> u8 {
v as u8
}
pub fn f64_to_i16(v: f64) -> i16 {
v as i16
}
pub fn f64_to_u16(v: f64) -> u16 {
v as u16
}
pub fn f64_to_u32(v: f64) -> u32 {
v as u32
}
pub fn f64_to_u64(v: f64) -> u64 {
v as u64
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn out_of_range_saturates_and_nan_is_zero() {
#[allow(clippy::type_complexity)]
let rows: &[(f64, i8, u8, i16, u16, i32, u32, i64, u64)] = &[
(1.7, 1, 1, 1, 1, 1, 1, 1, 1),
(2.2, 2, 2, 2, 2, 2, 2, 2, 2),
(-0.5, 0, 0, 0, 0, 0, 0, 0, 0),
(-3.9, -3, 0, -3, 0, -3, 0, -3, 0),
(127.0, 127, 127, 127, 127, 127, 127, 127, 127),
(255.9, 127, 255, 255, 255, 255, 255, 255, 255),
(32767.5, 127, 255, 32767, 32767, 32767, 32767, 32767, 32767),
(65535.7, 127, 255, 32767, 65535, 65535, 65535, 65535, 65535),
(70000.9, 127, 255, 32767, 65535, 70000, 70000, 70000, 70000),
(
3.0e9,
127,
255,
32767,
65535,
i32::MAX,
3000000000,
3000000000,
3000000000,
),
(-1.0, -1, 0, -1, 0, -1, 0, -1, 0),
(-3.0e9, i8::MIN, 0, i16::MIN, 0, i32::MIN, 0, -3000000000, 0),
(
2147483647.5,
127,
255,
32767,
65535,
i32::MAX,
2147483647,
2147483647,
2147483647,
),
(
4294967295.5,
127,
255,
32767,
65535,
i32::MAX,
u32::MAX,
4294967295,
4294967295,
),
(
1.0e19,
127,
255,
32767,
65535,
i32::MAX,
u32::MAX,
i64::MAX,
10000000000000000000,
),
(-1.0e19, i8::MIN, 0, i16::MIN, 0, i32::MIN, 0, i64::MIN, 0),
(
1.0e300,
127,
255,
32767,
65535,
i32::MAX,
u32::MAX,
i64::MAX,
u64::MAX,
),
(
f64::INFINITY,
127,
255,
32767,
65535,
i32::MAX,
u32::MAX,
i64::MAX,
u64::MAX,
),
(
f64::NEG_INFINITY,
i8::MIN,
0,
i16::MIN,
0,
i32::MIN,
0,
i64::MIN,
0,
),
(f64::NAN, 0, 0, 0, 0, 0, 0, 0, 0),
];
for &(d, i8v, u8v, i16v, u16v, i32v, u32v, i64v, u64v) in rows {
assert_eq!(f64_to_i8(d), i8v, "(char){d}");
assert_eq!(f64_to_u8(d), u8v, "(epicsUInt8){d}");
assert_eq!(f64_to_i16(d), i16v, "(epicsInt16){d}");
assert_eq!(f64_to_u16(d), u16v, "(epicsUInt16){d}");
assert_eq!(f64_to_i32(d), i32v, "(epicsInt32){d}");
assert_eq!(f64_to_u32(d), u32v, "(epicsUInt32){d}");
assert_eq!(f64_to_i64(d), i64v, "(epicsInt64){d}");
assert_eq!(f64_to_u64(d), u64v, "(epicsUInt64){d}");
}
}
#[test]
fn saturation_is_rusts_native_as() {
assert_eq!(f64_to_i32(3.0e9), 3.0e9 as i32);
assert_eq!(f64_to_i16(70000.9), 70000.9_f64 as i16);
assert_eq!(f64_to_u32(-1.0), -1.0_f64 as u32);
}
}