Skip to content

Commit 4340ccb

Browse files
author
James O'Cull
authored
Merge pull request #6 from thejpster/precision
Merging theJPster's latest changes (precision, new types, etc)
2 parents 8dbc7ad + c7d3677 commit 4340ccb

22 files changed

+1283
-130
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
target
22
Cargo.lock
33
*.bk
4-
4+
.vscode

examples/format_test.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
extern crate measurements;
2+
use measurements::Temperature;
3+
use measurements::Length;
4+
use measurements::Pressure;
5+
use measurements::Volume;
6+
use measurements::Weight;
7+
use measurements::Speed;
8+
use measurements::Acceleration;
9+
use measurements::Energy;
10+
use measurements::Power;
11+
12+
fn main() {
13+
for power in -12..12 {
14+
let val: f64 = 123.456 * (10f64.powf(power as f64));
15+
println!("10^{}...", power);
16+
println!("Temp of {0:.3} outside", Temperature::from_kelvin(val));
17+
println!("Distance of {0:.3}", Length::from_meters(val));
18+
println!("Pressure of {0:.3}", Pressure::from_millibars(val));
19+
println!("Volume of {0:.3}", Volume::from_litres(val));
20+
println!("Weight of {0:.3}", Weight::from_kilograms(val));
21+
println!("Speed of {0:.3}", Speed::from_meters_per_second(val));
22+
println!("Acceleration of {0:.3}", Acceleration::from_meters_per_second_per_second(val));
23+
println!("Energy of {0:.3}", Energy::from_joules(val));
24+
println!("Power of {0:.3}", Power::from_watts(val));
25+
}
26+
}

src/acceleration.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use super::measurement::*;
2+
use super::Speed;
3+
use std::time::Duration;
4+
5+
/// The `Acceleration` struct can be used to deal with Accelerations in a common way.
6+
/// Common metric and imperial units are supported.
7+
///
8+
/// # Example
9+
///
10+
/// ```
11+
/// use measurements::{Acceleration, Length, Speed};
12+
/// use std::time::Duration;
13+
///
14+
/// // Standing quarter mile in 10.0 dead, at 120.0 mph
15+
/// let track = Length::from_miles(0.25);
16+
/// let finish = Speed::from_miles_per_hour(120.0);
17+
/// let time = Duration::new(10, 0);
18+
/// let accel = finish / time;
19+
/// println!("You accelerated over {} at an average of {}", track, accel);
20+
/// ```
21+
#[derive(Copy, Clone, Debug)]
22+
pub struct Acceleration {
23+
meters_per_second_per_second: f64,
24+
}
25+
26+
impl Acceleration {
27+
pub fn from_meters_per_second_per_second(meters_per_second_per_second: f64) -> Acceleration {
28+
Acceleration { meters_per_second_per_second: meters_per_second_per_second }
29+
}
30+
31+
pub fn from_metres_per_second_per_second(metres_per_second_per_second: f64) -> Acceleration {
32+
Acceleration::from_meters_per_second_per_second(metres_per_second_per_second)
33+
}
34+
35+
pub fn as_meters_per_second_per_second(&self) -> f64 {
36+
self.meters_per_second_per_second
37+
}
38+
39+
pub fn as_metres_per_second_per_second(&self) -> f64 {
40+
self.as_meters_per_second_per_second()
41+
}
42+
}
43+
44+
/// Acceleration * Time = Speed
45+
impl ::std::ops::Mul<Duration> for Acceleration {
46+
type Output = Speed;
47+
48+
fn mul(self, rhs: Duration) -> Speed {
49+
// It would be useful if Duration had a method that did this...
50+
let seconds: f64 = rhs.as_secs() as f64 + ((rhs.subsec_nanos() as f64) * 1e-9);
51+
Speed::from_meters_per_second(self.as_meters_per_second_per_second() * seconds)
52+
}
53+
}
54+
55+
/// Time * Acceleration = Speed
56+
impl ::std::ops::Mul<Acceleration> for Duration {
57+
type Output = Speed;
58+
59+
fn mul(self, rhs: Acceleration) -> Speed {
60+
rhs * self
61+
}
62+
}
63+
64+
impl Measurement for Acceleration {
65+
fn get_base_units(&self) -> f64 {
66+
self.meters_per_second_per_second
67+
}
68+
69+
fn from_base_units(units: f64) -> Self {
70+
Self::from_meters_per_second_per_second(units)
71+
}
72+
73+
fn get_base_units_name(&self) -> &'static str {
74+
"m/s\u{00B2}"
75+
}
76+
}
77+
78+
implement_measurement! { Acceleration }

