@@ -731,6 +731,16 @@ macro_rules! impl_primitive_ops_ratio {
731
731
}
732
732
}
733
733
734
+ #[ cfg( feature = "bigint" ) ]
735
+ impl <' a> Add <& ' a BigRational > for $primitive {
736
+ type Output = BigRational ;
737
+
738
+ #[ inline]
739
+ fn add( self , rhs: & ' a BigRational ) -> BigRational {
740
+ Ratio :: new( rhs. numer. clone( ) + BigInt :: from( self ) , rhs. denom. clone( ) )
741
+ }
742
+ }
743
+
734
744
impl <T > Sub <Ratio <T >> for $primitive
735
745
where
736
746
T : Clone + Integer + :: core:: convert:: From <$primitive>,
@@ -743,6 +753,16 @@ macro_rules! impl_primitive_ops_ratio {
743
753
}
744
754
}
745
755
756
+ #[ cfg( feature = "bigint" ) ]
757
+ impl <' a> Sub <& ' a BigRational > for $primitive {
758
+ type Output = BigRational ;
759
+
760
+ #[ inline]
761
+ fn sub( self , rhs: & ' a BigRational ) -> BigRational {
762
+ Ratio :: new( BigInt :: from( self ) - rhs. numer. clone( ) , rhs. denom. clone( ) )
763
+ }
764
+ }
765
+
746
766
impl <T > Mul <Ratio <T >> for $primitive
747
767
where
748
768
T : Clone + Integer + :: core:: convert:: From <$primitive>,
@@ -755,6 +775,16 @@ macro_rules! impl_primitive_ops_ratio {
755
775
}
756
776
}
757
777
778
+ #[ cfg( feature = "bigint" ) ]
779
+ impl <' a> Mul <& ' a BigRational > for $primitive {
780
+ type Output = BigRational ;
781
+
782
+ #[ inline]
783
+ fn mul( self , rhs: & ' a BigRational ) -> BigRational {
784
+ Ratio :: new( rhs. numer. clone( ) * BigInt :: from( self ) , rhs. denom. clone( ) )
785
+ }
786
+ }
787
+
758
788
impl <T > Div <Ratio <T >> for $primitive
759
789
where
760
790
T : Clone + Integer + :: core:: convert:: From <$primitive>,
@@ -766,6 +796,16 @@ macro_rules! impl_primitive_ops_ratio {
766
796
Ratio :: new( rhs. numer, rhs. denom * T :: from( self ) )
767
797
}
768
798
}
799
+
800
+ #[ cfg( feature = "bigint" ) ]
801
+ impl <' a> Div <& ' a BigRational > for $primitive {
802
+ type Output = BigRational ;
803
+
804
+ #[ inline]
805
+ fn div( self , rhs: & ' a BigRational ) -> BigRational {
806
+ Ratio :: new( rhs. numer. clone( ) , rhs. denom. clone( ) * BigInt :: from( self ) )
807
+ }
808
+ }
769
809
} ;
770
810
}
771
811
@@ -1686,12 +1726,12 @@ mod test {
1686
1726
}
1687
1727
1688
1728
mod arith {
1689
- #[ cfg( feature = "bigint" ) ]
1690
- use bigint:: BigInt ;
1691
1729
#[ cfg( feature = "bigint" ) ]
1692
1730
use super :: super :: BigRational ;
1693
1731
use super :: super :: { Ratio , Rational , Rational32 , Rational64 } ;
1694
1732
use super :: { _0, _1, _1_2, _2, _3_2, _NEG1_2, to_big} ;
1733
+ #[ cfg( feature = "bigint" ) ]
1734
+ use bigint:: BigInt ;
1695
1735
use traits:: { CheckedAdd , CheckedDiv , CheckedMul , CheckedSub } ;
1696
1736
1697
1737
const _1I32: Rational32 = Ratio { numer : 1 , denom : 1 } ;
@@ -1849,6 +1889,9 @@ mod test {
1849
1889
fn test_isize ( a : isize , b : BigRational , c : BigRational ) {
1850
1890
assert_eq ! ( a + b, c) ;
1851
1891
}
1892
+ fn test_isize_ref ( a : isize , b : & BigRational , c : BigRational ) {
1893
+ assert_eq ! ( a + b, c) ;
1894
+ }
1852
1895
fn test_usize ( a : usize , b : BigRational , c : BigRational ) {
1853
1896
assert_eq ! ( a + b, c) ;
1854
1897
}
@@ -1887,8 +1930,12 @@ mod test {
1887
1930
fn test_bigint ( a : BigInt , b : BigRational , c : BigRational ) {
1888
1931
assert_eq ! ( a + b, c) ;
1889
1932
}
1933
+ fn test_bigint_ref ( a : BigInt , b : & BigRational , c : BigRational ) {
1934
+ assert_eq ! ( a + b, c) ;
1935
+ }
1890
1936
1891
1937
test_isize ( -2 , to_big ( _1) , to_big ( _NEG1) ) ;
1938
+ test_isize_ref ( -2 , & to_big ( _1) , to_big ( _NEG1) ) ;
1892
1939
test_usize ( 1 , to_big ( _1) , to_big ( _2) ) ;
1893
1940
test_i8 ( -2 , to_big ( _1) , to_big ( _NEG1) ) ;
1894
1941
test_u8 ( 1 , to_big ( _1) , to_big ( _2) ) ;
@@ -1903,6 +1950,7 @@ mod test {
1903
1950
#[ cfg( has_i128) ]
1904
1951
test_u128 ( 1 , to_big ( _1) , to_big ( _2) ) ;
1905
1952
test_bigint ( BigInt :: from ( 1 ) , to_big ( _1) , to_big ( _2) ) ;
1953
+ test_bigint_ref ( BigInt :: from ( 1 ) , & to_big ( _1) , to_big ( _2) ) ;
1906
1954
}
1907
1955
1908
1956
#[ cfg( feature = "bigint" ) ]
@@ -2088,6 +2136,9 @@ mod test {
2088
2136
fn test_isize ( a : isize , b : BigRational , c : BigRational ) {
2089
2137
assert_eq ! ( a - b, c) ;
2090
2138
}
2139
+ fn test_isize_ref ( a : isize , b : & BigRational , c : BigRational ) {
2140
+ assert_eq ! ( a - b, c) ;
2141
+ }
2091
2142
fn test_usize ( a : usize , b : BigRational , c : BigRational ) {
2092
2143
assert_eq ! ( a - b, c) ;
2093
2144
}
@@ -2126,8 +2177,12 @@ mod test {
2126
2177
fn test_bigint ( a : BigInt , b : BigRational , c : BigRational ) {
2127
2178
assert_eq ! ( a - b, c) ;
2128
2179
}
2180
+ fn test_bigint_ref ( a : BigInt , b : & BigRational , c : BigRational ) {
2181
+ assert_eq ! ( a - b, c) ;
2182
+ }
2129
2183
2130
2184
test_isize ( -1 , to_big ( _1) , to_big ( _NEG2) ) ;
2185
+ test_isize_ref ( -1 , & to_big ( _1) , to_big ( _NEG2) ) ;
2131
2186
test_usize ( 2 , to_big ( _1) , to_big ( _1) ) ;
2132
2187
test_i8 ( -1 , to_big ( _1) , to_big ( _NEG2) ) ;
2133
2188
test_u8 ( 2 , to_big ( _1) , to_big ( _1) ) ;
@@ -2142,6 +2197,7 @@ mod test {
2142
2197
#[ cfg( has_i128) ]
2143
2198
test_u128 ( 2 , to_big ( _1) , to_big ( _1) ) ;
2144
2199
test_bigint ( BigInt :: from ( 2 ) , to_big ( _1) , to_big ( _1) ) ;
2200
+ test_bigint_ref ( BigInt :: from ( 2 ) , & to_big ( _1) , to_big ( _1) ) ;
2145
2201
}
2146
2202
2147
2203
#[ cfg( feature = "bigint" ) ]
@@ -2327,6 +2383,9 @@ mod test {
2327
2383
fn test_isize ( a : isize , b : BigRational , c : BigRational ) {
2328
2384
assert_eq ! ( a * b, c) ;
2329
2385
}
2386
+ fn test_isize_ref ( a : isize , b : & BigRational , c : BigRational ) {
2387
+ assert_eq ! ( a * b, c) ;
2388
+ }
2330
2389
fn test_usize ( a : usize , b : BigRational , c : BigRational ) {
2331
2390
assert_eq ! ( a * b, c) ;
2332
2391
}
@@ -2365,8 +2424,12 @@ mod test {
2365
2424
fn test_bigint ( a : BigInt , b : BigRational , c : BigRational ) {
2366
2425
assert_eq ! ( a * b, c) ;
2367
2426
}
2427
+ fn test_bigint_ref ( a : BigInt , b : & BigRational , c : BigRational ) {
2428
+ assert_eq ! ( a * b, c) ;
2429
+ }
2368
2430
2369
2431
test_isize ( -2 , to_big ( _1_2) , to_big ( _NEG1) ) ;
2432
+ test_isize_ref ( -2 , & to_big ( _1_2) , to_big ( _NEG1) ) ;
2370
2433
test_usize ( 2 , to_big ( _1_2) , to_big ( _1) ) ;
2371
2434
test_i8 ( -2 , to_big ( _1_2) , to_big ( _NEG1) ) ;
2372
2435
test_u8 ( 2 , to_big ( _1_2) , to_big ( _1) ) ;
@@ -2381,6 +2444,7 @@ mod test {
2381
2444
#[ cfg( has_i128) ]
2382
2445
test_u128 ( 2 , to_big ( _1_2) , to_big ( _1) ) ;
2383
2446
test_bigint ( BigInt :: from ( 2 ) , to_big ( _1_2) , to_big ( _1) ) ;
2447
+ test_bigint_ref ( BigInt :: from ( 2 ) , & to_big ( _1_2) , to_big ( _1) ) ;
2384
2448
}
2385
2449
2386
2450
#[ cfg( feature = "bigint" ) ]
@@ -2566,6 +2630,9 @@ mod test {
2566
2630
fn test_isize ( a : isize , b : BigRational , c : BigRational ) {
2567
2631
assert_eq ! ( a / b, c) ;
2568
2632
}
2633
+ fn test_isize_ref ( a : isize , b : & BigRational , c : BigRational ) {
2634
+ assert_eq ! ( a / b, c) ;
2635
+ }
2569
2636
fn test_usize ( a : usize , b : BigRational , c : BigRational ) {
2570
2637
assert_eq ! ( a / b, c) ;
2571
2638
}
@@ -2604,8 +2671,12 @@ mod test {
2604
2671
fn test_bigint ( a : BigInt , b : BigRational , c : BigRational ) {
2605
2672
assert_eq ! ( a / b, c) ;
2606
2673
}
2674
+ fn test_bigint_ref ( a : BigInt , b : & BigRational , c : BigRational ) {
2675
+ assert_eq ! ( a / b, c) ;
2676
+ }
2607
2677
2608
2678
test_isize ( -2 , to_big ( _2) , to_big ( _NEG1) ) ;
2679
+ test_isize_ref ( -2 , & to_big ( _2) , to_big ( _NEG1) ) ;
2609
2680
test_usize ( 2 , to_big ( _2) , to_big ( _1) ) ;
2610
2681
test_i8 ( -2 , to_big ( _2) , to_big ( _NEG1) ) ;
2611
2682
test_u8 ( 2 , to_big ( _2) , to_big ( _1) ) ;
@@ -2620,6 +2691,7 @@ mod test {
2620
2691
#[ cfg( has_i128) ]
2621
2692
test_u128 ( 2 , to_big ( _2) , to_big ( _1) ) ;
2622
2693
test_bigint ( BigInt :: from ( 2 ) , to_big ( _2) , to_big ( _1) ) ;
2694
+ test_bigint_ref ( BigInt :: from ( 2 ) , & to_big ( _2) , to_big ( _1) ) ;
2623
2695
}
2624
2696
2625
2697
#[ cfg( feature = "bigint" ) ]
0 commit comments