use crate::impl_macros::macros::*;
use crate::quantities::*;
#[cfg_attr(feature = "strum", derive(EnumIter))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, PartialEq, Debug, Hash, Eq)]
#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int, from_py_object))]
pub enum FrequencyUnit {
Hz,
kHz,
MHz,
GHz,
rpm,
}
impl FrequencyUnit {
pub const fn base_per_x_const(self) -> (f64, i32) {
match self {
FrequencyUnit::Hz => (1., 0),
FrequencyUnit::kHz => (1., 3),
FrequencyUnit::MHz => (1., 6),
FrequencyUnit::GHz => (1., 9),
FrequencyUnit::rpm => (1. / 60., 0),
}
}
}
impl PhysicsUnit for FrequencyUnit {
fn name(&self) -> &str {
match &self {
FrequencyUnit::Hz => "Hz",
FrequencyUnit::kHz => "kHz",
FrequencyUnit::MHz => "MHz",
FrequencyUnit::GHz => "GHz",
FrequencyUnit::rpm => "rpm",
}
}
fn base_per_x(&self) -> (f64, i32) {
(*self).base_per_x_const()
}
}
impl_quantity!(Frequency, FrequencyUnit, [FrequencyUnit::Hz]);
impl_div_with_self_to_f64!(Frequency);
impl Div<Time> for f64 {
type Output = Frequency;
fn div(self, rhs: Time) -> Self::Output {
Frequency::from_raw(self / rhs.as_f64())
}
}
impl Div<Frequency> for f64 {
type Output = Time;
fn div(self, rhs: Frequency) -> Self::Output {
Time::from_raw(self / rhs.as_f64())
}
}
#[cfg(feature = "pyo3")]
#[pyo3::pymethods]
impl Time {
fn __rtruediv__(rhs: pyo3::PyRef<Self>, lhs: f64) -> pyo3::PyResult<Frequency> {
Ok(lhs / *rhs)
}
}
#[cfg(feature = "pyo3")]
#[pyo3::pymethods]
impl Frequency {
fn __rtruediv__(rhs: pyo3::PyRef<Self>, lhs: f64) -> pyo3::PyResult<Time> {
Ok(lhs / *rhs)
}
}