diff --git a/src/libstd/num/num.rs b/src/libstd/num/num.rs index 9e72b355bf9f9..04a1cc11b2673 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. + 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_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: T) -> T { + match self.checked_add(&v) { + Some(x) => x, + None => if v >= Zero::zero() { + Bounded::max_value::() + } else { + Bounded::min_value::() + } } } - /// Saturating subtraction operator. - /// Returns a-b, saturating at the numeric bounds instead of overflowing. #[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_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; }