@@ -13,17 +13,15 @@ use num_traits::{ConstZero, Euclid, FromPrimitive, NumCast, Signed, ToPrimitive}
13
13
pub ( crate ) trait Roundable :
14
14
Euclid + Div + PartialOrd + Signed + FromPrimitive + ToPrimitive + NumCast + ConstZero + Copy
15
15
{
16
- fn is_exact ( dividend : & Self , divisor : & Self ) -> bool ;
17
- fn compare_remainder ( dividend : & Self , divisor : & Self ) -> Option < Ordering > ;
18
- fn is_even_cardinal ( dividend : & Self , divisor : & Self ) -> bool ;
19
- fn result_floor ( dividend : & Self , divisor : & Self ) -> u64 ;
20
- fn result_ceil ( dividend : & Self , divisor : & Self ) -> u64 ;
21
- fn quotient_abs ( dividend : & Self , divisor : & Self ) -> Self {
16
+ fn is_exact ( dividend : Self , divisor : Self ) -> bool ;
17
+ fn compare_remainder ( dividend : Self , divisor : Self ) -> Option < Ordering > ;
18
+ fn is_even_cardinal ( dividend : Self , divisor : Self ) -> bool ;
19
+ fn result_floor ( dividend : Self , divisor : Self ) -> u64 ;
20
+ fn result_ceil ( dividend : Self , divisor : Self ) -> u64 ;
21
+ fn quotient_abs ( dividend : Self , divisor : Self ) -> Self {
22
22
// NOTE: Sanity debugs until proper unit tests to vet the below
23
- debug_assert ! (
24
- <i128 as NumCast >:: from( ( * dividend / * divisor) . abs( ) ) < Some ( u64 :: MAX as i128 )
25
- ) ;
26
- ( * dividend / * divisor) . abs ( )
23
+ debug_assert ! ( <i128 as NumCast >:: from( ( dividend / divisor) . abs( ) ) < Some ( u64 :: MAX as i128 ) ) ;
24
+ ( dividend / divisor) . abs ( )
27
25
}
28
26
}
29
27
@@ -64,7 +62,7 @@ impl<T: Roundable> Round for IncrementRounder<T> {
64
62
fn round ( & self , mode : TemporalRoundingMode ) -> i128 {
65
63
let unsigned_rounding_mode = mode. get_unsigned_round_mode ( self . sign ) ;
66
64
let mut rounded =
67
- apply_unsigned_rounding_mode ( & self . dividend , & self . divisor , unsigned_rounding_mode)
65
+ apply_unsigned_rounding_mode ( self . dividend , self . divisor , unsigned_rounding_mode)
68
66
as i128 ;
69
67
if !self . sign {
70
68
rounded = rounded. neg ( ) ;
@@ -77,57 +75,57 @@ impl<T: Roundable> Round for IncrementRounder<T> {
77
75
fn round_as_positive ( & self , mode : TemporalRoundingMode ) -> u64 {
78
76
let unsigned_rounding_mode = mode. get_unsigned_round_mode ( self . sign ) ;
79
77
let rounded =
80
- apply_unsigned_rounding_mode ( & self . dividend , & self . divisor , unsigned_rounding_mode) ;
78
+ apply_unsigned_rounding_mode ( self . dividend , self . divisor , unsigned_rounding_mode) ;
81
79
// TODO: Add unit tests for the below
82
80
rounded * <u64 as NumCast >:: from ( self . divisor ) . expect ( "increment is representable by a u64" )
83
81
}
84
82
}
85
83
86
84
impl Roundable for i128 {
87
- fn is_exact ( dividend : & Self , divisor : & Self ) -> bool {
85
+ fn is_exact ( dividend : Self , divisor : Self ) -> bool {
88
86
dividend. rem_euclid ( divisor) == 0
89
87
}
90
88
91
- fn compare_remainder ( dividend : & Self , divisor : & Self ) -> Option < Ordering > {
92
- Some ( dividend. rem_euclid ( divisor) . cmp ( & divisor. div_euclid ( & 2 ) ) )
89
+ fn compare_remainder ( dividend : Self , divisor : Self ) -> Option < Ordering > {
90
+ Some ( dividend. rem_euclid ( divisor) . cmp ( & divisor. div_euclid ( 2 ) ) )
93
91
}
94
92
95
- fn is_even_cardinal ( dividend : & Self , divisor : & Self ) -> bool {
93
+ fn is_even_cardinal ( dividend : Self , divisor : Self ) -> bool {
96
94
Roundable :: result_floor ( dividend, divisor) . rem_euclid ( 2 ) == 0
97
95
}
98
96
99
- fn result_floor ( dividend : & Self , divisor : & Self ) -> u64 {
97
+ fn result_floor ( dividend : Self , divisor : Self ) -> u64 {
100
98
Roundable :: quotient_abs ( dividend, divisor) as u64
101
99
}
102
100
103
- fn result_ceil ( dividend : & Self , divisor : & Self ) -> u64 {
101
+ fn result_ceil ( dividend : Self , divisor : Self ) -> u64 {
104
102
Roundable :: quotient_abs ( dividend, divisor) as u64 + 1
105
103
}
106
104
}
107
105
108
106
impl Roundable for f64 {
109
- fn is_exact ( dividend : & Self , divisor : & Self ) -> bool {
107
+ fn is_exact ( dividend : Self , divisor : Self ) -> bool {
110
108
Roundable :: quotient_abs ( dividend, divisor)
111
109
== Roundable :: quotient_abs ( dividend, divisor) . floor ( )
112
110
}
113
111
114
- fn compare_remainder ( dividend : & Self , divisor : & Self ) -> Option < Ordering > {
112
+ fn compare_remainder ( dividend : Self , divisor : Self ) -> Option < Ordering > {
115
113
let quotient = Roundable :: quotient_abs ( dividend, divisor) ;
116
114
let d1 = quotient - quotient. floor ( ) ;
117
115
let d2 = quotient. ceil ( ) - quotient;
118
116
d1. partial_cmp ( & d2)
119
117
}
120
118
121
- fn is_even_cardinal ( dividend : & Self , divisor : & Self ) -> bool {
119
+ fn is_even_cardinal ( dividend : Self , divisor : Self ) -> bool {
122
120
let quotient = Roundable :: quotient_abs ( dividend, divisor) ;
123
121
( quotient. floor ( ) / ( quotient. ceil ( ) - quotient. floor ( ) ) % 2.0 ) == 0.0
124
122
}
125
123
126
- fn result_floor ( dividend : & Self , divisor : & Self ) -> u64 {
124
+ fn result_floor ( dividend : Self , divisor : Self ) -> u64 {
127
125
Roundable :: quotient_abs ( dividend, divisor) . floor ( ) as u64
128
126
}
129
127
130
- fn result_ceil ( dividend : & Self , divisor : & Self ) -> u64 {
128
+ fn result_ceil ( dividend : Self , divisor : Self ) -> u64 {
131
129
Roundable :: quotient_abs ( dividend, divisor) . ceil ( ) as u64
132
130
}
133
131
}
@@ -153,8 +151,8 @@ pub(crate) fn to_rounding_increment(increment: Option<f64>) -> TemporalResult<u6
153
151
154
152
/// Applies the unsigned rounding mode.
155
153
fn apply_unsigned_rounding_mode < T : Roundable > (
156
- dividend : & T ,
157
- divisor : & T ,
154
+ dividend : T ,
155
+ divisor : T ,
158
156
unsigned_rounding_mode : TemporalUnsignedRoundingMode ,
159
157
) -> u64 {
160
158
// is_floor
0 commit comments