Skip to content

Commit ec43f3a

Browse files
author
Jonathan Pallant
committed
Adds Speed.
1 parent dec1021 commit ec43f3a

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

examples/format_test.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use measurements::Length;
44
use measurements::Pressure;
55
use measurements::Volume;
66
use measurements::Weight;
7+
use measurements::Speed;
78
fn main() {
89
for power in -9..9 {
910
let val: f64 = 123.456 * (10.0f64.powf(power as f64));
@@ -13,5 +14,6 @@ fn main() {
1314
println!("Pressure of {0:.3}", Pressure::from_millibars(val));
1415
println!("Volume of {0:.3}", Volume::from_litres(val));
1516
println!("Weight of {0:.3}", Weight::from_kilograms(val));
17+
println!("Speed of {0:.3}", Speed::from_meters_per_second(val));
1618
}
1719
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ pub use volume::Volume;
1717
pub mod pressure;
1818
pub use pressure::Pressure;
1919

20+
pub mod speed;
21+
pub use speed::Speed;
22+
2023
// Include when running tests, but don't export them
2124
#[cfg(test)]
2225
#[allow(dead_code)]

src/speed.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use super::measurement::*;
2+
3+
/// The `Speed` struct can be used to deal with speeds in a common way.
4+
/// Common metric and imperial units are supported.
5+
///
6+
/// # Example
7+
///
8+
/// ```
9+
/// use measurements::Speed;
10+
///
11+
/// let light = Speed::from_meters_per_second(300_000_000.0);
12+
/// let mph = light.as_miles_per_hour();
13+
/// println!("The speed of light is {} mph.", mph);
14+
/// ```
15+
#[derive(Copy, Clone, Debug)]
16+
pub struct Speed {
17+
meters_per_second: f64,
18+
}
19+
20+
impl Speed {
21+
pub fn from_meters_per_second(meters_per_second: f64) -> Speed {
22+
Speed { meters_per_second: meters_per_second }
23+
}
24+
25+
pub fn from_metres_per_second(metres_per_second: f64) -> Speed {
26+
Speed::from_meters_per_second(metres_per_second)
27+
}
28+
29+
pub fn from_kilometers_per_hour(kilometers_per_hour: f64) -> Speed {
30+
Speed::from_meters_per_second((kilometers_per_hour * 1000.0) / 3600.0)
31+
}
32+
33+
pub fn from_kilometres_per_hour(kilometres_per_hour: f64) -> Speed {
34+
Speed::from_kilometers_per_hour(kilometres_per_hour)
35+
}
36+
37+
pub fn from_miles_per_hour(miles_per_hour: f64) -> Speed {
38+
Speed::from_meters_per_second((miles_per_hour * 1609.0) / 3600.0)
39+
}
40+
41+
pub fn as_meters_per_second(&self) -> f64 {
42+
self.meters_per_second
43+
}
44+
45+
pub fn as_metres_per_second(&self) -> f64 {
46+
self.as_meters_per_second()
47+
}
48+
49+
pub fn as_kilometers_per_hour(&self) -> f64 {
50+
(self.meters_per_second / 1000.0) * 3600.0
51+
}
52+
53+
pub fn as_kilometres_per_hour(&self) -> f64 {
54+
self.as_kilometers_per_hour()
55+
}
56+
57+
58+
pub fn as_miles_per_hour(&self) -> f64 {
59+
(self.meters_per_second / 1609.0) * 3600.0
60+
}
61+
}
62+
63+
impl Measurement for Speed {
64+
fn get_base_units(&self) -> f64 {
65+
self.meters_per_second
66+
}
67+
68+
fn from_base_units(units: f64) -> Self {
69+
Self::from_meters_per_second(units)
70+
}
71+
72+
fn get_base_units_name(&self) -> &'static str {
73+
"m/s"
74+
}
75+
}
76+
77+
implement_measurement! { Speed }

src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod length_tests;
22
mod temperature_tests;
33
mod weight_tests;
44
mod volume_tests;
5+
mod speed_tests;
56

67
const DEFAULT_DELTA: f64 = 0.00001;
78

src/tests/speed_tests.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
use speed::*;
2+
use super::assert_almost_eq;
3+
4+
// Metric
5+
#[test]
6+
fn kilometers_per_hour() {
7+
let i1 = Speed::from_meters_per_second(100.0);
8+
let r1 = i1.as_kilometers_per_hour();
9+
10+
let i2 = Speed::from_kilometers_per_hour(100.0);
11+
let r2 = i2.as_meters_per_second();
12+
13+
assert_almost_eq(r1, 360.0);
14+
assert_almost_eq(r2, 27.7777777777);
15+
}
16+
17+
fn kilometres_per_hour() {
18+
let i1 = Speed::from_metres_per_second(100.0);
19+
let r1 = i1.as_kilometres_per_hour();
20+
21+
let i2 = Speed::from_kilometres_per_hour(100.0);
22+
let r2 = i2.as_metres_per_second();
23+
24+
assert_almost_eq(r1, 360.0);
25+
assert_almost_eq(r2, 27.7777777777);
26+
}
27+
28+
// Imperial
29+
#[test]
30+
fn miles_per_hour() {
31+
let i1 = Speed::from_meters_per_second(100.0);
32+
let r1 = i1.as_miles_per_hour();
33+
34+
let i2 = Speed::from_miles_per_hour(100.0);
35+
let r2 = i2.as_meters_per_second();
36+
37+
assert_almost_eq(r1, 223.7414543194530764449968924798);
38+
assert_almost_eq(r2, 44.694444444444444444444444444444);
39+
}
40+
41+
// Traits
42+
#[test]
43+
fn add() {
44+
let a = Speed::from_meters_per_second(2.0);
45+
let b = Speed::from_meters_per_second(4.0);
46+
let c = a + b;
47+
let d = b + a;
48+
assert_almost_eq(c.as_meters_per_second(), 6.0);
49+
assert_eq!(c, d);
50+
}
51+
52+
#[test]
53+
fn sub() {
54+
let a = Speed::from_meters_per_second(2.0);
55+
let b = Speed::from_meters_per_second(4.0);
56+
let c = a - b;
57+
assert_almost_eq(c.as_meters_per_second(), -2.0);
58+
}
59+
60+
#[test]
61+
fn mul() {
62+
let a = Speed::from_meters_per_second(3.0);
63+
let b = a * 2.0;
64+
let c = 2.0 * a;
65+
assert_almost_eq(b.as_meters_per_second(), 6.0);
66+
assert_eq!(b, c);
67+
}
68+
69+
#[test]
70+
fn div() {
71+
let a = Speed::from_meters_per_second(2.0);
72+
let b = Speed::from_meters_per_second(4.0);
73+
let c = a / b;
74+
let d = a / 2.0;
75+
assert_almost_eq(c, 0.5);
76+
assert_almost_eq(d.as_meters_per_second(), 1.0);
77+
}
78+
79+
#[test]
80+
fn eq() {
81+
let a = Speed::from_meters_per_second(2.0);
82+
let b = Speed::from_meters_per_second(2.0);
83+
assert_eq!(a == b, true);
84+
}
85+
86+
#[test]
87+
fn neq() {
88+
let a = Speed::from_meters_per_second(2.0);
89+
let b = Speed::from_meters_per_second(4.0);
90+
assert_eq!(a == b, false);
91+
}
92+
93+
#[test]
94+
fn cmp() {
95+
let a = Speed::from_meters_per_second(2.0);
96+
let b = Speed::from_meters_per_second(4.0);
97+
assert_eq!(a < b, true);
98+
assert_eq!(a <= b, true);
99+
assert_eq!(a > b, false);
100+
assert_eq!(a >= b, false);
101+
}

0 commit comments

Comments
 (0)