diff options
| author | Marvin Löbel <loebel.marvin@gmail.com> | 2013-01-27 03:05:20 +0100 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-02-03 15:37:23 -0800 |
| commit | 96f0512a45ffebbe7488332ec5e44827a14ce78d (patch) | |
| tree | 1375f6a28af48240f19b851a7e3910fefdd4c330 /src/libcore | |
| parent | 40f0b45f8e42357f1f16669ab937e13df21161f3 (diff) | |
| download | rust-96f0512a45ffebbe7488332ec5e44827a14ce78d.tar.gz rust-96f0512a45ffebbe7488332ec5e44827a14ce78d.zip | |
Added Round trait to core
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/num/f32.rs | 27 | ||||
| -rw-r--r-- | src/libcore/num/f64.rs | 27 | ||||
| -rw-r--r-- | src/libcore/num/float.rs | 33 | ||||
| -rw-r--r-- | src/libcore/num/int-template.rs | 12 | ||||
| -rw-r--r-- | src/libcore/num/num.rs | 15 | ||||
| -rw-r--r-- | src/libcore/num/uint-template.rs | 12 |
6 files changed, 126 insertions, 0 deletions
diff --git a/src/libcore/num/f32.rs b/src/libcore/num/f32.rs index 795a9f9371c..43b68c5fc4f 100644 --- a/src/libcore/num/f32.rs +++ b/src/libcore/num/f32.rs @@ -306,6 +306,33 @@ pub extern { fn floorf32(val: f32) -> f32; } +impl f32: num::Round { + #[inline(always)] + pure fn round(&self, mode: num::RoundMode) -> f32 { + match mode { + num::RoundDown => floor(*self), + num::RoundUp => ceil(*self), + num::RoundToZero if is_negative(*self) => ceil(*self), + num::RoundToZero => floor(*self), + num::RoundFromZero if is_negative(*self) => floor(*self), + num::RoundFromZero => ceil(*self) + } + } + + #[inline(always)] + pure fn floor(&self) -> f32 { floor(*self) } + #[inline(always)] + pure fn ceil(&self) -> f32 { ceil(*self) } + #[inline(always)] + pure fn fract(&self) -> f32 { + if is_negative(*self) { + (*self) - ceil(*self) + } else { + (*self) - floor(*self) + } + } +} + // // Local Variables: // mode: rust diff --git a/src/libcore/num/f64.rs b/src/libcore/num/f64.rs index 8cd94c9357d..851697012fc 100644 --- a/src/libcore/num/f64.rs +++ b/src/libcore/num/f64.rs @@ -330,6 +330,33 @@ pub extern { fn floorf64(val: f64) -> f64; } +impl f64: num::Round { + #[inline(always)] + pure fn round(&self, mode: num::RoundMode) -> f64 { + match mode { + num::RoundDown => floor(*self), + num::RoundUp => ceil(*self), + num::RoundToZero if is_negative(*self) => ceil(*self), + num::RoundToZero => floor(*self), + num::RoundFromZero if is_negative(*self) => floor(*self), + num::RoundFromZero => ceil(*self) + } + } + + #[inline(always)] + pure fn floor(&self) -> f64 { floor(*self) } + #[inline(always)] + pure fn ceil(&self) -> f64 { ceil(*self) } + #[inline(always)] + pure fn fract(&self) -> f64 { + if is_negative(*self) { + (*self) - ceil(*self) + } else { + (*self) - floor(*self) + } + } +} + // // Local Variables: // mode: rust diff --git a/src/libcore/num/float.rs b/src/libcore/num/float.rs index b90edec4d96..1d1be6df87a 100644 --- a/src/libcore/num/float.rs +++ b/src/libcore/num/float.rs @@ -488,6 +488,39 @@ impl float: num::One { static pure fn one() -> float { 1.0 } } +impl float: num::Round { + #[inline(always)] + pure fn round(&self, mode: num::RoundMode) -> float { + match mode { + num::RoundDown + => f64::floor(*self as f64) as float, + num::RoundUp + => f64::ceil(*self as f64) as float, + num::RoundToZero if is_negative(*self) + => f64::ceil(*self as f64) as float, + num::RoundToZero + => f64::floor(*self as f64) as float, + num::RoundFromZero if is_negative(*self) + => f64::floor(*self as f64) as float, + num::RoundFromZero + => f64::ceil(*self as f64) as float + } + } + + #[inline(always)] + pure fn floor(&self) -> float { f64::floor(*self as f64) as float} + #[inline(always)] + pure fn ceil(&self) -> float { f64::ceil(*self as f64) as float} + #[inline(always)] + pure fn fract(&self) -> float { + if is_negative(*self) { + (*self) - (f64::ceil(*self as f64) as float) + } else { + (*self) - (f64::floor(*self as f64) as float) + } + } +} + #[test] pub fn test_from_str() { assert from_str(~"3") == Some(3.); diff --git a/src/libcore/num/int-template.rs b/src/libcore/num/int-template.rs index 08508b09b70..7f3a15621ac 100644 --- a/src/libcore/num/int-template.rs +++ b/src/libcore/num/int-template.rs @@ -200,6 +200,18 @@ impl T: num::One { static pure fn one() -> T { 1 } } +impl T: num::Round { + #[inline(always)] + pure fn round(&self, _: num::RoundMode) -> T { *self } + + #[inline(always)] + pure fn floor(&self) -> T { *self } + #[inline(always)] + pure fn ceil(&self) -> T { *self } + #[inline(always)] + pure fn fract(&self) -> T { 0 } +} + /** * Parse a buffer of bytes * diff --git a/src/libcore/num/num.rs b/src/libcore/num/num.rs index 5680e3116bf..db8a741f185 100644 --- a/src/libcore/num/num.rs +++ b/src/libcore/num/num.rs @@ -35,3 +35,18 @@ pub trait Zero { pub trait One { static pure fn one() -> Self; } + +pub trait Round { + pure fn round(&self, mode: RoundMode) -> self; + + pure fn floor(&self) -> self; + pure fn ceil(&self) -> self; + pure fn fract(&self) -> self; +} + +pub enum RoundMode { + RoundDown, + RoundUp, + RoundToZero, + RoundFromZero +} diff --git a/src/libcore/num/uint-template.rs b/src/libcore/num/uint-template.rs index 1cd447df005..a59813b2df4 100644 --- a/src/libcore/num/uint-template.rs +++ b/src/libcore/num/uint-template.rs @@ -160,6 +160,18 @@ impl T: num::One { static pure fn one() -> T { 1 } } +impl T: num::Round { + #[inline(always)] + pure fn round(&self, _: num::RoundMode) -> T { *self } + + #[inline(always)] + pure fn floor(&self) -> T { *self } + #[inline(always)] + pure fn ceil(&self) -> T { *self } + #[inline(always)] + pure fn fract(&self) -> T { 0 } +} + /** * Parse a buffer of bytes * |
