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::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
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[derive(Copy, Clone, PartialEq, Debug)]
17#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
18pub enum InverseDistanceUnit {
19    _km,
20    _m,
21    _dm,
22    _cm,
23    _mm,
24    _um,
25    _nm,
26    _mi,
27    _yd,
28    _ft,
29    _inch,
30}
31
32impl PhysicsUnit for InverseDistanceUnit {
33    fn name(&self) -> &str {
34        match &self {
35            InverseDistanceUnit::_km => "1/km",
36            InverseDistanceUnit::_m => "1/m",
37            InverseDistanceUnit::_dm => "1/dm",
38            InverseDistanceUnit::_cm => "1/cm",
39            InverseDistanceUnit::_mm => "1/mm",
40            InverseDistanceUnit::_um => "1/μm",
41            InverseDistanceUnit::_nm => "1/nm",
42            InverseDistanceUnit::_mi => "1/mi",
43            InverseDistanceUnit::_yd => "1/yd",
44            InverseDistanceUnit::_ft => "1/ft",
45            InverseDistanceUnit::_inch => "1/in",
46        }
47    }
48
49    fn base_per_x(&self) -> (f64, i32) {
50        match self {
51            InverseDistanceUnit::_km => (1., -3),
52            InverseDistanceUnit::_m => (1., 0),
53            InverseDistanceUnit::_dm => (1., 1),
54            InverseDistanceUnit::_cm => (1., 2),
55            InverseDistanceUnit::_mm => (1., 3),
56            InverseDistanceUnit::_um => (1., 6),
57            InverseDistanceUnit::_nm => (1., 9),
58            InverseDistanceUnit::_mi => (0.62137, -3),
59            InverseDistanceUnit::_yd => (0.10936, 1),
60            InverseDistanceUnit::_ft => (0.32808, 1),
61            InverseDistanceUnit::_inch => (0.393700787, 2),
62        }
63    }
64}
65
66impl_quantity!(
67    InverseDistance,
68    InverseDistanceUnit,
69    InverseDistanceUnit::_mm
70);
71impl_div_with_self_to_f64!(InverseDistance);
72
73impl_mul!(InverseDistance, Distance, f64);
74impl_mul!(InverseDistance, Stress, ForcePerVolume);
75impl_mul!(InverseDistance, ForceDistance, Force);
76impl_mul!(InverseDistance, Area, Distance);
77impl_mul!(InverseDistance, Volume, Area);