@@ -23,7 +23,6 @@ extern crate std;
2323extern crate num_traits as traits;
2424
2525use core:: ops:: Add ;
26- use core:: mem;
2726
2827use traits:: { Num , Signed } ;
2928
@@ -275,16 +274,20 @@ macro_rules! impl_integer_for_isize {
275274 n = n. abs( ) ;
276275
277276 // divide n and m by 2 until odd
278- // m inside loop
279277 n >>= n. trailing_zeros( ) ;
280-
281- while m != 0 {
282- m >>= m. trailing_zeros( ) ;
283- if n > m { mem:: swap( & mut n, & mut m) }
284- m -= n;
278+ m >>= m. trailing_zeros( ) ;
279+
280+ loop {
281+ if m > n {
282+ m -= n;
283+ if m == 0 { return n << shift; }
284+ m >>= m. trailing_zeros( ) ;
285+ } else {
286+ n -= m;
287+ if n == 0 { return m << shift; }
288+ n >>= n. trailing_zeros( ) ;
289+ }
285290 }
286-
287- n << shift
288291 }
289292
290293 /// Calculates the Lowest Common Multiple (LCM) of the number and
@@ -537,16 +540,20 @@ macro_rules! impl_integer_for_usize {
537540 let shift = ( m | n) . trailing_zeros( ) ;
538541
539542 // divide n and m by 2 until odd
540- // m inside loop
541543 n >>= n. trailing_zeros( ) ;
542-
543- while m != 0 {
544- m >>= m. trailing_zeros( ) ;
545- if n > m { mem:: swap( & mut n, & mut m) }
546- m -= n;
544+ m >>= m. trailing_zeros( ) ;
545+
546+ loop {
547+ if m > n {
548+ m -= n;
549+ if m == 0 { return n << shift; }
550+ m >>= m. trailing_zeros( ) ;
551+ } else {
552+ n -= m;
553+ if n == 0 { return m << shift; }
554+ n >>= n. trailing_zeros( ) ;
555+ }
547556 }
548-
549- n << shift
550557 }
551558
552559 /// Calculates the Lowest Common Multiple (LCM) of the number and `other`.
0 commit comments