Skip to content

Commit 7d5c7b8

Browse files
committed
extra: Add getter methods to extra::rational::Ratio
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.
1 parent 7075eb3 commit 7d5c7b8

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

src/libextra/num/rational.rs

+66
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ impl<T: Clone + Integer + Ord>
5757
ret
5858
}
5959

60+
/// Convert to an integer.
61+
#[inline]
62+
pub fn to_integer(&self) -> T {
63+
self.trunc().numer
64+
}
65+
66+
/// Gets an immutable reference to the numerator.
67+
#[inline]
68+
pub fn numer<'a>(&'a self) -> &'a T {
69+
&self.numer
70+
}
71+
72+
/// Gets an immutable reference to the denominator.
73+
#[inline]
74+
pub fn denom<'a>(&'a self) -> &'a T {
75+
&self.denom
76+
}
77+
78+
/// Return true if the rational number is an integer (denominator is 1).
79+
#[inline]
80+
pub fn is_integer(&self) -> bool {
81+
self.denom == One::one()
82+
}
83+
6084
/// Put self into lowest terms, with denom > 0.
6185
fn reduce(&mut self) {
6286
let g : T = self.numer.gcd(&self.denom);
@@ -362,6 +386,48 @@ mod test {
362386
}
363387

364388

389+
#[test]
390+
fn test_to_integer() {
391+
assert_eq!(_0.to_integer(), 0);
392+
assert_eq!(_1.to_integer(), 1);
393+
assert_eq!(_2.to_integer(), 2);
394+
assert_eq!(_1_2.to_integer(), 0);
395+
assert_eq!(_3_2.to_integer(), 1);
396+
assert_eq!(_neg1_2.to_integer(), 0);
397+
}
398+
399+
400+
#[test]
401+
fn test_numer() {
402+
assert_eq!(_0.numer(), &0);
403+
assert_eq!(_1.numer(), &1);
404+
assert_eq!(_2.numer(), &2);
405+
assert_eq!(_1_2.numer(), &1);
406+
assert_eq!(_3_2.numer(), &3);
407+
assert_eq!(_neg1_2.numer(), &(-1));
408+
}
409+
#[test]
410+
fn test_denom() {
411+
assert_eq!(_0.denom(), &1);
412+
assert_eq!(_1.denom(), &1);
413+
assert_eq!(_2.denom(), &1);
414+
assert_eq!(_1_2.denom(), &2);
415+
assert_eq!(_3_2.denom(), &2);
416+
assert_eq!(_neg1_2.denom(), &2);
417+
}
418+
419+
420+
#[test]
421+
fn test_is_integer() {
422+
assert!(_0.is_integer());
423+
assert!(_1.is_integer());
424+
assert!(_2.is_integer());
425+
assert!(!_1_2.is_integer());
426+
assert!(!_3_2.is_integer());
427+
assert!(!_neg1_2.is_integer());
428+
}
429+
430+
365431
mod arith {
366432
use super::*;
367433
use super::super::*;

0 commit comments

Comments
 (0)