pub trait Truncate<T> {
fn truncate(self) -> T;
}
impl Truncate<i8> for i8 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for i16 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for i32 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for i64 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for i128 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for isize { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for f32 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i8> for f64 { fn truncate(self) -> i8 { self as i8 } }
impl Truncate<i16> for i8 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for i16 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for i32 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for i64 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for i128 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for isize { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for f32 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for f64 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i32> for i8 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for i16 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for i32 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for i64 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for i128 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for isize { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for f32 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for f64 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i64> for i8 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for i16 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for i32 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for i64 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for i128 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for isize { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for f32 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for f64 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i128> for i8 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for i16 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for i32 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for i64 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for i128 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for isize { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for f32 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for f64 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<isize> for i8 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for i16 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for i32 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for i64 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for i128 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for isize { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for f32 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for f64 { fn truncate(self) -> isize { self as isize } }
impl Truncate<f32> for i8 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for i16 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for i32 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for i64 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for i128 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for isize { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for f32 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f32> for f64 { fn truncate(self) -> f32 { self as f32 } }
impl Truncate<f64> for i8 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for i16 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for i32 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for i64 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for i128 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for isize { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for f32 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<f64> for f64 { fn truncate(self) -> f64 { self as f64 } }
impl Truncate<u8> for u8 { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u8> for u16 { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u8> for u32 { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u8> for u64 { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u8> for u128 { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u8> for usize { fn truncate(self) -> u8 { self as u8 } }
impl Truncate<u16> for u8 { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u16> for u16 { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u16> for u32 { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u16> for u64 { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u16> for u128 { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u16> for usize { fn truncate(self) -> u16 { self as u16 } }
impl Truncate<u32> for u8 { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u32> for u16 { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u32> for u32 { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u32> for u64 { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u32> for u128 { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u32> for usize { fn truncate(self) -> u32 { self as u32 } }
impl Truncate<u64> for u8 { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u64> for u16 { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u64> for u32 { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u64> for u64 { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u64> for u128 { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u64> for usize { fn truncate(self) -> u64 { self as u64 } }
impl Truncate<u128> for u8 { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<u128> for u16 { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<u128> for u32 { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<u128> for u64 { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<u128> for u128 { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<u128> for usize { fn truncate(self) -> u128 { self as u128 } }
impl Truncate<usize> for u8 { fn truncate(self) -> usize { self as usize } }
impl Truncate<usize> for u16 { fn truncate(self) -> usize { self as usize } }
impl Truncate<usize> for u32 { fn truncate(self) -> usize { self as usize } }
impl Truncate<usize> for u64 { fn truncate(self) -> usize { self as usize } }
impl Truncate<usize> for u128 { fn truncate(self) -> usize { self as usize } }
impl Truncate<usize> for usize { fn truncate(self) -> usize { self as usize } }
impl Truncate<i8> for u8 { fn truncate(self) -> i8 { (self & i8::MAX as u8) as i8 } }
impl Truncate<i8> for u16 { fn truncate(self) -> i8 { (self & i8::MAX as u16) as i8 } }
impl Truncate<i8> for u32 { fn truncate(self) -> i8 { (self & i8::MAX as u32) as i8 } }
impl Truncate<i8> for u64 { fn truncate(self) -> i8 { (self & i8::MAX as u64) as i8 } }
impl Truncate<i8> for u128 { fn truncate(self) -> i8 { (self & i8::MAX as u128) as i8 } }
impl Truncate<i8> for usize { fn truncate(self) -> i8 { (self & i8::MAX as usize) as i8 } }
impl Truncate<i16> for u8 { fn truncate(self) -> i16 { self as i16 } }
impl Truncate<i16> for u16 { fn truncate(self) -> i16 { (self & i16::MAX as u16) as i16 } }
impl Truncate<i16> for u32 { fn truncate(self) -> i16 { (self & i16::MAX as u32) as i16 } }
impl Truncate<i16> for u64 { fn truncate(self) -> i16 { (self & i16::MAX as u64) as i16 } }
impl Truncate<i16> for u128 { fn truncate(self) -> i16 { (self & i16::MAX as u128) as i16 } }
impl Truncate<i16> for usize { fn truncate(self) -> i16 { (self & i16::MAX as usize) as i16 } }
impl Truncate<i32> for u8 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for u16 { fn truncate(self) -> i32 { self as i32 } }
impl Truncate<i32> for u32 { fn truncate(self) -> i32 { (self & i32::MAX as u32) as i32 } }
impl Truncate<i32> for u64 { fn truncate(self) -> i32 { (self & i32::MAX as u64) as i32 } }
impl Truncate<i32> for u128 { fn truncate(self) -> i32 { (self & i32::MAX as u128) as i32 } }
impl Truncate<i32> for usize { fn truncate(self) -> i32 { (self & i32::MAX as usize) as i32 } }
impl Truncate<i64> for u8 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for u16 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for u32 { fn truncate(self) -> i64 { self as i64 } }
impl Truncate<i64> for u64 { fn truncate(self) -> i64 { (self & i64::MAX as u64) as i64 } }
impl Truncate<i64> for u128 { fn truncate(self) -> i64 { (self & i64::MAX as u128) as i64 } }
impl Truncate<i64> for usize { fn truncate(self) -> i64 { (self & i64::MAX as usize) as i64 } }
impl Truncate<i128> for u8 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for u16 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for u32 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for u64 { fn truncate(self) -> i128 { self as i128 } }
impl Truncate<i128> for u128 { fn truncate(self) -> i128 { (self & i128::MAX as u128) as i128 } }
impl Truncate<i128> for usize { fn truncate(self) -> i128 { (self & i128::MAX as usize) as i128 } }
impl Truncate<isize> for u8 { fn truncate(self) -> isize { self as isize } }
impl Truncate<isize> for u16 { fn truncate(self) -> isize { (self & isize::MAX as u16) as isize } }
impl Truncate<isize> for u32 { fn truncate(self) -> isize { (self & isize::MAX as u32) as isize } }
impl Truncate<isize> for u64 { fn truncate(self) -> isize { (self & isize::MAX as u64) as isize } }
impl Truncate<isize> for u128 { fn truncate(self) -> isize { (self & isize::MAX as u128) as isize } }
impl Truncate<isize> for usize { fn truncate(self) -> isize { (self & isize::MAX as usize) as isize } }
impl Truncate<u8> for i8 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for i16 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for i32 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for i64 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for i128 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for isize { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for f32 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u8> for f64 { fn truncate(self) -> u8 { self.abs() as u8 } }
impl Truncate<u16> for i8 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for i16 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for i32 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for i64 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for i128 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for isize { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for f32 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u16> for f64 { fn truncate(self) -> u16 { self.abs() as u16 } }
impl Truncate<u32> for i8 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for i16 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for i32 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for i64 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for i128 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for isize { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for f32 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u32> for f64 { fn truncate(self) -> u32 { self.abs() as u32 } }
impl Truncate<u64> for i8 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for i16 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for i32 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for i64 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for i128 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for isize { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for f32 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u64> for f64 { fn truncate(self) -> u64 { self.abs() as u64 } }
impl Truncate<u128> for i8 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for i16 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for i32 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for i64 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for i128 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for isize { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for f32 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<u128> for f64 { fn truncate(self) -> u128 { self.abs() as u128 } }
impl Truncate<usize> for i8 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for i16 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for i32 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for i64 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for i128 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for isize { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for f32 { fn truncate(self) -> usize { self.abs() as usize } }
impl Truncate<usize> for f64 { fn truncate(self) -> usize { self.abs() as usize } }
#[test]
fn test_units() {
assert_eq!(1u8, (-1i8).truncate());
assert_eq!(1usize, (-1i8).truncate());
assert_eq!(-1f32, (-1i8).truncate());
assert_eq!(-1i8, (-1f32).truncate());
assert_eq!(1u8, (-1f32).truncate());
}