use crate::dimension::{DimDiv, DimMul, Dimension};
use crate::quantity::Quantity;
use crate::scalar::Scalar;
use crate::unit::{Per, Prod, Unit};
pub trait UnitDiv<Rhs: Unit>: Unit {
type Output;
}
pub trait UnitMul<Rhs: Unit>: Unit {
type Output: Unit;
}
pub trait UnitSqrt: Unit {
type Root: Unit;
}
impl<U: Unit> UnitSqrt for Prod<U, U>
where
U::Dim: DimMul<U::Dim>,
<U::Dim as DimMul<U::Dim>>::Output: Dimension,
{
type Root = U;
}
pub(crate) trait BuiltinUnit: Unit {}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct SameDivOutput;
pub trait QuantityDivOutput<S: Scalar> {
type Output;
fn wrap(v: S) -> Self::Output;
}
impl<S: Scalar> QuantityDivOutput<S> for SameDivOutput {
type Output = S;
#[inline]
fn wrap(v: S) -> S {
v
}
}
impl<U: Unit, S: Scalar> QuantityDivOutput<S> for U {
type Output = Quantity<U, S>;
#[inline]
fn wrap(v: S) -> Quantity<U, S> {
Quantity::new(v)
}
}
impl<U: Unit> UnitDiv<U> for U
where
U::Dim: DimDiv<U::Dim>,
<U::Dim as DimDiv<U::Dim>>::Output: Dimension,
{
type Output = SameDivOutput;
}
impl<N: Unit, D: Unit> UnitDiv<Per<N, D>> for N
where
N::Dim: DimDiv<D::Dim>,
<N::Dim as DimDiv<D::Dim>>::Output: Dimension,
N::Dim: DimDiv<<N::Dim as DimDiv<D::Dim>>::Output>,
<N::Dim as DimDiv<<N::Dim as DimDiv<D::Dim>>::Output>>::Output: Dimension,
{
type Output = D;
}
impl<N: Unit, D: Unit> UnitMul<D> for Per<N, D>
where
N::Dim: DimDiv<D::Dim>,
<N::Dim as DimDiv<D::Dim>>::Output: Dimension,
<N::Dim as DimDiv<D::Dim>>::Output: DimMul<D::Dim>,
<<N::Dim as DimDiv<D::Dim>>::Output as DimMul<D::Dim>>::Output: Dimension,
{
type Output = N;
}
impl<N: Unit, D: Unit> UnitMul<Per<N, D>> for D
where
N::Dim: DimDiv<D::Dim>,
<N::Dim as DimDiv<D::Dim>>::Output: Dimension,
D::Dim: DimMul<<N::Dim as DimDiv<D::Dim>>::Output>,
<D::Dim as DimMul<<N::Dim as DimDiv<D::Dim>>::Output>>::Output: Dimension,
{
type Output = N;
}
impl<A: BuiltinUnit, B: BuiltinUnit> UnitMul<B> for A
where
A::Dim: DimMul<B::Dim>,
<A::Dim as DimMul<B::Dim>>::Output: Dimension,
{
type Output = Prod<A, B>;
}
#[macro_export]
macro_rules! impl_unit_division_pairs {
($unit:ty) => {};
($first:ty, $($rest:ty),+ $(,)?) => {
$(
impl $crate::unit_arithmetic::UnitDiv<$rest> for $first
where
<$first as $crate::Unit>::Dim: $crate::DimDiv<<$rest as $crate::Unit>::Dim>,
<<$first as $crate::Unit>::Dim as $crate::DimDiv<<$rest as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$first, $rest>;
}
impl $crate::unit_arithmetic::UnitDiv<$first> for $rest
where
<$rest as $crate::Unit>::Dim: $crate::DimDiv<<$first as $crate::Unit>::Dim>,
<<$rest as $crate::Unit>::Dim as $crate::DimDiv<<$first as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$rest, $first>;
}
)+
$crate::impl_unit_division_pairs!($($rest),+);
};
}
#[macro_export]
macro_rules! impl_unit_division_pairs_between {
($($base:ty),+; $($extra:ty),+ $(,)?) => {
$crate::__impl_div_pairs_each_extra_to_bases!({$($base),+} $($extra),+);
$crate::impl_unit_division_pairs!($($extra),+);
};
}
#[macro_export]
macro_rules! impl_unit_multiplication_pairs {
($unit:ty) => {
impl $crate::unit_arithmetic::UnitMul<$unit> for $unit
where
<$unit as $crate::Unit>::Dim: $crate::DimMul<<$unit as $crate::Unit>::Dim>,
<<$unit as $crate::Unit>::Dim as $crate::DimMul<<$unit as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$unit, $unit>;
}
};
($first:ty, $($rest:ty),+ $(,)?) => {
impl $crate::unit_arithmetic::UnitMul<$first> for $first
where
<$first as $crate::Unit>::Dim: $crate::DimMul<<$first as $crate::Unit>::Dim>,
<<$first as $crate::Unit>::Dim as $crate::DimMul<<$first as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$first, $first>;
}
$(
impl $crate::unit_arithmetic::UnitMul<$rest> for $first
where
<$first as $crate::Unit>::Dim: $crate::DimMul<<$rest as $crate::Unit>::Dim>,
<<$first as $crate::Unit>::Dim as $crate::DimMul<<$rest as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$first, $rest>;
}
impl $crate::unit_arithmetic::UnitMul<$first> for $rest
where
<$rest as $crate::Unit>::Dim: $crate::DimMul<<$first as $crate::Unit>::Dim>,
<<$rest as $crate::Unit>::Dim as $crate::DimMul<<$first as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$rest, $first>;
}
)+
$crate::impl_unit_multiplication_pairs!($($rest),+);
};
}
#[macro_export]
macro_rules! impl_unit_multiplication_pairs_between {
($($base:ty),+; $($extra:ty),+ $(,)?) => {
$crate::__impl_mul_pairs_each_extra_to_bases!({$($base),+} $($extra),+);
$crate::impl_unit_multiplication_pairs!($($extra),+);
};
}
#[macro_export]
macro_rules! impl_unit_arithmetic_pairs {
($($unit:ty),+ $(,)?) => {
$crate::impl_unit_division_pairs!($($unit),+);
$crate::impl_unit_multiplication_pairs!($($unit),+);
};
}
#[macro_export]
macro_rules! impl_unit_arithmetic_pairs_between {
($($base:ty),+; $($extra:ty),+ $(,)?) => {
$crate::impl_unit_division_pairs_between!($($base),+; $($extra),+);
$crate::impl_unit_multiplication_pairs_between!($($base),+; $($extra),+);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __impl_div_pairs_each_extra_to_bases {
({$($base:ty),+} $extra:ty) => {
$(
impl $crate::unit_arithmetic::UnitDiv<$extra> for $base
where
<$base as $crate::Unit>::Dim: $crate::DimDiv<<$extra as $crate::Unit>::Dim>,
<<$base as $crate::Unit>::Dim as $crate::DimDiv<<$extra as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$base, $extra>;
}
impl $crate::unit_arithmetic::UnitDiv<$base> for $extra
where
<$extra as $crate::Unit>::Dim: $crate::DimDiv<<$base as $crate::Unit>::Dim>,
<<$extra as $crate::Unit>::Dim as $crate::DimDiv<<$base as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$extra, $base>;
}
)+
};
({$($base:ty),+} $first:ty, $($rest:ty),+) => {
$(
impl $crate::unit_arithmetic::UnitDiv<$first> for $base
where
<$base as $crate::Unit>::Dim: $crate::DimDiv<<$first as $crate::Unit>::Dim>,
<<$base as $crate::Unit>::Dim as $crate::DimDiv<<$first as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$base, $first>;
}
impl $crate::unit_arithmetic::UnitDiv<$base> for $first
where
<$first as $crate::Unit>::Dim: $crate::DimDiv<<$base as $crate::Unit>::Dim>,
<<$first as $crate::Unit>::Dim as $crate::DimDiv<<$base as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Per<$first, $base>;
}
)+
$crate::__impl_div_pairs_each_extra_to_bases!({$($base),+} $($rest),+);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __impl_mul_pairs_each_extra_to_bases {
({$($base:ty),+} $extra:ty) => {
$(
impl $crate::unit_arithmetic::UnitMul<$extra> for $base
where
<$base as $crate::Unit>::Dim: $crate::DimMul<<$extra as $crate::Unit>::Dim>,
<<$base as $crate::Unit>::Dim as $crate::DimMul<<$extra as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$base, $extra>;
}
impl $crate::unit_arithmetic::UnitMul<$base> for $extra
where
<$extra as $crate::Unit>::Dim: $crate::DimMul<<$base as $crate::Unit>::Dim>,
<<$extra as $crate::Unit>::Dim as $crate::DimMul<<$base as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$extra, $base>;
}
)+
};
({$($base:ty),+} $first:ty, $($rest:ty),+) => {
$(
impl $crate::unit_arithmetic::UnitMul<$first> for $base
where
<$base as $crate::Unit>::Dim: $crate::DimMul<<$first as $crate::Unit>::Dim>,
<<$base as $crate::Unit>::Dim as $crate::DimMul<<$first as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$base, $first>;
}
impl $crate::unit_arithmetic::UnitMul<$base> for $first
where
<$first as $crate::Unit>::Dim: $crate::DimMul<<$base as $crate::Unit>::Dim>,
<<$first as $crate::Unit>::Dim as $crate::DimMul<<$base as $crate::Unit>::Dim>>::Output: $crate::Dimension,
{
type Output = $crate::Prod<$first, $base>;
}
)+
$crate::__impl_mul_pairs_each_extra_to_bases!({$($base),+} $($rest),+);
};
}
macro_rules! register_builtin_units {
($($unit:ty),+ $(,)?) => {
$(
impl BuiltinUnit for $unit {}
)+
impl_unit_division_pairs!($($unit),+);
};
}
#[cfg(any(
feature = "astro",
feature = "julian-time",
feature = "customary",
feature = "navigation",
feature = "fundamental-physics",
feature = "land-area",
))]
macro_rules! register_builtin_units_extend {
($($base:ty),+; $($extra:ty),+) => {
$(impl BuiltinUnit for $extra {})+
$crate::impl_unit_division_pairs_between!($($base),+; $($extra),+);
};
}
macro_rules! with_base_units {
($callback:ident) => {
$callback!(
crate::units::length::Meter,
crate::units::length::Kilometer,
crate::units::length::Centimeter,
crate::units::length::Millimeter,
crate::units::length::Micrometer,
crate::units::length::Nanometer,
crate::units::length::Picometer,
crate::units::length::Femtometer,
crate::units::length::Attometer,
crate::units::length::Zeptometer,
crate::units::length::Yoctometer,
crate::units::length::Megameter,
crate::units::length::Decimeter,
crate::units::length::Decameter,
crate::units::length::Hectometer,
crate::units::length::Gigameter,
crate::units::length::Terameter,
crate::units::length::Petameter,
crate::units::length::Exameter,
crate::units::length::Zettameter,
crate::units::length::Yottameter,
crate::units::time::Attosecond,
crate::units::time::Femtosecond,
crate::units::time::Picosecond,
crate::units::time::Nanosecond,
crate::units::time::Microsecond,
crate::units::time::Millisecond,
crate::units::time::Centisecond,
crate::units::time::Decisecond,
crate::units::time::Second,
crate::units::time::Decasecond,
crate::units::time::Hectosecond,
crate::units::time::Kilosecond,
crate::units::time::Megasecond,
crate::units::time::Gigasecond,
crate::units::time::Terasecond,
crate::units::time::Minute,
crate::units::time::Hour,
crate::units::time::Day,
crate::units::time::Week,
crate::units::time::Fortnight,
crate::units::time::Year,
crate::units::time::Decade,
crate::units::time::Century,
crate::units::time::Millennium,
crate::units::mass::Gram,
crate::units::mass::Yoctogram,
crate::units::mass::Zeptogram,
crate::units::mass::Attogram,
crate::units::mass::Femtogram,
crate::units::mass::Picogram,
crate::units::mass::Nanogram,
crate::units::mass::Microgram,
crate::units::mass::Milligram,
crate::units::mass::Centigram,
crate::units::mass::Decigram,
crate::units::mass::Decagram,
crate::units::mass::Hectogram,
crate::units::mass::Kilogram,
crate::units::mass::Megagram,
crate::units::mass::Gigagram,
crate::units::mass::Teragram,
crate::units::mass::Petagram,
crate::units::mass::Exagram,
crate::units::mass::Zettagram,
crate::units::mass::Yottagram,
crate::units::mass::Tonne,
crate::units::angular::Degree,
crate::units::angular::Radian,
crate::units::angular::Milliradian,
crate::units::angular::Turn,
crate::units::power::Watt,
crate::units::power::Yoctowatt,
crate::units::power::Zeptowatt,
crate::units::power::Attowatt,
crate::units::power::Femtowatt,
crate::units::power::Picowatt,
crate::units::power::Nanowatt,
crate::units::power::Microwatt,
crate::units::power::Milliwatt,
crate::units::power::Deciwatt,
crate::units::power::Decawatt,
crate::units::power::Hectowatt,
crate::units::power::Kilowatt,
crate::units::power::Megawatt,
crate::units::power::Gigawatt,
crate::units::power::Terawatt,
crate::units::power::Petawatt,
crate::units::power::Exawatt,
crate::units::power::Zettawatt,
crate::units::power::Yottawatt,
crate::units::area::SquareMeter,
crate::units::area::SquareKilometer,
crate::units::area::SquareCentimeter,
crate::units::area::SquareMillimeter,
crate::units::volume::CubicMeter,
crate::units::volume::CubicKilometer,
crate::units::volume::CubicCentimeter,
crate::units::volume::CubicMillimeter,
crate::units::volume::Liter,
crate::units::volume::Milliliter,
crate::units::volume::Microliter,
crate::units::volume::Centiliter,
crate::units::volume::Deciliter,
crate::units::acceleration::MeterPerSecondSquared,
crate::units::acceleration::StandardGravity,
crate::units::force::Newton,
crate::units::force::Micronewton,
crate::units::force::Millinewton,
crate::units::force::Kilonewton,
crate::units::force::Meganewton,
crate::units::force::Giganewton,
crate::units::energy::Joule,
crate::units::energy::Picojoule,
crate::units::energy::Nanojoule,
crate::units::energy::Microjoule,
crate::units::energy::Millijoule,
crate::units::energy::Kilojoule,
crate::units::energy::Megajoule,
crate::units::energy::Gigajoule,
crate::units::energy::Terajoule,
crate::units::energy::WattHour,
crate::units::energy::KilowattHour,
crate::units::pressure::Pascal,
crate::units::pressure::Millipascal,
crate::units::pressure::Hectopascal,
crate::units::pressure::Kilopascal,
crate::units::pressure::Megapascal,
crate::units::pressure::Gigapascal,
crate::units::pressure::Bar,
crate::units::temperature::Kelvin,
crate::units::temperature::Rankine,
crate::units::solid_angle::SquareDegree,
crate::units::solid_angle::Steradian,
crate::units::solid_angle::SquareMilliradian
);
};
}
with_base_units!(register_builtin_units);
#[cfg(feature = "astro")]
macro_rules! extend_with_astro {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::length::AstronomicalUnit,
crate::units::length::LightYear,
crate::units::length::Parsec,
crate::units::length::Kiloparsec,
crate::units::length::Megaparsec,
crate::units::length::Gigaparsec,
crate::units::length::nominal::SolarRadius,
crate::units::length::nominal::SolarDiameter,
crate::units::length::nominal::EarthRadius,
crate::units::length::nominal::EarthEquatorialRadius,
crate::units::length::nominal::EarthPolarRadius,
crate::units::length::nominal::JupiterRadius,
crate::units::length::nominal::LunarRadius,
crate::units::length::nominal::LunarDistance,
crate::units::time::SiderealDay,
crate::units::time::SynodicMonth,
crate::units::time::SiderealYear,
crate::units::mass::SolarMass,
crate::units::angular::Arcminute,
crate::units::angular::Arcsecond,
crate::units::angular::MilliArcsecond,
crate::units::angular::MicroArcsecond,
crate::units::angular::HourAngle,
crate::units::power::SolarLuminosity,
crate::units::solid_angle::SquareArcminute,
crate::units::solid_angle::SquareArcsecond
);
};
}
#[cfg(feature = "astro")]
with_base_units!(extend_with_astro);
#[cfg(feature = "julian-time")]
macro_rules! extend_with_julian_time {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);
};
}
#[cfg(feature = "julian-time")]
with_base_units!(extend_with_julian_time);
#[cfg(feature = "customary")]
macro_rules! extend_with_customary {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::length::Inch,
crate::units::length::Foot,
crate::units::length::Yard,
crate::units::length::Mile,
crate::units::mass::Carat,
crate::units::mass::Grain,
crate::units::mass::Pound,
crate::units::mass::Ounce,
crate::units::mass::Stone,
crate::units::mass::ShortTon,
crate::units::mass::LongTon,
crate::units::power::HorsepowerMetric,
crate::units::power::HorsepowerElectric,
crate::units::area::SquareInch,
crate::units::area::SquareFoot,
crate::units::area::SquareYard,
crate::units::area::SquareMile,
crate::units::volume::CubicInch,
crate::units::volume::CubicFoot,
crate::units::volume::UsGallon,
crate::units::volume::UsFluidOunce,
crate::units::force::PoundForce,
crate::units::energy::Calorie,
crate::units::energy::Kilocalorie,
crate::units::energy::BritishThermalUnit,
crate::units::energy::Therm,
crate::units::pressure::Atmosphere,
crate::units::pressure::Torr,
crate::units::pressure::MillimeterOfMercury,
crate::units::pressure::PoundPerSquareInch,
crate::units::pressure::InchOfMercury
);
};
}
#[cfg(feature = "customary")]
with_base_units!(extend_with_customary);
#[cfg(feature = "navigation")]
macro_rules! extend_with_navigation {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::length::NauticalMile,
crate::units::length::Chain,
crate::units::length::Rod,
crate::units::length::Link,
crate::units::length::Fathom,
crate::units::length::EarthMeridionalCircumference,
crate::units::length::EarthEquatorialCircumference,
crate::units::angular::Gradian
);
};
}
#[cfg(feature = "navigation")]
with_base_units!(extend_with_navigation);
#[cfg(feature = "fundamental-physics")]
macro_rules! extend_with_fundamental_physics {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::length::BohrRadius,
crate::units::length::ClassicalElectronRadius,
crate::units::length::PlanckLength,
crate::units::length::ElectronReducedComptonWavelength,
crate::units::mass::AtomicMassUnit,
crate::units::power::ErgPerSecond,
crate::units::force::Dyne,
crate::units::energy::Erg,
crate::units::energy::Electronvolt,
crate::units::energy::Kiloelectronvolt,
crate::units::energy::Megaelectronvolt
);
};
}
#[cfg(feature = "fundamental-physics")]
with_base_units!(extend_with_fundamental_physics);
#[cfg(feature = "land-area")]
macro_rules! extend_with_land_area {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
);
};
}
#[cfg(feature = "land-area")]
with_base_units!(extend_with_land_area);
#[cfg(feature = "radiometry")]
macro_rules! extend_with_radiometry {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::radiometry::WattPerSquareMeterSteradian,
crate::units::radiometry::ErgPerSecondSquareCentimeterSteradian,
crate::units::radiometry::WattPerSquareMeterSteradianMeter,
crate::units::radiometry::WattPerSquareMeterSteradianNanometer,
crate::units::radiometry::ErgPerSecondSquareCentimeterSteradianAngstrom,
crate::units::radiometry::PhotonPerSquareMeterSecondSteradian,
crate::units::radiometry::PhotonPerSquareCentimeterSecondSteradian,
crate::units::radiometry::PhotonPerSquareCentimeterNanosecondSteradian,
crate::units::radiometry::PhotonPerSquareMeterSecondSteradianMeter,
crate::units::radiometry::PhotonPerSquareCentimeterSecondSteradianAngstrom,
crate::units::radiometry::PhotonPerSquareCentimeterSecondSteradianNanometer,
crate::units::radiometry::PhotonPerSquareCentimeterNanosecondSteradianNanometer,
crate::units::radiometry::S10
);
};
}
#[cfg(feature = "radiometry")]
with_base_units!(extend_with_radiometry);
#[cfg(feature = "frequency")]
macro_rules! extend_with_frequency {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::frequency::Hertz,
crate::units::frequency::Millihertz,
crate::units::frequency::Kilohertz,
crate::units::frequency::Megahertz,
crate::units::frequency::Gigahertz,
crate::units::frequency::Terahertz
);
};
}
#[cfg(feature = "frequency")]
with_base_units!(extend_with_frequency);
#[cfg(feature = "chemistry")]
macro_rules! extend_with_chemistry {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::amount::Nanomole,
crate::units::amount::Micromole,
crate::units::amount::Millimole,
crate::units::amount::Mole,
crate::units::amount::Kilomole
);
};
}
#[cfg(feature = "chemistry")]
with_base_units!(extend_with_chemistry);
#[cfg(feature = "electrical")]
macro_rules! extend_with_electrical {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::electrical::Ampere,
crate::units::electrical::Microampere,
crate::units::electrical::Milliampere,
crate::units::electrical::Kiloampere,
crate::units::electrical::Coulomb,
crate::units::electrical::Millicoulomb,
crate::units::electrical::Microcoulomb,
crate::units::electrical::Kilocoulomb,
crate::units::electrical::Volt,
crate::units::electrical::Microvolt,
crate::units::electrical::Millivolt,
crate::units::electrical::Kilovolt,
crate::units::electrical::Megavolt,
crate::units::electrical::Ohm,
crate::units::electrical::Milliohm,
crate::units::electrical::Kilohm,
crate::units::electrical::Megaohm,
crate::units::electrical::Farad,
crate::units::electrical::Picofarad,
crate::units::electrical::Nanofarad,
crate::units::electrical::Microfarad,
crate::units::electrical::Millifarad,
crate::units::electrical::Henry,
crate::units::electrical::Microhenry,
crate::units::electrical::Millihenry,
crate::units::electrical::Weber,
crate::units::electrical::Milliweber,
crate::units::electrical::Tesla,
crate::units::electrical::Microtesla,
crate::units::electrical::Millitesla
);
};
}
#[cfg(feature = "electrical")]
with_base_units!(extend_with_electrical);
#[cfg(feature = "density")]
macro_rules! extend_with_density {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::density::KilogramPerCubicMeter,
crate::units::density::GramPerCubicCentimeter,
crate::units::density::GramPerMilliliter
);
};
}
#[cfg(feature = "density")]
with_base_units!(extend_with_density);
#[cfg(all(feature = "density", feature = "customary"))]
macro_rules! extend_density_with_customary {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::density::PoundPerCubicFoot
);
};
}
#[cfg(all(feature = "density", feature = "customary"))]
with_base_units!(extend_density_with_customary);
#[cfg(feature = "photometry")]
macro_rules! extend_with_photometry {
($($base:ty),+) => {
register_builtin_units_extend!(
$($base),+;
crate::units::photometry::Candela,
crate::units::photometry::Lumen,
crate::units::photometry::Millilumen,
crate::units::photometry::Kilolumen,
crate::units::photometry::Lux,
crate::units::photometry::Millilux,
crate::units::photometry::Kilolux
);
};
}
#[cfg(feature = "photometry")]
with_base_units!(extend_with_photometry);
#[cfg(feature = "astro")]
macro_rules! __impl_div_pairs_with_astro_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::length::AstronomicalUnit,
crate::units::length::LightYear,
crate::units::length::Parsec,
crate::units::length::Kiloparsec,
crate::units::length::Megaparsec,
crate::units::length::Gigaparsec,
crate::units::length::nominal::SolarRadius,
crate::units::length::nominal::SolarDiameter,
crate::units::length::nominal::EarthRadius,
crate::units::length::nominal::EarthEquatorialRadius,
crate::units::length::nominal::EarthPolarRadius,
crate::units::length::nominal::JupiterRadius,
crate::units::length::nominal::LunarRadius,
crate::units::length::nominal::LunarDistance,
crate::units::time::SiderealDay,
crate::units::time::SynodicMonth,
crate::units::time::SiderealYear,
crate::units::mass::SolarMass,
crate::units::angular::Arcminute,
crate::units::angular::Arcsecond,
crate::units::angular::MilliArcsecond,
crate::units::angular::MicroArcsecond,
crate::units::angular::HourAngle,
crate::units::power::SolarLuminosity
}
$($extra),+
);
};
}
#[cfg(feature = "customary")]
macro_rules! __impl_div_pairs_with_customary_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::length::Inch,
crate::units::length::Foot,
crate::units::length::Yard,
crate::units::length::Mile,
crate::units::mass::Carat,
crate::units::mass::Grain,
crate::units::mass::Pound,
crate::units::mass::Ounce,
crate::units::mass::Stone,
crate::units::mass::ShortTon,
crate::units::mass::LongTon,
crate::units::power::HorsepowerMetric,
crate::units::power::HorsepowerElectric,
crate::units::area::SquareInch,
crate::units::area::SquareFoot,
crate::units::area::SquareYard,
crate::units::area::SquareMile,
crate::units::volume::CubicInch,
crate::units::volume::CubicFoot,
crate::units::volume::UsGallon,
crate::units::volume::UsFluidOunce,
crate::units::force::PoundForce,
crate::units::energy::Calorie,
crate::units::energy::Kilocalorie
}
$($extra),+
);
};
}
#[cfg(feature = "fundamental-physics")]
macro_rules! __impl_div_pairs_with_fundamental_physics_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::length::BohrRadius,
crate::units::length::ClassicalElectronRadius,
crate::units::length::PlanckLength,
crate::units::length::ElectronReducedComptonWavelength,
crate::units::mass::AtomicMassUnit,
crate::units::power::ErgPerSecond,
crate::units::force::Dyne,
crate::units::energy::Erg,
crate::units::energy::Electronvolt,
crate::units::energy::Kiloelectronvolt,
crate::units::energy::Megaelectronvolt
}
$($extra),+
);
};
}
#[cfg(feature = "navigation")]
macro_rules! __impl_div_pairs_with_navigation_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::length::NauticalMile,
crate::units::length::Chain,
crate::units::length::Rod,
crate::units::length::Link,
crate::units::length::Fathom,
crate::units::length::EarthMeridionalCircumference,
crate::units::length::EarthEquatorialCircumference,
crate::units::angular::Gradian
}
$($extra),+
);
};
}
#[cfg(feature = "land-area")]
macro_rules! __impl_div_pairs_with_land_area_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
}
$($extra),+
);
};
}
#[cfg(feature = "frequency")]
macro_rules! __impl_div_pairs_with_frequency_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::frequency::Hertz,
crate::units::frequency::Millihertz,
crate::units::frequency::Kilohertz,
crate::units::frequency::Megahertz,
crate::units::frequency::Gigahertz,
crate::units::frequency::Terahertz
}
$($extra),+
);
};
}
#[cfg(feature = "chemistry")]
macro_rules! __impl_div_pairs_with_chemistry_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::amount::Nanomole,
crate::units::amount::Micromole,
crate::units::amount::Millimole,
crate::units::amount::Mole,
crate::units::amount::Kilomole
}
$($extra),+
);
};
}
#[cfg(feature = "electrical")]
macro_rules! __impl_div_pairs_with_electrical_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::electrical::Ampere,
crate::units::electrical::Microampere,
crate::units::electrical::Milliampere,
crate::units::electrical::Kiloampere,
crate::units::electrical::Coulomb,
crate::units::electrical::Millicoulomb,
crate::units::electrical::Microcoulomb,
crate::units::electrical::Kilocoulomb,
crate::units::electrical::Volt,
crate::units::electrical::Microvolt,
crate::units::electrical::Millivolt,
crate::units::electrical::Kilovolt,
crate::units::electrical::Megavolt,
crate::units::electrical::Ohm,
crate::units::electrical::Milliohm,
crate::units::electrical::Kilohm,
crate::units::electrical::Megaohm,
crate::units::electrical::Farad,
crate::units::electrical::Picofarad,
crate::units::electrical::Nanofarad,
crate::units::electrical::Microfarad,
crate::units::electrical::Millifarad,
crate::units::electrical::Henry,
crate::units::electrical::Microhenry,
crate::units::electrical::Millihenry,
crate::units::electrical::Weber,
crate::units::electrical::Milliweber,
crate::units::electrical::Tesla,
crate::units::electrical::Microtesla,
crate::units::electrical::Millitesla
}
$($extra),+
);
};
}
#[cfg(feature = "density")]
macro_rules! __impl_div_pairs_with_density_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::density::KilogramPerCubicMeter,
crate::units::density::GramPerCubicCentimeter,
crate::units::density::GramPerMilliliter
}
$($extra),+
);
};
}
#[cfg(feature = "photometry")]
macro_rules! __impl_div_pairs_with_photometry_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_div_pairs_each_extra_to_bases!(
{
crate::units::photometry::Candela,
crate::units::photometry::Lumen,
crate::units::photometry::Millilumen,
crate::units::photometry::Kilolumen,
crate::units::photometry::Lux,
crate::units::photometry::Millilux,
crate::units::photometry::Kilolux
}
$($extra),+
);
};
}
#[cfg(all(feature = "astro", feature = "julian-time"))]
__impl_div_pairs_with_astro_as_base!(
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);
#[cfg(all(feature = "astro", feature = "customary"))]
__impl_div_pairs_with_astro_as_base!(
crate::units::length::Inch,
crate::units::length::Foot,
crate::units::length::Yard,
crate::units::length::Mile,
crate::units::mass::Carat,
crate::units::mass::Grain,
crate::units::mass::Pound,
crate::units::mass::Ounce,
crate::units::mass::Stone,
crate::units::mass::ShortTon,
crate::units::mass::LongTon,
crate::units::power::HorsepowerMetric,
crate::units::power::HorsepowerElectric,
crate::units::area::SquareInch,
crate::units::area::SquareFoot,
crate::units::area::SquareYard,
crate::units::area::SquareMile,
crate::units::volume::CubicInch,
crate::units::volume::CubicFoot,
crate::units::volume::UsGallon,
crate::units::volume::UsFluidOunce,
crate::units::force::PoundForce,
crate::units::energy::Calorie,
crate::units::energy::Kilocalorie
);
#[cfg(all(feature = "astro", feature = "navigation"))]
__impl_div_pairs_with_astro_as_base!(
crate::units::length::NauticalMile,
crate::units::length::Chain,
crate::units::length::Rod,
crate::units::length::Link,
crate::units::length::Fathom,
crate::units::length::EarthMeridionalCircumference,
crate::units::length::EarthEquatorialCircumference,
crate::units::angular::Gradian
);
#[cfg(all(feature = "astro", feature = "fundamental-physics"))]
__impl_div_pairs_with_astro_as_base!(
crate::units::length::BohrRadius,
crate::units::length::ClassicalElectronRadius,
crate::units::length::PlanckLength,
crate::units::length::ElectronReducedComptonWavelength,
crate::units::mass::AtomicMassUnit,
crate::units::power::ErgPerSecond,
crate::units::force::Dyne,
crate::units::energy::Erg,
crate::units::energy::Electronvolt,
crate::units::energy::Kiloelectronvolt,
crate::units::energy::Megaelectronvolt
);
#[cfg(all(feature = "astro", feature = "land-area"))]
__impl_div_pairs_with_astro_as_base!(
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
);
#[cfg(all(feature = "julian-time", feature = "customary"))]
__impl_div_pairs_with_customary_as_base!(
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);
#[cfg(all(feature = "customary", feature = "navigation"))]
__impl_div_pairs_with_customary_as_base!(
crate::units::length::NauticalMile,
crate::units::length::Chain,
crate::units::length::Rod,
crate::units::length::Link,
crate::units::length::Fathom,
crate::units::length::EarthMeridionalCircumference,
crate::units::length::EarthEquatorialCircumference,
crate::units::angular::Gradian
);
#[cfg(all(feature = "customary", feature = "fundamental-physics"))]
__impl_div_pairs_with_customary_as_base!(
crate::units::length::BohrRadius,
crate::units::length::ClassicalElectronRadius,
crate::units::length::PlanckLength,
crate::units::length::ElectronReducedComptonWavelength,
crate::units::mass::AtomicMassUnit,
crate::units::power::ErgPerSecond,
crate::units::force::Dyne,
crate::units::energy::Erg,
crate::units::energy::Electronvolt,
crate::units::energy::Kiloelectronvolt,
crate::units::energy::Megaelectronvolt
);
#[cfg(all(feature = "customary", feature = "land-area"))]
__impl_div_pairs_with_customary_as_base!(
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
);
#[cfg(all(feature = "julian-time", feature = "fundamental-physics"))]
__impl_div_pairs_with_fundamental_physics_as_base!(
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);
#[cfg(all(feature = "navigation", feature = "fundamental-physics"))]
__impl_div_pairs_with_fundamental_physics_as_base!(
crate::units::length::NauticalMile,
crate::units::length::Chain,
crate::units::length::Rod,
crate::units::length::Link,
crate::units::length::Fathom,
crate::units::length::EarthMeridionalCircumference,
crate::units::length::EarthEquatorialCircumference,
crate::units::angular::Gradian
);
#[cfg(all(feature = "fundamental-physics", feature = "land-area"))]
__impl_div_pairs_with_fundamental_physics_as_base!(
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
);
#[cfg(all(feature = "julian-time", feature = "navigation"))]
__impl_div_pairs_with_navigation_as_base!(
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);
#[cfg(all(feature = "navigation", feature = "land-area"))]
__impl_div_pairs_with_navigation_as_base!(
crate::units::area::Hectare,
crate::units::area::Are,
crate::units::area::Acre
);
#[cfg(all(feature = "julian-time", feature = "land-area"))]
__impl_div_pairs_with_land_area_as_base!(
crate::units::time::JulianYear,
crate::units::time::JulianCentury
);