From 3e4fb93a594f11a80904653396698d6c70e07cb0 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Sat, 31 Oct 2020 20:44:44 +0100 Subject: Initial public release --- src/metric.rs | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/metric.rs (limited to 'src/metric.rs') diff --git a/src/metric.rs b/src/metric.rs new file mode 100644 index 0000000..209c31c --- /dev/null +++ b/src/metric.rs @@ -0,0 +1,137 @@ +pub mod area; +pub mod mass; +pub mod time; +pub mod force; +pub mod power; +pub mod energy; +pub mod length; +pub mod volume; +pub mod pressure; +pub mod velocity; +pub mod frequency; +pub mod inductance; +pub mod capacitance; +pub mod conductance; +pub mod illuminance; +pub mod plane_angle; +pub mod solid_angle; +pub mod temperature; +pub mod acceleration; +pub mod absorbed_dose; +pub mod luminous_flux; +pub mod magnetic_flux; +pub mod electric_charge; +pub mod dose_equivalent; +pub mod electric_current; +pub mod catalytic_activity; +pub mod electric_potential; +pub mod luminous_intensity; +pub mod electric_resistance; +pub mod amount_of_substance; +pub mod magnetic_flux_density; + +pub use area::*; +pub use mass::*; +pub use time::*; +pub use force::*; +pub use power::*; +pub use energy::*; +pub use length::*; +pub use volume::*; +pub use pressure::*; +pub use velocity::*; +pub use frequency::*; +pub use inductance::*; +pub use capacitance::*; +pub use illuminance::*; +pub use plane_angle::*; +pub use solid_angle::*; +pub use temperature::*; +pub use acceleration::*; +pub use luminous_flux::*; +pub use magnetic_flux::*; +pub use electric_charge::*; +pub use dose_equivalent::*; +pub use electric_current::*; +pub use catalytic_activity::*; +pub use electric_potential::*; +pub use luminous_intensity::*; +pub use electric_resistance::*; +pub use amount_of_substance::*; +pub use magnetic_flux_density::*; + +use crate::declare_unit_square; +use crate::declare_unit_multiplication; + +use std::ops::{Div, Mul}; + +/* ---------------------------------------- unit traits ---------------------------------------- */ + +pub trait Unit { + fn to_si_unit(&self) -> Physical; +} + +pub trait Primitive { + fn to_si_primitive(&self) -> f64; +} + +/* -------------------------------------- here be dragons -------------------------------------- */ +/* (unit-interoperability) */ + + +// derived units without special names +// m * m² => m³ +declare_unit_multiplication!(Length, Area, Volume); +// m * m => m² +declare_unit_square!(Length, Area); +// v = m/s * s => m +declare_unit_multiplication!(Velocity, Time, Length); +// accel * s = m/s² * s = m/s => v +declare_unit_multiplication!(Acceleration, Time, Velocity); + +// kg * m/s² => N +declare_unit_multiplication!(Mass, Acceleration, Force); +// N * m => J +declare_unit_multiplication!(Force, Length, Energy); +// katal * s = mol/s * s => mol +declare_unit_multiplication!(CatalyticActivity, Time, AmountOfSubstance); +// A * s => C +declare_unit_multiplication!(ElectricCurrent, Time, ElectricCharge); +// lux = lm/m² * m² => lm +declare_unit_multiplication!(Illuminance, Area, LuminousFlux); + +// Pa * m² = N/m² * m² => N +declare_unit_multiplication!(Pressure, Area, Force); +// W * s = J/s * s => J +declare_unit_multiplication!(Power, Time, Energy); +// Wb * s = V/s * s => V +declare_unit_multiplication!(MagneticFlux, Time, ElectricPotential); +// F * V = C/V * V => C +declare_unit_multiplication!(Capacitance, ElectricPotential, ElectricCharge); +// cd * sr => lumen +declare_unit_multiplication!(LuminousIntensity, SolidAngle, LuminousFlux); + +// gray * kg = J/kg * kg => J +// alias is DoseEquivalent, see below +// Activity is an alias to Frequency, which has both Hertz and Becquerel +// henry * A = Wb/A * A => Wb +declare_unit_multiplication!(Inductance, ElectricCurrent, MagneticFlux); +// V * A = W/A * A => W +declare_unit_multiplication!(ElectricPotential, ElectricCurrent, Power); +// Ω * A = V/A * A => V +declare_unit_multiplication!(ElectricResistance, ElectricCurrent, ElectricPotential); + +// sievert * kg = J/kg * kg => J +declare_unit_multiplication!(DoseEquivalent, Mass, Energy); +// Hertz is in its file +// tesla * m² = Wb/m² * m² => Wb +declare_unit_multiplication!(MagneticFluxDensity, Area, MagneticFlux); +// Conductance is in its file + +// extra conversions, because they work : TODO: add some more +// Hz * m = m/s => v +declare_unit_multiplication!(Frequency, Length, Velocity); +// Pa * m² = N/m² * m³ = N*m => J +declare_unit_multiplication!(Pressure, Volume, Energy); +// C * V = A*s * W/A = W/s = J/s * 1/s => J +declare_unit_multiplication!(ElectricCharge, ElectricPotential, Energy); \ No newline at end of file -- cgit v1.2.3-54-g00ecf