From 15159a5638d2cf415ea6687e88ea6f62e04bf2ae Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Wed, 14 Aug 2013 13:02:20 -0700 Subject: [PATCH] Rewrite Saturating in terms of CheckedAdd/CheckedSub --- src/libstd/num/num.rs | 65 +++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/src/libstd/num/num.rs b/src/libstd/num/num.rs index 9e72b355bf9..04a1cc11b26 100644 --- a/src/libstd/num/num.rs +++ b/src/libstd/num/num.rs @@ -468,55 +468,42 @@ impl Zero for ~T { } /// Saturating math operations -pub trait Saturating: Int { +pub trait Saturating { /// Saturating addition operator. /// Returns a+b, saturating at the numeric bounds instead of overflowing. - #[inline] - fn saturating_add(self, v: Self) -> Self { - let x = self + v; - if v >= Zero::zero() { - if x < self { - // overflow - Bounded::max_value::() - } else { x } - } else { - if x > self { - // underflow - Bounded::min_value::() - } else { x } - } - } + fn saturating_add(self, v: Self) -> Self; /// Saturating subtraction operator. /// Returns a-b, saturating at the numeric bounds instead of overflowing. + fn saturating_sub(self, v: Self) -> Self; +} + +impl Saturating for T { #[inline] - fn saturating_sub(self, v: Self) -> Self { - let x = self - v; - if v >= Zero::zero() { - if x > self { - // underflow - Bounded::min_value::() - } else { x } - } else { - if x < self { - // overflow - Bounded::max_value::() - } else { x } + fn saturating_add(self, v: T) -> T { + match self.checked_add(&v) { + Some(x) => x, + None => if v >= Zero::zero() { + Bounded::max_value::() + } else { + Bounded::min_value::() + } + } + } + + #[inline] + fn saturating_sub(self, v: T) -> T { + match self.checked_sub(&v) { + Some(x) => x, + None => if v >= Zero::zero() { + Bounded::min_value::() + } else { + Bounded::max_value::() + } } } } -impl Saturating for int {} -impl Saturating for i8 {} -impl Saturating for i16 {} -impl Saturating for i32 {} -impl Saturating for i64 {} -impl Saturating for uint {} -impl Saturating for u8 {} -impl Saturating for u16 {} -impl Saturating for u32 {} -impl Saturating for u64 {} - pub trait CheckedAdd: Add { fn checked_add(&self, v: &Self) -> Option; }