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, lb, st, cwt, 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);