From 6f3e84dbe9434b020da73d66275c3609a2b7bb1b Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Thu, 15 Oct 2015 05:23:44 +0300 Subject: Implement conversion traits for primitive integer types --- src/libcore/num/mod.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/libcore/num') diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 340028b4beb..0b7dc216d41 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -17,6 +17,7 @@ use self::wrapping::OverflowingOps; use char::CharExt; use cmp::{Eq, PartialOrd}; +use convert::From; use fmt; use intrinsics; use marker::{Copy, Sized}; @@ -1471,3 +1472,45 @@ impl fmt::Display for ParseIntError { } pub use num::dec2flt::ParseFloatError; + +// Conversion traits for primitive integer types +// Conversions T -> T are covered by a blanket impl and therefore excluded +// Some conversions from and to usize/isize are not implemented due to portability concerns +macro_rules! impl_from { + ($Small: ty, $Large: ty) => { + #[stable(feature = "lossless_int_conv", since = "1.5.0")] + impl From<$Small> for $Large { + #[stable(feature = "lossless_int_conv", since = "1.5.0")] + #[inline] + fn from(small: $Small) -> $Large { + small as $Large + } + } + } +} + +// Unsigned -> Unsigned +impl_from! { u8, u16 } +impl_from! { u8, u32 } +impl_from! { u8, u64 } +impl_from! { u8, usize } +impl_from! { u16, u32 } +impl_from! { u16, u64 } +impl_from! { u32, u64 } + +// Signed -> Signed +impl_from! { i8, i16 } +impl_from! { i8, i32 } +impl_from! { i8, i64 } +impl_from! { i8, isize } +impl_from! { i16, i32 } +impl_from! { i16, i64 } +impl_from! { i32, i64 } + +// Unsigned -> Signed +impl_from! { u8, i16 } +impl_from! { u8, i32 } +impl_from! { u8, i64 } +impl_from! { u16, i32 } +impl_from! { u16, i64 } +impl_from! { u32, i64 } -- cgit 1.4.1-3-g733a5