Skip to main content

unitforge/quantities/
inverse_distance.rs

1use crate::impl_macros::macros::*;
2use crate::prelude::*;
3use crate::quantities::*;
4use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
5use num_traits::identities::Zero;
6use num_traits::{Float, FromPrimitive};
7#[cfg(feature = "pyo3")]
8use pyo3::pyclass;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11use std::cmp::Ordering;
12use std::fmt;
13use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
14#[cfg(feature = "strum")]
15use strum_macros::EnumIter;
16
17#[cfg_attr(feature = "strum", derive(EnumIter))]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19#[derive(Copy, Clone, PartialEq, Debug)]
20#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
21pub enum InverseDistanceUnit {
22    _km,
23    _m,
24    _dm,
25    _cm,
26    _mm,
27    _um,
28    _nm,
29    _mi,
30    _yd,
31    _ft,
32    _inch,
33}
34
35impl PhysicsUnit for InverseDistanceUnit {
36    fn name(&self) -> &str {
37        match &self {
38            InverseDistanceUnit::_km => "1/km",
39            InverseDistanceUnit::_m => "1/m",
40            InverseDistanceUnit::_dm => "1/dm",
41            InverseDistanceUnit::_cm => "1/cm",
42            InverseDistanceUnit::_mm => "1/mm",
43            InverseDistanceUnit::_um => "1/μm",
44            InverseDistanceUnit::_nm => "1/nm",
45            InverseDistanceUnit::_mi => "1/mi",
46            InverseDistanceUnit::_yd => "1/yd",
47            InverseDistanceUnit::_ft => "1/ft",
48            InverseDistanceUnit::_inch => "1/in",
49        }
50    }
51
52    fn base_per_x(&self) -> (f64, i32) {
53        match self {
54            InverseDistanceUnit::_km => (1., -3),
55            InverseDistanceUnit::_m => (1., 0),
56            InverseDistanceUnit::_dm => (1., 1),
57            InverseDistanceUnit::_cm => (1., 2),
58            InverseDistanceUnit::_mm => (1., 3),
59            InverseDistanceUnit::_um => (1., 6),
60            InverseDistanceUnit::_nm => (1., 9),
61            InverseDistanceUnit::_mi => (0.62137, -3),
62            InverseDistanceUnit::_yd => (0.10936, 1),
63            InverseDistanceUnit::_ft => (0.32808, 1),
64            InverseDistanceUnit::_inch => (0.393700787, 2),
65        }
66    }
67}
68
69impl_quantity!(
70    InverseDistance,
71    InverseDistanceUnit,
72    [InverseDistanceUnit::_mm]
73);
74impl_div_with_self_to_f64!(InverseDistance);
75
76impl_mul!(InverseDistance, Distance, f64);