summaryrefslogtreecommitdiffstats
path: root/src/metric.rs
blob: 209c31c3dcf2087b1f781977c1cf47c1a64f1d24 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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<Physical> {
    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);