use crate::quantity::{KILO, Quantity, Value}; use generate_quantity::quantity_type; const PASCALS_PER_TORR: f64 = 101325.0 / 760.0; const KILO_PASCALS_PER_PSI: f64 = 6.894757293168364; //----- Pascals ---------------------------------- quantity_type! {Pascals, "Pa"} impl Pascals { #[inline] pub fn to_kilo_pascals(self) -> KiloPascals { let divisor = V::from_u16(KILO).unwrap(); KiloPascals(self.0 / divisor) } // Should this be in separate imple with `V` bound to `num_traits::Float`? #[inline] pub fn to_torr(self) -> Torr { let divisor = V::from_f64(PASCALS_PER_TORR).unwrap(); Torr(self.0 / divisor) } } //----- Kilopascals ---------------------------------- quantity_type! {KiloPascals, "kPa"} impl KiloPascals { #[inline] pub fn to_pascals(self) -> Pascals { let multiplier = V::from_u16(KILO).unwrap(); Pascals(self.0 * multiplier) } #[inline] pub fn to_psi(self) -> Psi { let divisor = V::from_f64(KILO_PASCALS_PER_PSI).unwrap(); Psi(self.0 / divisor) } } //----- Torr ---------------------------------- quantity_type! {Torr, "Torr"} // Should this bound `V` to `num_traits::Float`? impl Torr { #[inline] pub fn to_pascals(self) -> Pascals { let multiplier = V::from_f64(PASCALS_PER_TORR).unwrap(); Pascals(self.0 * multiplier) } } //----- PSI ---------------------------------- quantity_type! {Psi, "PSI"} impl Psi { #[inline] pub fn to_kilo_pascals(self) -> KiloPascals { let multiplier = V::from_f64(KILO_PASCALS_PER_PSI).unwrap(); KiloPascals(self.0 * multiplier) } } // --------------------------------------------------------------------------------------------------------------------- // ----- Tests ------------------------ // --------------------------------------------------------------------------------------------------------------------- #[cfg(test)] mod tests { use super::*; use float_cmp::assert_approx_eq; #[test] fn pascals_kilo_pascals() { let pascals: Pascals = 1_000.pascals(); let kilo_pascals: KiloPascals = 1.kilo_pascals(); assert_eq!(pascals.0, kilo_pascals.to_pascals().0); assert_eq!(kilo_pascals.0, pascals.to_kilo_pascals().0); } #[test] fn torr_pascals() { let torr: Torr = 7.5.torr(); let pascals: Pascals = 999.9177631578947.pascals(); assert_approx_eq!(f32, pascals.to_torr().0, torr.0); assert_approx_eq!(f32, torr.to_pascals().0, pascals.0); } #[test] fn psi_kilo_pascals() { let psi: Psi = 2.5.psi(); let kilo_pascals: KiloPascals = 17.23689323292091.kilo_pascals(); assert_approx_eq!(f32, psi.to_kilo_pascals().0, kilo_pascals.0); assert_approx_eq!(f32, kilo_pascals.to_psi().0, psi.0); } }