Skip to content

Commit dec1021

Browse files
author
Jonathan Pallant
committed
In general, T * T -> T is not valid, but f64 * T is.
1 parent 6bd3299 commit dec1021

File tree

6 files changed

+72
-46
lines changed

6 files changed

+72
-46
lines changed

src/measurement.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,6 @@ macro_rules! implement_measurement {
106106
}
107107
}
108108

109-
// Multiplying a `$t` by another `$t` returns the product of those
110-
// measurements.
111-
impl ::std::ops::Mul<$t> for $t {
112-
type Output = Self;
113-
114-
fn mul(self, rhs: Self) -> Self {
115-
Self::from_base_units(self.get_base_units() * rhs.get_base_units())
116-
}
117-
}
118-
119109
// Multiplying a `$t` by a factor increases (or decreases) that
120110
// measurement a number of times.
121111
impl ::std::ops::Mul<f64> for $t {
@@ -126,6 +116,15 @@ macro_rules! implement_measurement {
126116
}
127117
}
128118

119+
// Multiplying by a factor is commutative
120+
impl ::std::ops::Mul<$t> for f64 {
121+
type Output = $t;
122+
123+
fn mul(self, rhs: $t) -> $t {
124+
rhs * self
125+
}
126+
}
127+
129128
impl ::std::cmp::Eq for $t { }
130129
impl ::std::cmp::PartialEq for $t {
131130
fn eq(&self, other: &Self) -> bool {

src/temperature.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ impl ::std::ops::Add<TemperatureDelta> for Temperature {
138138
}
139139
}
140140

141+
impl ::std::ops::Add<Temperature> for TemperatureDelta {
142+
type Output = Temperature;
143+
144+
fn add(self, other: Temperature) -> Temperature {
145+
other + self
146+
}
147+
}
148+
141149
impl ::std::ops::Sub<TemperatureDelta> for Temperature {
142150
type Output = Temperature;
143151

@@ -167,18 +175,5 @@ impl ::std::cmp::PartialOrd for Temperature {
167175
}
168176
}
169177

170-
impl ::std::cmp::Eq for TemperatureDelta {}
171-
impl ::std::cmp::PartialEq for TemperatureDelta {
172-
fn eq(&self, other: &Self) -> bool {
173-
self.kelvin_degrees == other.kelvin_degrees
174-
}
175-
}
176-
177-
impl ::std::cmp::PartialOrd for TemperatureDelta {
178-
fn partial_cmp(&self, other: &Self) -> Option<::std::cmp::Ordering> {
179-
self.kelvin_degrees.partial_cmp(&other.kelvin_degrees)
180-
}
181-
}
182-
183178
implement_display!(Temperature);
184-
implement_display!(TemperatureDelta);
179+
implement_measurement!(TemperatureDelta);

src/tests/length_tests.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,9 @@ fn add() {
153153
let a = Length::from_meters(2.0);
154154
let b = Length::from_meters(4.0);
155155
let c = a + b;
156+
let d = b + a;
156157
assert_almost_eq(c.as_meters(), 6.0);
158+
assert_eq!(c, d);
157159
}
158160

159161
#[test]
@@ -166,22 +168,21 @@ fn sub() {
166168

167169
#[test]
168170
fn mul() {
169-
let a = Length::from_meters(2.0);
170-
let b = Length::from_meters(4.0);
171-
let c = a * b;
172-
let d = b * 2.0;
173-
assert_almost_eq(c.as_meters(), 8.0);
174-
assert_almost_eq(d.as_meters(), 8.0);
171+
let a = Length::from_meters(3.0);
172+
let b = a * 2.0;
173+
let c = 2.0 * a;
174+
assert_almost_eq(b.as_meters(), 6.0);
175+
assert_eq!(b, c);
175176
}
176177

177178
#[test]
178179
fn div() {
179180
let a = Length::from_meters(2.0);
180181
let b = Length::from_meters(4.0);
181-
let c = a * b;
182-
let d = a * 2.0;
183-
assert_almost_eq(c.as_meters(), 8.0);
184-
assert_almost_eq(d.as_meters(), 4.0);
182+
let c = a / b;
183+
let d = a / 2.0;
184+
assert_almost_eq(c, 0.5);
185+
assert_almost_eq(d.as_meters(), 1.0);
185186
}
186187

187188
#[test]

src/tests/temperature_tests.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,19 @@ fn add() {
4040
let a = Temperature::from_kelvin(2.0);
4141
let b = TemperatureDelta::from_kelvin(4.0);
4242
let c = a + b;
43+
let d = b + a;
4344
assert_almost_eq(c.as_kelvin(), 6.0);
45+
assert_eq!(c, d);
46+
}
47+
48+
#[test]
49+
fn add2() {
50+
let a = TemperatureDelta::from_kelvin(2.0);
51+
let b = TemperatureDelta::from_kelvin(4.0);
52+
let c = a + b;
53+
let d = b + a;
54+
assert_almost_eq(c.as_kelvin(), 6.0);
55+
assert_eq!(c, d);
4456
}
4557

4658
#[test]
@@ -59,6 +71,23 @@ fn sub2() {
5971
assert_almost_eq(c.as_kelvin(), 25.0);
6072
}
6173

74+
#[test]
75+
fn sub3() {
76+
let a = TemperatureDelta::from_fahrenheit(180.0);
77+
let b = TemperatureDelta::from_celsius(75.0);
78+
let c = a - b;
79+
assert_almost_eq(c.as_kelvin(), 25.0);
80+
}
81+
82+
#[test]
83+
fn mul() {
84+
let a = TemperatureDelta::from_celsius(5.0);
85+
let b = a * 2.0;
86+
let c = 2.0 * a;
87+
assert_almost_eq(b.as_celsius(), 10.0);
88+
assert_eq!(b, c);
89+
}
90+
6291
#[test]
6392
fn eq() {
6493
let a = Temperature::from_kelvin(2.0);

src/tests/volume_tests.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ fn add() {
215215
let a = Volume::from_litres(2.0);
216216
let b = Volume::from_litres(4.0);
217217
let c = a + b;
218+
let d = b + a;
218219
assert_almost_eq(c.as_litres(), 6.0);
220+
assert_eq!(c, d);
219221
}
220222

221223
#[test]
@@ -228,12 +230,11 @@ fn sub() {
228230

229231
#[test]
230232
fn mul() {
231-
let a = Volume::from_litres(2.0);
232-
let b = Volume::from_litres(4.0);
233-
let c = a * b;
234-
let d = a * 2.0;
235-
assert_almost_eq(c.as_litres(), 8.0);
236-
assert_almost_eq(d.as_litres(), 4.0);
233+
let a = Volume::from_litres(3.0);
234+
let b = a * 2.0;
235+
let c = 2.0 * a;
236+
assert_almost_eq(b.as_litres(), 6.0);
237+
assert_eq!(b, c);
237238
}
238239

239240
#[test]

src/tests/weight_tests.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,9 @@ fn add() {
171171
let a = Weight::from_kilograms(2.0);
172172
let b = Weight::from_kilograms(4.0);
173173
let c = a + b;
174+
let d = b + a;
174175
assert_almost_eq(c.as_kilograms(), 6.0);
176+
assert_eq!(c, d);
175177
}
176178

177179
#[test]
@@ -184,12 +186,11 @@ fn sub() {
184186

185187
#[test]
186188
fn mul() {
187-
let a = Weight::from_kilograms(2.0);
188-
let b = Weight::from_kilograms(4.0);
189-
let c = a * b;
190-
let d = a * 2.0;
191-
assert_almost_eq(c.as_kilograms(), 8.0);
192-
assert_almost_eq(d.as_kilograms(), 4.0);
189+
let a = Weight::from_kilograms(3.0);
190+
let b = a * 2.0;
191+
let c = 2.0 * a;
192+
assert_almost_eq(b.as_kilograms(), 6.0);
193+
assert_eq!(b, c);
193194
}
194195

195196
#[test]

0 commit comments

Comments
 (0)