about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-10-27 22:41:18 -0700
committerbors <bors@rust-lang.org>2013-10-27 22:41:18 -0700
commitcb5b21eba713ff3888b2741db4c9e7d841cfde02 (patch)
tree29532a6552588243141ca65de295f57e1d0f1d44
parent9293a4127bffe08f6a6e2fbbec9e52229291c58c (diff)
parent7d5c7b8083acc8fe6bb466bb11c60d597384f978 (diff)
downloadrust-cb5b21eba713ff3888b2741db4c9e7d841cfde02.tar.gz
rust-cb5b21eba713ff3888b2741db4c9e7d841cfde02.zip
auto merge of #10050 : gifnksm/rust/ratio-methods, r=pcwalton
After merging 0ada7c7, user code have not been able to access to `Ratio`'s numerator and denominator fields.
In some algorithms, it is needed to get an rational number's numerator or denominator, but keeping these fields private is necessary for guaranteeing that `Ratio` numbers are irreducible.
So, I added the getter methods `numer()` and `denom()`.

As a bonus, this commit adds utility methods relating to the ratio-integer conversion.
-rw-r--r--src/libextra/num/rational.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/libextra/num/rational.rs b/src/libextra/num/rational.rs
index bdec950c87b..2f470a83cdc 100644
--- a/src/libextra/num/rational.rs
+++ b/src/libextra/num/rational.rs
@@ -57,6 +57,30 @@ impl<T: Clone + Integer + Ord>
         ret
     }
 
+    /// Convert to an integer.
+    #[inline]
+    pub fn to_integer(&self) -> T {
+        self.trunc().numer
+    }
+
+    /// Gets an immutable reference to the numerator.
+    #[inline]
+    pub fn numer<'a>(&'a self) -> &'a T {
+        &self.numer
+    }
+
+    /// Gets an immutable reference to the denominator.
+    #[inline]
+    pub fn denom<'a>(&'a self) -> &'a T {
+        &self.denom
+    }
+
+    /// Return true if the rational number is an integer (denominator is 1).
+    #[inline]
+    pub fn is_integer(&self) -> bool {
+        self.denom == One::one()
+    }
+
     /// Put self into lowest terms, with denom > 0.
     fn reduce(&mut self) {
         let g : T = self.numer.gcd(&self.denom);
@@ -362,6 +386,48 @@ mod test {
     }
 
 
+    #[test]
+    fn test_to_integer() {
+        assert_eq!(_0.to_integer(), 0);
+        assert_eq!(_1.to_integer(), 1);
+        assert_eq!(_2.to_integer(), 2);
+        assert_eq!(_1_2.to_integer(), 0);
+        assert_eq!(_3_2.to_integer(), 1);
+        assert_eq!(_neg1_2.to_integer(), 0);
+    }
+
+
+    #[test]
+    fn test_numer() {
+        assert_eq!(_0.numer(), &0);
+        assert_eq!(_1.numer(), &1);
+        assert_eq!(_2.numer(), &2);
+        assert_eq!(_1_2.numer(), &1);
+        assert_eq!(_3_2.numer(), &3);
+        assert_eq!(_neg1_2.numer(), &(-1));
+    }
+    #[test]
+    fn test_denom() {
+        assert_eq!(_0.denom(), &1);
+        assert_eq!(_1.denom(), &1);
+        assert_eq!(_2.denom(), &1);
+        assert_eq!(_1_2.denom(), &2);
+        assert_eq!(_3_2.denom(), &2);
+        assert_eq!(_neg1_2.denom(), &2);
+    }
+
+
+    #[test]
+    fn test_is_integer() {
+        assert!(_0.is_integer());
+        assert!(_1.is_integer());
+        assert!(_2.is_integer());
+        assert!(!_1_2.is_integer());
+        assert!(!_3_2.is_integer());
+        assert!(!_neg1_2.is_integer());
+    }
+
+
     mod arith {
         use super::*;
         use super::super::*;