#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::{Measurement, PhysicalQuantity, UnitOfMeasure};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[repr(C)]
pub enum DensityUnit {
KilogramPerCubicMeter,
KilogramPerLiter,
}
impl UnitOfMeasure<f32> for DensityUnit {
fn quantity() -> PhysicalQuantity {
PhysicalQuantity::Density
}
fn si() -> Self {
Self::KilogramPerCubicMeter
}
fn symbol(&self) -> &'static str {
match self {
Self::KilogramPerCubicMeter => "kg/m³",
Self::KilogramPerLiter => "kg/l",
}
}
fn from_si(value: f32, to: &Self) -> f32 {
match to {
Self::KilogramPerCubicMeter => value,
Self::KilogramPerLiter => value / 1000.0,
}
}
fn to_si(&self, value: &f32) -> f32 {
match self {
Self::KilogramPerCubicMeter => *value,
Self::KilogramPerLiter => value * 1000.0,
}
}
}
pub type Density = Measurement<f32, DensityUnit>;
impl Density {
pub const fn kg_per_l(value: f32) -> Density {
Measurement {
value,
unit: DensityUnit::KilogramPerLiter,
}
}
}