Skip to main content

unitforge/quantities/
mass.rs

1use crate::impl_macros::macros::*;
2
3#[cfg_attr(feature = "strum", derive(EnumIter))]
4#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[derive(Copy, Clone, PartialEq, Debug, Hash, Eq)]
6#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int, from_py_object))]
7pub enum MassUnit {
8    mg,
9    g,
10    kg,
11    t,
12    Mg,
13    kt,
14    Gg,
15    oz,  // Ounce
16    lb,  // Pound
17    st,  // Stone
18    cwt, // Hundredweight (US)
19    planck,
20    u,
21    keV_c2,
22    eV_c2,
23    MeV_c2,
24    GeV_c2,
25    TeV_c2,
26    solar_mass,
27    earth_mass,
28    lunar_mass,
29    jupiter_mass,
30}
31
32impl MassUnit {
33    pub const fn base_per_x_const(self) -> (f64, i32) {
34        match self {
35            MassUnit::mg => (1., -6),
36            MassUnit::g => (1., -3),
37            MassUnit::kg => (1., 0),
38            MassUnit::t => (1., 3),
39            MassUnit::kt => (1., 6),
40            MassUnit::Mg => (1., 3),
41            MassUnit::Gg => (1., 6),
42            MassUnit::oz => (2.83495, -2),
43            MassUnit::lb => (4.5359, -1),
44            MassUnit::st => (6.35029, 0),
45            MassUnit::cwt => (5.08023, 1),
46            MassUnit::planck => (2.17643424, -8),
47            MassUnit::u => (1.6605390689252, -27),
48            MassUnit::eV_c2 => (1.7826619216278975, -36),
49            MassUnit::keV_c2 => (1.7826619216278975, -33),
50            MassUnit::MeV_c2 => (1.7826619216278975, -30),
51            MassUnit::GeV_c2 => (1.7826619216278976, -27),
52            MassUnit::TeV_c2 => (1.7826619216278976, -24),
53            MassUnit::solar_mass => (1.98892, 30),
54            MassUnit::earth_mass => (5.9736, 24),
55            MassUnit::lunar_mass => (7.348, 22),
56            MassUnit::jupiter_mass => (1.89881, 27),
57        }
58    }
59}
60
61impl PhysicsUnit for MassUnit {
62    fn name(&self) -> &str {
63        match &self {
64            MassUnit::mg => "mg",
65            MassUnit::g => "g",
66            MassUnit::kg => "kg",
67            MassUnit::t => "t",
68            MassUnit::kt => "kt",
69            MassUnit::Mg => "Mg",
70            MassUnit::Gg => "Gg",
71            MassUnit::oz => "oz",
72            MassUnit::lb => "lb",
73            MassUnit::st => "st",
74            MassUnit::cwt => "cwt",
75            MassUnit::planck => "Planck Mass",
76            MassUnit::u => "Atomic mass unit",
77            MassUnit::eV_c2 => "eV/c²",
78            MassUnit::keV_c2 => "keV/c²",
79            MassUnit::MeV_c2 => "MeV/c²",
80            MassUnit::GeV_c2 => "MeV/c²",
81            MassUnit::TeV_c2 => "TeV/c²",
82            MassUnit::solar_mass => "M☉",
83            MassUnit::earth_mass => "M⊕",
84            MassUnit::lunar_mass => "M☽",
85            MassUnit::jupiter_mass => "M♃",
86        }
87    }
88
89    fn base_per_x(&self) -> (f64, i32) {
90        (*self).base_per_x_const()
91    }
92}
93
94impl_const!(Mass, electron, "electron", 9.1093837139, -31);
95impl_const!(Mass, proton, "proton", 1.67262192595, -27);
96impl_const!(Mass, neutron, "neutron", 1.67492750056, -27);
97
98impl_quantity!(Mass, MassUnit, [MassUnit::kg]);
99impl_div_with_self_to_f64!(Mass);