use ordered_float::OrderedFloat; pub trait LossyFrom { fn lossy_from(x: T) -> Self; } // --- // u32 // --- impl LossyFrom for u32 { #[inline(always)] fn lossy_from(x: u32) -> Self { x } } impl LossyFrom for u32 { #[inline(always)] fn lossy_from(x: u64) -> Self { x as u32 } } impl LossyFrom for u32 { #[inline(always)] fn lossy_from(x: usize) -> Self { x as u32 } } impl LossyFrom for u32 { #[inline(always)] fn lossy_from(x: f32) -> Self { x as u32 } } impl LossyFrom> for u32 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 as u32 } } // --- // u64 // --- impl LossyFrom for u64 { #[inline(always)] fn lossy_from(x: u32) -> Self { x as u64 } } impl LossyFrom for u64 { #[inline(always)] fn lossy_from(x: u64) -> Self { x } } impl LossyFrom for u64 { #[inline(always)] fn lossy_from(x: usize) -> Self { x as u64 } } impl LossyFrom for u64 { #[inline(always)] fn lossy_from(x: f32) -> Self { x as u64 } } impl LossyFrom> for u64 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 as u64 } } // --- // usize // --- impl LossyFrom for usize { #[inline(always)] fn lossy_from(x: usize) -> Self { x } } impl LossyFrom for usize { #[inline(always)] fn lossy_from(x: f32) -> Self { x.round() as usize } } // --- // f32 // --- impl LossyFrom for f32 { #[inline(always)] fn lossy_from(x: u32) -> Self { x as f32 } } impl LossyFrom for f32 { #[inline(always)] fn lossy_from(x: u64) -> Self { x as f32 } } impl LossyFrom for f32 { #[inline(always)] fn lossy_from(x: usize) -> Self { x as f32 } } impl LossyFrom for f32 { #[inline(always)] fn lossy_from(x: f32) -> Self { x } } impl LossyFrom> for f32 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 } } impl LossyFrom for f32 { #[inline(always)] fn lossy_from(x: f64) -> Self { x as f32 } } impl LossyFrom> for f32 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 as f32 } } // --- // OrderedFloat // --- impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: u32) -> Self { OrderedFloat(x as f32) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: u64) -> Self { OrderedFloat(x as f32) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: usize) -> Self { OrderedFloat(x as f32) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: f32) -> Self { OrderedFloat(x) } } impl LossyFrom> for OrderedFloat { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: f64) -> Self { OrderedFloat(x as f32) } } impl LossyFrom> for OrderedFloat { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { OrderedFloat(x.0 as f32) } } // --- // f64 // --- impl LossyFrom for f64 { #[inline(always)] fn lossy_from(x: u64) -> Self { x as f64 } } impl LossyFrom for f64 { #[inline(always)] fn lossy_from(x: usize) -> Self { x as f64 } } impl LossyFrom for f64 { #[inline(always)] fn lossy_from(x: f32) -> Self { x as f64 } } impl LossyFrom> for f64 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 as f64 } } impl LossyFrom for f64 { #[inline(always)] fn lossy_from(x: f64) -> Self { x } } impl LossyFrom> for f64 { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x.0 } } // --- // OrderedFloat // --- impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: u64) -> Self { OrderedFloat(x as f64) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: usize) -> Self { OrderedFloat(x as f64) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: f32) -> Self { OrderedFloat(x as f64) } } impl LossyFrom> for OrderedFloat { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { OrderedFloat(x.0 as f64) } } impl LossyFrom for OrderedFloat { #[inline(always)] fn lossy_from(x: f64) -> Self { OrderedFloat(x) } } impl LossyFrom> for OrderedFloat { #[inline(always)] fn lossy_from(x: OrderedFloat) -> Self { x } }