#![allow(unused_macros)]
pub use uom::si::f32::{
ElectricCharge, ElectricCurrent, ElectricPotential, Energy, Power, Ratio, ThermodynamicTemperature, Time,
};
pub use uom::si::Unit;
pub use uom::si::{
electric_charge, electric_current, electric_potential, energy, power, ratio, thermodynamic_temperature, time,
};
use num_traits::ToPrimitive;
pub(crate) trait IntoQuantity<T>
where
T: ToPrimitive,
{
type Quantity;
fn from_primitive(value: T) -> Self::Quantity;
}
macro_rules! impl_into_quantity {
($unit:path, $quantity:ty) => {
impl<T> IntoQuantity<T> for $unit
where
T: ToPrimitive,
{
type Quantity = $quantity;
fn from_primitive(value: T) -> Self::Quantity {
match &value.to_f32() {
Some(value) => Self::Quantity::new::<$unit>(*value),
None => unreachable!(),
}
}
}
};
}
impl_into_quantity!(electric_charge::milliampere_hour, ElectricCharge);
impl_into_quantity!(electric_charge::microampere_hour, ElectricCharge);
impl_into_quantity!(energy::milliwatt_hour, Energy);
impl_into_quantity!(energy::microwatt_hour, Energy);
impl_into_quantity!(electric_current::milliampere, ElectricCurrent);
impl_into_quantity!(electric_current::microampere, ElectricCurrent);
impl_into_quantity!(power::watt, Power);
impl_into_quantity!(power::milliwatt, Power);
impl_into_quantity!(power::microwatt, Power);
impl_into_quantity!(electric_potential::volt, ElectricPotential);
impl_into_quantity!(electric_potential::millivolt, ElectricPotential);
impl_into_quantity!(electric_potential::microvolt, ElectricPotential);
impl_into_quantity!(thermodynamic_temperature::degree_celsius, ThermodynamicTemperature);
impl_into_quantity!(thermodynamic_temperature::decikelvin, ThermodynamicTemperature);
impl_into_quantity!(ratio::percent, Ratio);
impl_into_quantity!(time::second, Time);
impl_into_quantity!(time::minute, Time);
macro_rules! milliampere_hour {
($value:expr) => {
unit!($crate::units::electric_charge::milliampere_hour, $value)
};
}
macro_rules! microampere_hour {
($value:expr) => {
unit!($crate::units::electric_charge::microampere_hour, $value)
};
}
macro_rules! milliwatt_hour {
($value:expr) => {
unit!($crate::units::energy::milliwatt_hour, $value)
};
}
macro_rules! microwatt_hour {
($value:expr) => {
unit!($crate::units::energy::microwatt_hour, $value)
};
}
macro_rules! milliampere {
($value:expr) => {
unit!($crate::units::electric_current::milliampere, $value)
};
}
macro_rules! microampere {
($value:expr) => {
unit!($crate::units::electric_current::microampere, $value)
};
}
macro_rules! watt {
($value:expr) => {
unit!($crate::units::power::watt, $value)
};
}
macro_rules! milliwatt {
($value:expr) => {
unit!($crate::units::power::milliwatt, $value)
};
}
macro_rules! microwatt {
($value:expr) => {
unit!($crate::units::power::microwatt, $value)
};
}
macro_rules! millivolt {
($value:expr) => {
unit!($crate::units::electric_potential::millivolt, $value)
};
}
macro_rules! microvolt {
($value:expr) => {
unit!($crate::units::electric_potential::microvolt, $value)
};
}
macro_rules! volt {
($value:expr) => {
unit!($crate::units::electric_potential::volt, $value)
};
}
macro_rules! percent {
($value:expr) => {
unit!($crate::units::ratio::percent, $value)
};
}
macro_rules! celsius {
($value:expr) => {
unit!($crate::units::thermodynamic_temperature::degree_celsius, $value)
};
}
macro_rules! decikelvin {
($value:expr) => {
unit!($crate::units::thermodynamic_temperature::decikelvin, $value)
};
}
macro_rules! second {
($value:expr) => {
unit!($crate::units::time::second, $value)
};
}
macro_rules! minute {
($value:expr) => {
unit!($crate::units::time::minute, $value)
};
}
macro_rules! unit {
($unit:ty, $value:expr) => {
<$unit as $crate::units::IntoQuantity<_>>::from_primitive($value)
};
}
pub(crate) trait Bound: Sized {
fn into_bounded(self) -> Self;
}
impl Bound for Ratio {
#[inline]
fn into_bounded(mut self) -> Self {
if self.value < 0.0 {
self.value = 0.0;
}
if self.value > 1.0 {
self.value = 1.0;
}
self
}
}