diff options
| author | Brendan Zabarauskas <bjzaba@yahoo.com.au> | 2014-11-09 17:46:33 +1100 |
|---|---|---|
| committer | Brendan Zabarauskas <bjzaba@yahoo.com.au> | 2014-11-13 02:02:44 +1100 |
| commit | d431a67cecc426a4d24dcf24d72a9147b8e08860 (patch) | |
| tree | 55ed6997324f89d1b29afb8a987fef8d57389e3b /src/libcore/num | |
| parent | d1eb68e8d7d2883c70304021d5443c96bca18abb (diff) | |
| download | rust-d431a67cecc426a4d24dcf24d72a9147b8e08860.tar.gz rust-d431a67cecc426a4d24dcf24d72a9147b8e08860.zip | |
Move saturating operator methods into Int
Diffstat (limited to 'src/libcore/num')
| -rw-r--r-- | src/libcore/num/mod.rs | 59 |
1 files changed, 22 insertions, 37 deletions
diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 8bab90c57e2..457aa57d93d 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -525,6 +525,28 @@ pub trait Int: Primitive fn to_le(self) -> Self { if cfg!(target_endian = "little") { self } else { self.swap_bytes() } } + + /// Saturating addition. Returns `self + other`, saturating at the + /// numeric bounds instead of overflowing. + #[inline] + fn saturating_add(self, other: Self) -> Self { + match self.checked_add(&other) { + Some(x) => x, + None if other >= Zero::zero() => Bounded::max_value(), + None => Bounded::min_value(), + } + } + + /// Saturating subtraction. Returns `self - other`, saturating at the + /// numeric bounds instead of overflowing. + #[inline] + fn saturating_sub(self, other: Self) -> Self { + match self.checked_sub(&other) { + Some(x) => x, + None if other >= Zero::zero() => Bounded::min_value(), + None => Bounded::max_value(), + } + } } macro_rules! int_impl { @@ -1150,43 +1172,6 @@ impl_num_cast!(int, to_int) impl_num_cast!(f32, to_f32) impl_num_cast!(f64, to_f64) -/// Saturating math operations -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<T: CheckedAdd + CheckedSub + Zero + PartialOrd + Bounded> Saturating for T { - #[inline] - 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() - } - } - } -} - /// Performs addition that returns `None` instead of wrapping around on overflow. pub trait CheckedAdd: Add<Self, Self> { /// Adds two numbers, checking for overflow. If overflow happens, `None` is returned. |
