1 #[cfg(debug_assertions)] 2 use std::convert::TryInto; 3 4 // TODO remove this, use try_into wher as_* is used 5 6 pub trait Truncate { truncate_as_u8(self) -> u87 fn truncate_as_u8(self) -> u8; 8 } 9 10 impl Truncate for u16 { 11 #[allow(clippy::cast_possible_truncation)] truncate_as_u8(self) -> u812 fn truncate_as_u8(self) -> u8 { 13 (self & 0xff) as u8 14 } 15 } 16 17 pub trait As { as_u16(self) -> u1618 fn as_u16(self) -> u16; as_i16(self) -> i1619 fn as_i16(self) -> i16; as_usize(self) -> usize20 fn as_usize(self) -> usize; 21 } 22 23 macro_rules! impl_as { 24 ($ty:ty) => { 25 #[cfg(debug_assertions)] 26 impl As for $ty { 27 fn as_u16(self) -> u16 { 28 self.try_into().unwrap() 29 } 30 31 fn as_i16(self) -> i16 { 32 self.try_into().unwrap() 33 } 34 35 fn as_usize(self) -> usize { 36 self.try_into().unwrap() 37 } 38 } 39 40 #[cfg(not(debug_assertions))] 41 impl As for $ty { 42 fn as_u16(self) -> u16 { 43 self as u16 44 } 45 fn as_i16(self) -> i16 { 46 self as i16 47 } 48 fn as_usize(self) -> usize { 49 self as usize 50 } 51 } 52 }; 53 } 54 55 impl_as!(i16); 56 impl_as!(u32); 57 impl_as!(usize); 58