2012-11-02 00:10:27 +00:00
|
|
|
/**
|
|
|
|
* This trait allows you to easily cast between the built in numeric types,
|
|
|
|
* going above and beyond the static 'to_int' function found in the Num trait.
|
|
|
|
* I've found that it is especially handy in generic functions when you need to
|
|
|
|
* mix floating point and integer values.
|
|
|
|
*/
|
2012-11-01 01:34:38 +00:00
|
|
|
trait NumCast {
|
|
|
|
static pure fn from<T:NumCast>(n: T) -> self;
|
|
|
|
pure fn cast<T:NumCast>() -> T;
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
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_i8() -> i8;
|
|
|
|
pure fn to_i16() -> i16;
|
|
|
|
pure fn to_i32() -> i32;
|
|
|
|
pure fn to_i64() -> i64;
|
|
|
|
pure fn to_int() -> int;
|
|
|
|
|
|
|
|
pure fn to_f32() -> f32;
|
|
|
|
pure fn to_f64() -> f64;
|
|
|
|
pure fn to_float() -> float;
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline(always)]
|
|
|
|
pub pure fn cast<T:NumCast, U:NumCast>(n: T) -> U { n.cast() }
|
|
|
|
|
|
|
|
pub impl u8: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> u8 { n.to_u8() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl u16: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> u16 { n.to_u16() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl u32: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> u32 { n.to_u32() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl u64: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> u64 { n.to_u64() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl uint: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> uint { n.to_uint() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl i8: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> i8 { n.to_i8() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl i16: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> i16 { n.to_i16() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl i32: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> i32 { n.to_i32() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl i64: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> i64 { n.to_i64() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl int: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> int { n.to_int() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl f32: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> f32 { n.to_f32() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl f64: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> f64 { n.to_f64() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self as float }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub impl float: NumCast {
|
2012-11-02 00:47:34 +00:00
|
|
|
#[inline(always)] static pure fn from<T:NumCast>(n: T) -> float { n.to_float() }
|
2012-11-01 01:34:38 +00:00
|
|
|
#[inline(always)] pure fn cast<T:NumCast>() -> T { from(self) }
|
|
|
|
|
2012-11-02 00:47:34 +00:00
|
|
|
#[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 }
|
|
|
|
#[inline(always)] pure fn to_u64() -> u64 { self as u64 }
|
|
|
|
#[inline(always)] pure fn to_uint() -> uint { self as uint }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_i8() -> i8 { self as i8 }
|
|
|
|
#[inline(always)] pure fn to_i16() -> i16 { self as i16 }
|
|
|
|
#[inline(always)] pure fn to_i32() -> i32 { self as i32 }
|
|
|
|
#[inline(always)] pure fn to_i64() -> i64 { self as i64 }
|
|
|
|
#[inline(always)] pure fn to_int() -> int { self as int }
|
|
|
|
|
|
|
|
#[inline(always)] pure fn to_f32() -> f32 { self as f32 }
|
|
|
|
#[inline(always)] pure fn to_f64() -> f64 { self as f64 }
|
|
|
|
#[inline(always)] pure fn to_float() -> float { self }
|
2012-11-01 01:34:38 +00:00
|
|
|
}
|