use crate::Quantity;
use qtty_derive::Unit;
pub use crate::dimension::{
Capacitance, Charge, Current, Inductance, MagneticFlux, MagneticFluxDensity, Resistance,
Voltage,
};
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "A", dimension = Current, ratio = 1.0)]
pub struct Ampere;
pub type Amp = Ampere;
pub type Amperes = Quantity<Amp>;
pub const AMPERE: Amperes = Amperes::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µA", dimension = Current, ratio = 1e-6)]
pub struct Microampere;
pub type UAmps = Microampere;
pub type Microamperes = Quantity<UAmps>;
pub const MICROAMPERE: Microamperes = Microamperes::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mA", dimension = Current, ratio = 1e-3)]
pub struct Milliampere;
pub type MAmps = Milliampere;
pub type Milliamperes = Quantity<MAmps>;
pub const MILLIAMPERE: Milliamperes = Milliamperes::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "kA", dimension = Current, ratio = 1e3)]
pub struct Kiloampere;
pub type KAmps = Kiloampere;
pub type Kiloamperes = Quantity<KAmps>;
pub const KILOAMPERE: Kiloamperes = Kiloamperes::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! ampere_units {
($cb:path) => {
$cb!(Ampere, Microampere, Milliampere, Kiloampere);
};
}
ampere_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
ampere_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
ampere_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "C", dimension = Charge, ratio = 1.0)]
pub struct Coulomb;
pub type Coul = Coulomb;
pub type Coulombs = Quantity<Coul>;
pub const COULOMB: Coulombs = Coulombs::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mC", dimension = Charge, ratio = 1e-3)]
pub struct Millicoulomb;
pub type Millicoulombs = Quantity<Millicoulomb>;
pub const MILLICOULOMB: Millicoulombs = Millicoulombs::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µC", dimension = Charge, ratio = 1e-6)]
pub struct Microcoulomb;
pub type Microcoulombs = Quantity<Microcoulomb>;
pub const MICROCOULOMB: Microcoulombs = Microcoulombs::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "kC", dimension = Charge, ratio = 1e3)]
pub struct Kilocoulomb;
pub type Kilocoulombs = Quantity<Kilocoulomb>;
pub const KILOCOULOMB: Kilocoulombs = Kilocoulombs::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! coulomb_units {
($cb:path) => {
$cb!(Coulomb, Millicoulomb, Microcoulomb, Kilocoulomb);
};
}
coulomb_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
coulomb_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
coulomb_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "V", dimension = Voltage, ratio = 1.0)]
pub struct Volt;
pub type Volts = Quantity<Volt>;
pub const VOLT: Volts = Volts::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µV", dimension = Voltage, ratio = 1e-6)]
pub struct Microvolt;
pub type Microvolts = Quantity<Microvolt>;
pub const MICROVOLT: Microvolts = Microvolts::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mV", dimension = Voltage, ratio = 1e-3)]
pub struct Millivolt;
pub type Millivolts = Quantity<Millivolt>;
pub const MILLIVOLT: Millivolts = Millivolts::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "kV", dimension = Voltage, ratio = 1e3)]
pub struct Kilovolt;
pub type Kilovolts = Quantity<Kilovolt>;
pub const KILOVOLT: Kilovolts = Kilovolts::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "MV", dimension = Voltage, ratio = 1e6)]
pub struct Megavolt;
pub type Megavolts = Quantity<Megavolt>;
pub const MEGAVOLT: Megavolts = Megavolts::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! volt_units {
($cb:path) => {
$cb!(Volt, Microvolt, Millivolt, Kilovolt, Megavolt);
};
}
volt_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
volt_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
volt_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Ω", dimension = Resistance, ratio = 1.0)]
pub struct Ohm;
pub type Ohms = Quantity<Ohm>;
pub const OHM: Ohms = Ohms::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mΩ", dimension = Resistance, ratio = 1e-3)]
pub struct Milliohm;
pub type Milliohms = Quantity<Milliohm>;
pub const MILLIOHM: Milliohms = Milliohms::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "kΩ", dimension = Resistance, ratio = 1e3)]
pub struct Kilohm;
pub type Kilohms = Quantity<Kilohm>;
pub const KILOHM: Kilohms = Kilohms::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "MΩ", dimension = Resistance, ratio = 1e6)]
pub struct Megaohm;
pub type Megaohms = Quantity<Megaohm>;
pub const MEGAOHM: Megaohms = Megaohms::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! ohm_units {
($cb:path) => {
$cb!(Ohm, Milliohm, Kilohm, Megaohm);
};
}
ohm_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
ohm_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
ohm_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "F", dimension = Capacitance, ratio = 1.0)]
pub struct Farad;
pub type Farads = Quantity<Farad>;
pub const FARAD: Farads = Farads::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "pF", dimension = Capacitance, ratio = 1e-12)]
pub struct Picofarad;
pub type Picofarads = Quantity<Picofarad>;
pub const PICOFARAD: Picofarads = Picofarads::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "nF", dimension = Capacitance, ratio = 1e-9)]
pub struct Nanofarad;
pub type Nanofarads = Quantity<Nanofarad>;
pub const NANOFARAD: Nanofarads = Nanofarads::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µF", dimension = Capacitance, ratio = 1e-6)]
pub struct Microfarad;
pub type Microfarads = Quantity<Microfarad>;
pub const MICROFARAD: Microfarads = Microfarads::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mF", dimension = Capacitance, ratio = 1e-3)]
pub struct Millifarad;
pub type Millifarads = Quantity<Millifarad>;
pub const MILLIFARAD: Millifarads = Millifarads::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! farad_units {
($cb:path) => {
$cb!(Farad, Picofarad, Nanofarad, Microfarad, Millifarad);
};
}
farad_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
farad_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
farad_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "H", dimension = Inductance, ratio = 1.0)]
pub struct Henry;
pub type Henries = Quantity<Henry>;
pub const HENRY: Henries = Henries::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µH", dimension = Inductance, ratio = 1e-6)]
pub struct Microhenry;
pub type Microhenries = Quantity<Microhenry>;
pub const MICROHENRY: Microhenries = Microhenries::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mH", dimension = Inductance, ratio = 1e-3)]
pub struct Millihenry;
pub type Millihenries = Quantity<Millihenry>;
pub const MILLIHENRY: Millihenries = Millihenries::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! henry_units {
($cb:path) => {
$cb!(Henry, Microhenry, Millihenry);
};
}
henry_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
henry_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
henry_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Wb", dimension = MagneticFlux, ratio = 1.0)]
pub struct Weber;
pub type Webers = Quantity<Weber>;
pub const WEBER: Webers = Webers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mWb", dimension = MagneticFlux, ratio = 1e-3)]
pub struct Milliweber;
pub type Milliwebers = Quantity<Milliweber>;
pub const MILLIWEBER: Milliwebers = Milliwebers::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! weber_units {
($cb:path) => {
$cb!(Weber, Milliweber);
};
}
weber_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
weber_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
weber_units!(crate::assert_units_are_builtin);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "T", dimension = MagneticFluxDensity, ratio = 1.0)]
pub struct Tesla;
pub type Teslas = Quantity<Tesla>;
pub const TESLA: Teslas = Teslas::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mT", dimension = MagneticFluxDensity, ratio = 1e-3)]
pub struct Millitesla;
pub type Milliteslas = Quantity<Millitesla>;
pub const MILLITESLA: Milliteslas = Milliteslas::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "µT", dimension = MagneticFluxDensity, ratio = 1e-6)]
pub struct Microtesla;
pub type Microteslas = Quantity<Microtesla>;
pub const MICROTESLA: Microteslas = Microteslas::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! tesla_units {
($cb:path) => {
$cb!(Tesla, Millitesla, Microtesla);
};
}
tesla_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
tesla_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
tesla_units!(crate::assert_units_are_builtin);
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
use approx::assert_abs_diff_eq;
#[test]
fn milliampere_to_ampere() {
let ma = Milliamperes::new(1_000.0);
let a: Amperes = ma.to();
assert_abs_diff_eq!(a.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn microampere_to_milliampere() {
let ua = Microamperes::new(1_000.0);
let ma: Milliamperes = ua.to();
assert_abs_diff_eq!(ma.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn millicoulomb_to_coulomb() {
let mc = Millicoulombs::new(1_000.0);
let c: Coulombs = mc.to();
assert_abs_diff_eq!(c.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn millivolt_to_volt() {
let mv = Millivolts::new(1_000.0);
let v: Volts = mv.to();
assert_abs_diff_eq!(v.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn kilovolt_to_volt() {
let kv = Kilovolts::new(1.0);
let v: Volts = kv.to();
assert_abs_diff_eq!(v.value(), 1_000.0, epsilon = 1e-9);
}
#[test]
fn kilohm_to_ohm() {
let ko = Kilohms::new(1.0);
let o: Ohms = ko.to();
assert_abs_diff_eq!(o.value(), 1_000.0, epsilon = 1e-9);
}
#[test]
fn microfarad_to_farad() {
let uf = Microfarads::new(1.0);
let f: Farads = uf.to();
assert_abs_diff_eq!(f.value(), 1e-6, epsilon = 1e-18);
}
#[test]
fn millihenry_to_henry() {
let mh = Millihenries::new(1_000.0);
let h: Henries = mh.to();
assert_abs_diff_eq!(h.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn milliweber_to_weber() {
let mwb = Milliwebers::new(1_000.0);
let wb: Webers = mwb.to();
assert_abs_diff_eq!(wb.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn millitesla_to_tesla() {
let mt = Milliteslas::new(1_000.0);
let t: Teslas = mt.to();
assert_abs_diff_eq!(t.value(), 1.0, epsilon = 1e-12);
}
#[test]
fn microtesla_earth_field() {
let ut = Microteslas::new(50.0);
let t: Teslas = ut.to();
assert_abs_diff_eq!(t.value(), 50e-6, epsilon = 1e-18);
}
}