diff --git a/src/common/ncast.rs b/src/common/ncast.rs index 7fc9b33..77c63b8 100644 --- a/src/common/ncast.rs +++ b/src/common/ncast.rs @@ -8,11 +8,14 @@ trait NumCast { static pure fn from(n: T) -> self; pure fn cast() -> T; + static pure fn zero() -> self; + static pure fn one() -> self; + pure fn to_u8() -> u8; pure fn to_u16() -> u16; pure fn to_u32() -> u32; pure fn to_u64() -> u64; - pure fn to_uint() -> uint; + pure fn to_uint() -> uint; pure fn to_i8() -> i8; pure fn to_i16() -> i16; @@ -32,6 +35,9 @@ pub impl u8: NumCast { #[inline(always)] static pure fn from(n: T) -> u8 { move n.to_u8() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> u8 { 0u8 } + #[inline(always)] static pure fn one() -> u8 { 1u8 } + #[inline(always)] pure fn to_u8() -> u8 { self } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -53,6 +59,9 @@ pub impl u16: NumCast { #[inline(always)] static pure fn from(n: T) -> u16 { move n.to_u16() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> u16 { 0u16 } + #[inline(always)] static pure fn one() -> u16 { 1u16 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -74,6 +83,9 @@ pub impl u32: NumCast { #[inline(always)] static pure fn from(n: T) -> u32 { move n.to_u32() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> u32 { 0u32 } + #[inline(always)] static pure fn one() -> u32 { 1u32 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self } @@ -95,6 +107,9 @@ pub impl u64: NumCast { #[inline(always)] static pure fn from(n: T) -> u64 { move n.to_u64() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> u64 { 0u64 } + #[inline(always)] static pure fn one() -> u64 { 1u64 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -116,6 +131,9 @@ pub impl uint: NumCast { #[inline(always)] static pure fn from(n: T) -> uint { move n.to_uint() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> uint { 0u } + #[inline(always)] static pure fn one() -> uint { 1u } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -137,6 +155,9 @@ pub impl i8: NumCast { #[inline(always)] static pure fn from(n: T) -> i8 { move n.to_i8() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> i8 { 0i8 } + #[inline(always)] static pure fn one() -> i8 { 1i8 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -158,6 +179,9 @@ pub impl i16: NumCast { #[inline(always)] static pure fn from(n: T) -> i16 { move n.to_i16() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> i16 { 0i16 } + #[inline(always)] static pure fn one() -> i16 { 1i16 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -179,6 +203,9 @@ pub impl i32: NumCast { #[inline(always)] static pure fn from(n: T) -> i32 { move n.to_i32() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> i32 { 0i32 } + #[inline(always)] static pure fn one() -> i32 { 1i32 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -200,6 +227,9 @@ pub impl i64: NumCast { #[inline(always)] static pure fn from(n: T) -> i64 { move n.to_i64() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> i64 { 0i64 } + #[inline(always)] static pure fn one() -> i64 { 1i64 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -221,6 +251,9 @@ pub impl int: NumCast { #[inline(always)] static pure fn from(n: T) -> int { move n.to_int() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> int { 0 } + #[inline(always)] static pure fn one() -> int { 1 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -242,6 +275,9 @@ pub impl f32: NumCast { #[inline(always)] static pure fn from(n: T) -> f32 { move n.to_f32() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> f32 { 0f32 } + #[inline(always)] static pure fn one() -> f32 { 1f32 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -263,6 +299,9 @@ pub impl f64: NumCast { #[inline(always)] static pure fn from(n: T) -> f64 { move n.to_f64() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> f64 { 0f64 } + #[inline(always)] static pure fn one() -> f64 { 1f64 } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 } @@ -284,6 +323,9 @@ pub impl float: NumCast { #[inline(always)] static pure fn from(n: T) -> float { move n.to_float() } #[inline(always)] pure fn cast() -> T { move from(self) } + #[inline(always)] static pure fn zero() -> float { 0f } + #[inline(always)] static pure fn one() -> float { 1f } + #[inline(always)] pure fn to_u8() -> u8 { self as u8 } #[inline(always)] pure fn to_u16() -> u16 { self as u16 } #[inline(always)] pure fn to_u32() -> u32 { self as u32 }