about summary refs log tree commit diff
path: root/src/libcore/num
diff options
context:
space:
mode:
authorBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-11-09 17:46:33 +1100
committerBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-11-13 02:02:44 +1100
commitd431a67cecc426a4d24dcf24d72a9147b8e08860 (patch)
tree55ed6997324f89d1b29afb8a987fef8d57389e3b /src/libcore/num
parentd1eb68e8d7d2883c70304021d5443c96bca18abb (diff)
downloadrust-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.rs59
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.