src/energy.rs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
use super::measurement::*;
2+
use super::Power;
3+
use std::time::Duration;
4+
5+
/// The `Energy` struct can be used to deal with energies in a common way.
6+
/// Common metric and imperial units are supported.
7+
///
8+
/// # Example
9+
///
10+
/// ```
11+
/// use measurements::Energy;
12+
///
13+
/// let energy = Energy::from_kcalories(2500.0);
14+
/// println!("Some say a health adult male should consume {} per day", energy);
15+
/// ```
16+
#[derive(Copy, Clone, Debug)]
17+
pub struct Energy {
18+
joules: f64,
19+
}
20+
21+
impl Energy {
22+
pub fn from_joules(joules: f64) -> Energy {
23+
Energy { joules: joules }
24+
}
25+
26+
pub fn from_kcalories(kcalories: f64) -> Energy {
27+
Self::from_joules(kcalories * 4186.8)
28+
}
29+
30+
pub fn from_btu(btu: f64) -> Energy {
31+
Self::from_joules(btu * 1055.056)
32+
}
33+
34+
pub fn from_e_v(e_v: f64) -> Energy {
35+
Self::from_joules(e_v / 6.241509479607718e+18)
36+
}
37+
38+
pub fn from_watt_hours(wh: f64) -> Energy {
39+
Self::from_joules(wh * 3600.0)
40+
}
41+
42+
pub fn from_kilowatt_hours(kwh: f64) -> Energy {
43+
Self::from_joules(kwh * 3600.0 * 1000.0)
44+
}
45+
46+
pub fn as_joules(&self) -> f64 {
47+
self.joules
48+
}
49+
50+
pub fn as_kcalories(&self) -> f64 {
51+
self.joules / 4186.8
52+
}
53+
54+
pub fn as_btu(&self) -> f64 {
55+
self.joules / 1055.056
56+
}
57+
58+
pub fn as_e_v(&self) -> f64 {
59+
self.joules * 6.241509479607718e+18
60+
}
61+
62+
pub fn as_watt_hours(&self) -> f64 {
63+
self.joules / 3600.0
64+
}
65+
66+
pub fn as_kilowatt_hours(&self) -> f64 {
67+
self.joules / (3600.0 * 1000.0)
68+
}
69+
}
70+
71+
/// Energy / Time = Power
72+
impl ::std::ops::Div<Duration> for Energy {
73+
type Output = Power;
74+
75+
fn div(self, rhs: Duration) -> Power {
76+
// It would be useful if Duration had a method that did this...
77+
let seconds: f64 = rhs.as_secs() as f64 + ((rhs.subsec_nanos() as f64) * 1e-9);
78+
Power::from_watts(self.as_joules() / seconds)
79+
}
80+
}
81+
82+
/// Energy / Power = Time
83+
impl ::std::ops::Div<Power> for Energy {
84+
type Output = Duration;
85+
86+
fn div(self, rhs: Power) -> Duration {
87+
let seconds = self.as_joules() / rhs.as_watts();
88+
let nanosecs = (seconds * 1e9) % 1e9;
89+
Duration::new(seconds as u64, nanosecs as u32)
90+
}
91+
}
92+
93+
impl Measurement for Energy {
94+
fn get_base_units(&self) -> f64 {
95+
self.joules
96+
}
97+
98+
fn from_base_units(units: f64) -> Self {
99+
Self::from_joules(units)
100+
}
101+
102+
fn get_base_units_name(&self) -> &'static str {
103+
"J"
104+
}
105+
106+
fn get_appropriate_units(&self) -> (&'static str, f64) {
107+
// Smallest to Largest
108+
let list = [
109+
("fJ", 1e-15),
110+
("pJ", 1e-12),
111+
("nJ", 1e-9),
112+
("\u{00B5}J", 1e-6),
113+
("mJ", 1e-3),
114+
("J", 1e0),
115+
("kJ", 1e3),
116+
("MJ", 1e6),
117+
("GJ", 1e9),
118+
("TJ", 1e12),
119+
("PJ", 1e15),
120+
("EJ", 1e18),
121+
];
122+
self.pick_appropriate_units(&list)
123+
}
124+
}
125+
126+
implement_measurement! { Energy }

0 commit comments

Comments
 (0)