Restructuring
This commit is contained in:
		
							
								
								
									
										308
									
								
								src/display.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								src/display.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| use std::fmt::{Display, Formatter}; | ||||
|  | ||||
| use typenum::Integer; | ||||
|  | ||||
| use crate::{types::*, SiUnit}; | ||||
|  | ||||
| macro_rules! display_unit_defmt { | ||||
|     ($formatter: ident, $param: ident, $symbol: literal, $e1: ident, $e2: ident, $e3: ident, $e4: ident, $e5: ident, $e6: ident) => { | ||||
|         if $param::I64 != 0 { | ||||
|             if $e1::I64 == 0 | ||||
|                 && $e2::I64 == 0 | ||||
|                 && $e3::I64 == 0 | ||||
|                 && $e4::I64 == 0 | ||||
|                 && $e5::I64 == 0 | ||||
|                 && $e6::I64 == 0 | ||||
|             { | ||||
|                 defmt::write!($formatter, $symbol); | ||||
|             } else { | ||||
|                 defmt::write!($formatter, "*{}", $symbol); | ||||
|             } | ||||
|             if $param::I64 != 1 { | ||||
|                 defmt::write!($formatter, "^{}", $param::I64); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| macro_rules! display_special_unit_defmt { | ||||
|     ($formatter: ident, $self: ident, $(($symbol: literal, $other: ty)),* $(,)?) => { | ||||
|         $( | ||||
|         if ::core::any::TypeId::of::<$self>() == ::core::any::TypeId::of::<$other>() { | ||||
|             defmt::write!($formatter, $symbol); | ||||
|             return; | ||||
|         } | ||||
|         )* | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #[cfg(feature = "defmt")] | ||||
| impl<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> defmt::Format | ||||
|     for SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| where | ||||
|     Second: Integer, | ||||
|     Meter: Integer, | ||||
|     Kilogram: Integer, | ||||
|     Ampere: Integer, | ||||
|     Kelvin: Integer, | ||||
|     Mole: Integer, | ||||
|     Candela: Integer, | ||||
|     T: defmt::Format + 'static, | ||||
| { | ||||
|     fn format(&self, f: defmt::Formatter<'_>) { | ||||
|         defmt::write!(f, "{}", self.value); | ||||
|         // derived units with special symbols | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("Hz", Herz<T>), | ||||
|             ("N", Newton<T>), | ||||
|             ("Pa", Pascal<T>), | ||||
|             ("J", Joule<T>), | ||||
|             ("W", Watt<T>), | ||||
|             ("C", Coulomb<T>), | ||||
|             ("V", Volt<T>), | ||||
|             ("F", Farad<T>), | ||||
|             ("Ohm", Ohm<T>), | ||||
|             ("S", Siemens<T>), | ||||
|             ("Wb", Weber<T>), | ||||
|             ("T", Tesla<T>), | ||||
|             ("H", Henry<T>), | ||||
|             ("lx", Lux<T>), | ||||
|             ("Gy|Sv", Gray<T>), | ||||
|             ("kat", Katal<T>), | ||||
|         ); | ||||
|         // derived units | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("m/s", MeterPerSecond<T>), | ||||
|             ("m/s²", MeterPerSquareSecond<T>), | ||||
|             ("kg/m³", KilogramPerCubicMeter<T>), | ||||
|             ("kg/m²", KilogramPerSquareMeter<T>), | ||||
|             ("m³/kg", CubicMeterPerKilogram<T>), | ||||
|             ("A/m²", AmperePerSquareMeter<T>), | ||||
|             ("A/m", AmperePerMeter<T>), | ||||
|             ("mol/m³", MolePerCubicMeter<T>), | ||||
|         ); | ||||
|         // derived units including special names | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("Pa*s", PascalSecond<T>), | ||||
|             ("N/m", NewtonPerMeter<T>), | ||||
|             ("W/m²", WattPerSquareMeter<T>), | ||||
|             ("J/K", JoulePerKelvin<T>), | ||||
|             ("J/(kg*K)", JoulePerKilogramKelvin<T>), | ||||
|             ("W/(m*K)", WattPerMeterKelvin<T>), | ||||
|             ("V/m", VoltPerMeter<T>), | ||||
|             ("C/m³", CoulombPerCubicMeter<T>), | ||||
|             ("C/m²", CoulombPerSquareMeter<T>), | ||||
|             ("F/m", FaradPerMeter<T>), | ||||
|             ("H/m", HenryPerMeter<T>), | ||||
|             ("J/mol", JoulePerMole<T>), | ||||
|             ("J/(mol*K)", JoulePerMoleKelvin<T>), | ||||
|             ("C/kg", CoulombPerKilogram<T>), | ||||
|             ("Gy/s", GrayPerSecond<T>), | ||||
|             ("kat/m³", KatalPerCubicMeter<T>), | ||||
|         ); | ||||
|  | ||||
|         // base units | ||||
|         display_unit_defmt!(f, Second, "s", Meter, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Meter, "m", Second, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Kilogram, "kg", Second, Meter, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Ampere, "A", Second, Meter, Kilogram, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Kelvin, "K", Second, Meter, Kilogram, Ampere, Mole, Candela); | ||||
|         display_unit_defmt!(f, Mole, "mol", Second, Meter, Kilogram, Ampere, Kelvin, Candela); | ||||
|         display_unit_defmt!(f, Candela, "cd", Second, Meter, Kilogram, Ampere, Kelvin, Mole); | ||||
|     } | ||||
| } | ||||
|  | ||||
| macro_rules! display_unit { | ||||
|     ($formatter: ident, $param: ident, $symbol: literal, $e1: ident, $e2: ident, $e3: ident, $e4: ident, $e5: ident, $e6: ident) => { | ||||
|         if $param::I64 != 0 { | ||||
|             if $e1::I64 == 0 | ||||
|                 && $e2::I64 == 0 | ||||
|                 && $e3::I64 == 0 | ||||
|                 && $e4::I64 == 0 | ||||
|                 && $e5::I64 == 0 | ||||
|                 && $e6::I64 == 0 | ||||
|             { | ||||
|                 write!($formatter, $symbol)?; | ||||
|             } else { | ||||
|                 write!($formatter, "*{}", $symbol)?; | ||||
|             } | ||||
|             if $param::I64 != 1 { | ||||
|                 write!($formatter, "^{}", $param::I64)?; | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| macro_rules! display_special_unit { | ||||
|     ($formatter: ident, $self: ident, $(($symbol: literal, $other: ty)),* $(,)?) => { | ||||
|         $( | ||||
|         if ::core::any::TypeId::of::<$self>() == ::core::any::TypeId::of::<$other>() { | ||||
|             return write!($formatter, $symbol); | ||||
|         } | ||||
|         )* | ||||
|     }; | ||||
| } | ||||
|  | ||||
| impl<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> Display | ||||
|     for SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| where | ||||
|     Second: Integer, | ||||
|     Meter: Integer, | ||||
|     Kilogram: Integer, | ||||
|     Ampere: Integer, | ||||
|     Kelvin: Integer, | ||||
|     Mole: Integer, | ||||
|     Candela: Integer, | ||||
|     T: Display + 'static, | ||||
| { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{}", self.value)?; | ||||
|         // derived units with special symbols | ||||
|         display_special_unit!(f, Self, | ||||
|             ("Hz", Herz<T>), | ||||
|             ("N", Newton<T>), | ||||
|             ("Pa", Pascal<T>), | ||||
|             ("J", Joule<T>), | ||||
|             ("W", Watt<T>), | ||||
|             ("C", Coulomb<T>), | ||||
|             ("V", Volt<T>), | ||||
|             ("F", Farad<T>), | ||||
|             ("Ohm", Ohm<T>), | ||||
|             ("S", Siemens<T>), | ||||
|             ("Wb", Weber<T>), | ||||
|             ("T", Tesla<T>), | ||||
|             ("H", Henry<T>), | ||||
|             ("lx", Lux<T>), | ||||
|             ("Gy|Sv", Gray<T>), | ||||
|             ("kat", Katal<T>), | ||||
|         ); | ||||
|         // derived units | ||||
|         display_special_unit!(f, Self, | ||||
|             ("m/s", MeterPerSecond<T>), | ||||
|             ("m/s²", MeterPerSquareSecond<T>), | ||||
|             ("kg/m³", KilogramPerCubicMeter<T>), | ||||
|             ("kg/m²", KilogramPerSquareMeter<T>), | ||||
|             ("m³/kg", CubicMeterPerKilogram<T>), | ||||
|             ("A/m²", AmperePerSquareMeter<T>), | ||||
|             ("A/m", AmperePerMeter<T>), | ||||
|             ("mol/m³", MolePerCubicMeter<T>), | ||||
|         ); | ||||
|         // derived units including special names | ||||
|         display_special_unit!(f, Self, | ||||
|             ("Pa*s", PascalSecond<T>), | ||||
|             ("N/m", NewtonPerMeter<T>), | ||||
|             ("W/m²", WattPerSquareMeter<T>), | ||||
|             ("J/K", JoulePerKelvin<T>), | ||||
|             ("J/(kg*K)", JoulePerKilogramKelvin<T>), | ||||
|             ("W/(m*K)", WattPerMeterKelvin<T>), | ||||
|             ("V/m", VoltPerMeter<T>), | ||||
|             ("C/m³", CoulombPerCubicMeter<T>), | ||||
|             ("C/m²", CoulombPerSquareMeter<T>), | ||||
|             ("F/m", FaradPerMeter<T>), | ||||
|             ("H/m", HenryPerMeter<T>), | ||||
|             ("J/mol", JoulePerMole<T>), | ||||
|             ("J/(mol*K)", JoulePerMoleKelvin<T>), | ||||
|             ("C/kg", CoulombPerKilogram<T>), | ||||
|             ("Gy/s", GrayPerSecond<T>), | ||||
|             ("kat/m³", KatalPerCubicMeter<T>), | ||||
|         ); | ||||
|  | ||||
|         // base units | ||||
|         display_unit!(f, Second, "s", Meter, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Meter, "m", Second, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Kilogram, "kg", Second, Meter, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Ampere, "A", Second, Meter, Kilogram, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Kelvin, "K", Second, Meter, Kilogram, Ampere, Mole, Candela); | ||||
|         display_unit!(f, Mole, "mol", Second, Meter, Kilogram, Ampere, Kelvin, Candela); | ||||
|         display_unit!(f, Candela, "cd", Second, Meter, Kilogram, Ampere, Kelvin, Mole); | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use super::*; | ||||
|  | ||||
|     #[test] | ||||
|     fn debug() { | ||||
|         let m = Meter::new(2); | ||||
|         assert_eq!(format!("{m:?}"), "SiUnit { value: 2, _s: PhantomData<typenum::int::Z0>, _m: PhantomData<typenum::int::PInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>>>, _kg: PhantomData<typenum::int::Z0>, _a: PhantomData<typenum::int::Z0>, _k: PhantomData<typenum::int::Z0>, _mol: PhantomData<typenum::int::Z0>, _cd: PhantomData<typenum::int::Z0> }".to_owned()); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn display() { | ||||
|         let unit = Unit::new(2); | ||||
|         let second = Second::new(2); | ||||
|         let meter = Meter::new(2); | ||||
|         let kilogram = Kilogram::new(2); | ||||
|         let ampere = Ampere::new(2); | ||||
|         let kelvin = Kelvin::new(2); | ||||
|         let mole = Mole::new(2); | ||||
|         let candela = Candela::new(2); | ||||
|         assert_eq!(unit.to_string(), "2"); | ||||
|         assert_eq!(second.to_string(), "2s"); | ||||
|         assert_eq!(meter.to_string(), "2m"); | ||||
|         assert_eq!(kilogram.to_string(), "2kg"); | ||||
|         assert_eq!(ampere.to_string(), "2A"); | ||||
|         assert_eq!(kelvin.to_string(), "2K"); | ||||
|         assert_eq!(mole.to_string(), "2mol"); | ||||
|         assert_eq!(candela.to_string(), "2cd"); | ||||
|         let square_second: SiUnit<i32, _, _, _, _, _, _, _> = second * second; | ||||
|         let square_meter: SiUnit<i32, _, _, _, _, _, _, _> = meter * meter; | ||||
|         let square_kilogram: SiUnit<i32, _, _, _, _, _, _, _> = kilogram * kilogram; | ||||
|         let square_ampere: SiUnit<i32, _, _, _, _, _, _, _> = ampere * ampere; | ||||
|         let square_kelvin: SiUnit<i32, _, _, _, _, _, _, _> = kelvin * kelvin; | ||||
|         let square_mole: SiUnit<i32, _, _, _, _, _, _, _> = mole * mole; | ||||
|         let square_candela: SiUnit<i32, _, _, _, _, _, _, _> = candela * candela; | ||||
|         assert_eq!(square_second.to_string(), "4s^2"); | ||||
|         assert_eq!(square_meter.to_string(), "4m^2"); | ||||
|         assert_eq!(square_kilogram.to_string(), "4kg^2"); | ||||
|         assert_eq!(square_ampere.to_string(), "4A^2"); | ||||
|         assert_eq!(square_kelvin.to_string(), "4K^2"); | ||||
|         assert_eq!(square_mole.to_string(), "4mol^2"); | ||||
|         assert_eq!(square_candela.to_string(), "4cd^2"); | ||||
|  | ||||
|         assert_eq!(Herz::new(2).to_string(), "2Hz"); | ||||
|         assert_eq!(Newton::new(2).to_string(), "2N"); | ||||
|         assert_eq!(Pascal::new(2).to_string(), "2Pa"); | ||||
|         assert_eq!(Joule::new(2).to_string(), "2J"); | ||||
|         assert_eq!(Watt::new(2).to_string(), "2W"); | ||||
|         assert_eq!(Coulomb::new(2).to_string(), "2C"); | ||||
|         assert_eq!(Volt::new(2).to_string(), "2V"); | ||||
|         assert_eq!(Farad::new(2).to_string(), "2F"); | ||||
|         assert_eq!(Ohm::new(2).to_string(), "2Ohm"); | ||||
|         assert_eq!(Siemens::new(2).to_string(), "2S"); | ||||
|         assert_eq!(Weber::new(2).to_string(), "2Wb"); | ||||
|         assert_eq!(Tesla::new(2).to_string(), "2T"); | ||||
|         assert_eq!(Henry::new(2).to_string(), "2H"); | ||||
|         assert_eq!(Lux::new(2).to_string(), "2lx"); | ||||
|         assert_eq!(Gray::new(2).to_string(), "2Gy|Sv"); | ||||
|         assert_eq!(Katal::new(2).to_string(), "2kat"); | ||||
|  | ||||
|         assert_eq!(MeterPerSecond::new(2).to_string(), "2m/s"); | ||||
|         assert_eq!(MeterPerSquareSecond::new(2).to_string(), "2m/s²"); | ||||
|         assert_eq!(KilogramPerCubicMeter::new(2).to_string(), "2kg/m³"); | ||||
|         assert_eq!(KilogramPerSquareMeter::new(2).to_string(), "2kg/m²"); | ||||
|         assert_eq!(CubicMeterPerKilogram::new(2).to_string(), "2m³/kg"); | ||||
|         assert_eq!(AmperePerSquareMeter::new(2).to_string(), "2A/m²"); | ||||
|         assert_eq!(AmperePerMeter::new(2).to_string(), "2A/m"); | ||||
|         assert_eq!(MolePerCubicMeter::new(2).to_string(), "2mol/m³"); | ||||
|  | ||||
|         assert_eq!(PascalSecond::new(2).to_string(), "2Pa*s"); | ||||
|         assert_eq!(NewtonPerMeter::new(2).to_string(), "2N/m"); | ||||
|         assert_eq!(WattPerSquareMeter::new(2).to_string(), "2W/m²"); | ||||
|         assert_eq!(JoulePerKelvin::new(2).to_string(), "2J/K"); | ||||
|         assert_eq!(JoulePerKilogramKelvin::new(2).to_string(), "2J/(kg*K)"); | ||||
|         assert_eq!(WattPerMeterKelvin::new(2).to_string(), "2W/(m*K)"); | ||||
|         assert_eq!(VoltPerMeter::new(2).to_string(), "2V/m"); | ||||
|         assert_eq!(CoulombPerCubicMeter::new(2).to_string(), "2C/m³"); | ||||
|         assert_eq!(CoulombPerSquareMeter::new(2).to_string(), "2C/m²"); | ||||
|         assert_eq!(FaradPerMeter::new(2).to_string(), "2F/m"); | ||||
|         assert_eq!(HenryPerMeter::new(2).to_string(), "2H/m"); | ||||
|         assert_eq!(JoulePerMole::new(2).to_string(), "2J/mol"); | ||||
|         assert_eq!(JoulePerMoleKelvin::new(2).to_string(), "2J/(mol*K)"); | ||||
|         assert_eq!(CoulombPerKilogram::new(2).to_string(), "2C/kg"); | ||||
|         assert_eq!(GrayPerSecond::new(2).to_string(), "2Gy/s"); | ||||
|         assert_eq!(KatalPerCubicMeter::new(2).to_string(), "2kat/m³"); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										446
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										446
									
								
								src/lib.rs
									
									
									
									
									
								
							| @@ -1,3 +1,6 @@ | ||||
| mod display; | ||||
| pub mod types; | ||||
|  | ||||
| use std::{ | ||||
|     fmt::{Display, Formatter}, | ||||
|     marker::PhantomData, | ||||
| @@ -9,6 +12,7 @@ use std::{ | ||||
|  | ||||
| use num_traits::{Num, One, Zero}; | ||||
| use typenum::{int::Z0, op, Integer}; | ||||
| use types::Unit; | ||||
|  | ||||
| #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)] | ||||
| pub struct SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| @@ -31,221 +35,6 @@ where | ||||
|     _cd: PhantomData<Candela>, | ||||
| } | ||||
|  | ||||
| macro_rules! display_unit_defmt { | ||||
|     ($formatter: ident, $param: ident, $symbol: literal, $e1: ident, $e2: ident, $e3: ident, $e4: ident, $e5: ident, $e6: ident) => { | ||||
|         if $param::I64 != 0 { | ||||
|             if $e1::I64 == 0 | ||||
|                 && $e2::I64 == 0 | ||||
|                 && $e3::I64 == 0 | ||||
|                 && $e4::I64 == 0 | ||||
|                 && $e5::I64 == 0 | ||||
|                 && $e6::I64 == 0 | ||||
|             { | ||||
|                 defmt::write!($formatter, $symbol); | ||||
|             } else { | ||||
|                 defmt::write!($formatter, "*{}", $symbol); | ||||
|             } | ||||
|             if $param::I64 != 1 { | ||||
|                 defmt::write!($formatter, "^{}", $param::I64); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| macro_rules! display_special_unit_defmt { | ||||
|     ($formatter: ident, $self: ident, $(($symbol: literal, $other: ty)),* $(,)?) => { | ||||
|         $( | ||||
|         if ::core::any::TypeId::of::<$self>() == ::core::any::TypeId::of::<$other>() { | ||||
|             defmt::write!($formatter, $symbol); | ||||
|             return; | ||||
|         } | ||||
|         )* | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #[cfg(feature = "defmt")] | ||||
| impl<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> defmt::Format | ||||
|     for SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| where | ||||
|     Second: Integer, | ||||
|     Meter: Integer, | ||||
|     Kilogram: Integer, | ||||
|     Ampere: Integer, | ||||
|     Kelvin: Integer, | ||||
|     Mole: Integer, | ||||
|     Candela: Integer, | ||||
|     T: defmt::Format + 'static, | ||||
| { | ||||
|     fn format(&self, f: defmt::Formatter<'_>) { | ||||
|         defmt::write!(f, "{}", self.value); | ||||
|         // derived units with special symbols | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("Hz", Herz<T>), | ||||
|             ("N", Newton<T>), | ||||
|             ("Pa", Pascal<T>), | ||||
|             ("J", Joule<T>), | ||||
|             ("W", Watt<T>), | ||||
|             ("C", Coulomb<T>), | ||||
|             ("V", Volt<T>), | ||||
|             ("F", Farad<T>), | ||||
|             ("Ohm", Ohm<T>), | ||||
|             ("S", Siemens<T>), | ||||
|             ("Wb", Weber<T>), | ||||
|             ("T", Tesla<T>), | ||||
|             ("H", Henry<T>), | ||||
|             ("lx", Lux<T>), | ||||
|             ("Gy|Sv", Gray<T>), | ||||
|             ("kat", Katal<T>), | ||||
|         ); | ||||
|         // derived units | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("m/s", MeterPerSecond<T>), | ||||
|             ("m/s²", MeterPerSquareSecond<T>), | ||||
|             ("kg/m³", KilogramPerCubicMeter<T>), | ||||
|             ("kg/m²", KilogramPerSquareMeter<T>), | ||||
|             ("m³/kg", CubicMeterPerKilogram<T>), | ||||
|             ("A/m²", AmperePerSquareMeter<T>), | ||||
|             ("A/m", AmperePerMeter<T>), | ||||
|             ("mol/m³", MolePerCubicMeter<T>), | ||||
|         ); | ||||
|         // derived units including special names | ||||
|         display_special_unit_defmt!(f, Self, | ||||
|             ("Pa*s", PascalSecond<T>), | ||||
|             ("N/m", NewtonPerMeter<T>), | ||||
|             ("W/m²", WattPerSquareMeter<T>), | ||||
|             ("J/K", JoulePerKelvin<T>), | ||||
|             ("J/(kg*K)", JoulePerKilogramKelvin<T>), | ||||
|             ("W/(m*K)", WattPerMeterKelvin<T>), | ||||
|             ("V/m", VoltPerMeter<T>), | ||||
|             ("C/m³", CoulombPerCubicMeter<T>), | ||||
|             ("C/m²", CoulombPerSquareMeter<T>), | ||||
|             ("F/m", FaradPerMeter<T>), | ||||
|             ("H/m", HenryPerMeter<T>), | ||||
|             ("J/mol", JoulePerMole<T>), | ||||
|             ("J/(mol*K)", JoulePerMoleKelvin<T>), | ||||
|             ("C/kg", CoulombPerKilogram<T>), | ||||
|             ("Gy/s", GrayPerSecond<T>), | ||||
|             ("kat/m³", KatalPerCubicMeter<T>), | ||||
|         ); | ||||
|  | ||||
|         // base units | ||||
|         display_unit_defmt!(f, Second, "s", Meter, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Meter, "m", Second, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Kilogram, "kg", Second, Meter, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Ampere, "A", Second, Meter, Kilogram, Kelvin, Mole, Candela); | ||||
|         display_unit_defmt!(f, Kelvin, "K", Second, Meter, Kilogram, Ampere, Mole, Candela); | ||||
|         display_unit_defmt!(f, Mole, "mol", Second, Meter, Kilogram, Ampere, Kelvin, Candela); | ||||
|         display_unit_defmt!(f, Candela, "cd", Second, Meter, Kilogram, Ampere, Kelvin, Mole); | ||||
|     } | ||||
| } | ||||
|  | ||||
| macro_rules! display_unit { | ||||
|     ($formatter: ident, $param: ident, $symbol: literal, $e1: ident, $e2: ident, $e3: ident, $e4: ident, $e5: ident, $e6: ident) => { | ||||
|         if $param::I64 != 0 { | ||||
|             if $e1::I64 == 0 | ||||
|                 && $e2::I64 == 0 | ||||
|                 && $e3::I64 == 0 | ||||
|                 && $e4::I64 == 0 | ||||
|                 && $e5::I64 == 0 | ||||
|                 && $e6::I64 == 0 | ||||
|             { | ||||
|                 write!($formatter, $symbol)?; | ||||
|             } else { | ||||
|                 write!($formatter, "*{}", $symbol)?; | ||||
|             } | ||||
|             if $param::I64 != 1 { | ||||
|                 write!($formatter, "^{}", $param::I64)?; | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| macro_rules! display_special_unit { | ||||
|     ($formatter: ident, $self: ident, $(($symbol: literal, $other: ty)),* $(,)?) => { | ||||
|         $( | ||||
|         if ::core::any::TypeId::of::<$self>() == ::core::any::TypeId::of::<$other>() { | ||||
|             return write!($formatter, $symbol); | ||||
|         } | ||||
|         )* | ||||
|     }; | ||||
| } | ||||
|  | ||||
| impl<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> Display | ||||
|     for SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| where | ||||
|     Second: Integer, | ||||
|     Meter: Integer, | ||||
|     Kilogram: Integer, | ||||
|     Ampere: Integer, | ||||
|     Kelvin: Integer, | ||||
|     Mole: Integer, | ||||
|     Candela: Integer, | ||||
|     T: Display + 'static, | ||||
| { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{}", self.value)?; | ||||
|         // derived units with special symbols | ||||
|         display_special_unit!(f, Self, | ||||
|             ("Hz", Herz<T>), | ||||
|             ("N", Newton<T>), | ||||
|             ("Pa", Pascal<T>), | ||||
|             ("J", Joule<T>), | ||||
|             ("W", Watt<T>), | ||||
|             ("C", Coulomb<T>), | ||||
|             ("V", Volt<T>), | ||||
|             ("F", Farad<T>), | ||||
|             ("Ohm", Ohm<T>), | ||||
|             ("S", Siemens<T>), | ||||
|             ("Wb", Weber<T>), | ||||
|             ("T", Tesla<T>), | ||||
|             ("H", Henry<T>), | ||||
|             ("lx", Lux<T>), | ||||
|             ("Gy|Sv", Gray<T>), | ||||
|             ("kat", Katal<T>), | ||||
|         ); | ||||
|         // derived units | ||||
|         display_special_unit!(f, Self, | ||||
|             ("m/s", MeterPerSecond<T>), | ||||
|             ("m/s²", MeterPerSquareSecond<T>), | ||||
|             ("kg/m³", KilogramPerCubicMeter<T>), | ||||
|             ("kg/m²", KilogramPerSquareMeter<T>), | ||||
|             ("m³/kg", CubicMeterPerKilogram<T>), | ||||
|             ("A/m²", AmperePerSquareMeter<T>), | ||||
|             ("A/m", AmperePerMeter<T>), | ||||
|             ("mol/m³", MolePerCubicMeter<T>), | ||||
|         ); | ||||
|         // derived units including special names | ||||
|         display_special_unit!(f, Self, | ||||
|             ("Pa*s", PascalSecond<T>), | ||||
|             ("N/m", NewtonPerMeter<T>), | ||||
|             ("W/m²", WattPerSquareMeter<T>), | ||||
|             ("J/K", JoulePerKelvin<T>), | ||||
|             ("J/(kg*K)", JoulePerKilogramKelvin<T>), | ||||
|             ("W/(m*K)", WattPerMeterKelvin<T>), | ||||
|             ("V/m", VoltPerMeter<T>), | ||||
|             ("C/m³", CoulombPerCubicMeter<T>), | ||||
|             ("C/m²", CoulombPerSquareMeter<T>), | ||||
|             ("F/m", FaradPerMeter<T>), | ||||
|             ("H/m", HenryPerMeter<T>), | ||||
|             ("J/mol", JoulePerMole<T>), | ||||
|             ("J/(mol*K)", JoulePerMoleKelvin<T>), | ||||
|             ("C/kg", CoulombPerKilogram<T>), | ||||
|             ("Gy/s", GrayPerSecond<T>), | ||||
|             ("kat/m³", KatalPerCubicMeter<T>), | ||||
|         ); | ||||
|  | ||||
|         // base units | ||||
|         display_unit!(f, Second, "s", Meter, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Meter, "m", Second, Kilogram, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Kilogram, "kg", Second, Meter, Ampere, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Ampere, "A", Second, Meter, Kilogram, Kelvin, Mole, Candela); | ||||
|         display_unit!(f, Kelvin, "K", Second, Meter, Kilogram, Ampere, Mole, Candela); | ||||
|         display_unit!(f, Mole, "mol", Second, Meter, Kilogram, Ampere, Kelvin, Candela); | ||||
|         display_unit!(f, Candela, "cd", Second, Meter, Kilogram, Ampere, Kelvin, Mole); | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> Deref | ||||
|     for SiUnit<T, Second, Meter, Kilogram, Ampere, Kelvin, Mole, Candela> | ||||
| where | ||||
| @@ -765,233 +554,10 @@ where | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[rustfmt::skip] | ||||
| mod aliases { | ||||
|     use super::SiUnit; | ||||
|     use typenum::consts::{N1, N2, N3, P1, P2, P3, P4, Z0}; | ||||
|     // Base units | ||||
|     pub type Unit<T>     = SiUnit<T, Z0, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// time | ||||
|     pub type Second<T>   = SiUnit<T, P1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// length | ||||
|     pub type Meter<T>    = SiUnit<T, Z0, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// mass | ||||
|     pub type Kilogram<T> = SiUnit<T, Z0, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// electric current | ||||
|     pub type Ampere<T>   = SiUnit<T, Z0, Z0, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// thermodynamic temperature | ||||
|     pub type Kelvin<T>   = SiUnit<T, Z0, Z0, Z0, Z0, P1, Z0, Z0>; | ||||
|     /// amount of substance | ||||
|     pub type Mole<T>     = SiUnit<T, Z0, Z0, Z0, Z0, Z0, P1, Z0>; | ||||
|     /// luminous intensity | ||||
|     pub type Candela<T>  = SiUnit<T, Z0, Z0, Z0, Z0, Z0, Z0, P1>; | ||||
|  | ||||
|     // Derived units with special names | ||||
|     /// plane angle | ||||
|     pub type Radian<T>    = Unit<T>; | ||||
|     /// solid angle | ||||
|     pub type Steradian<T> = Unit<T>; | ||||
|     /// frequency | ||||
|     pub type Herz<T>      = SiUnit<T, N1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// force, weight | ||||
|     pub type Newton<T>    = SiUnit<T, N2, P1, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// pressure, stress | ||||
|     pub type Pascal<T>    = SiUnit<T, N2, N1, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// energy, work, heat | ||||
|     pub type Joule<T>     = SiUnit<T, N2, P2, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// power, radiant flux | ||||
|     pub type Watt<T>      = SiUnit<T, N3, P2, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// electric charge | ||||
|     pub type Coulomb<T>   = SiUnit<T, P1, Z0, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// electric potential, voltage, emf | ||||
|     pub type Volt<T>      = SiUnit<T, N3, P2, P1, N1, Z0, Z0, Z0>; | ||||
|     /// capacitance | ||||
|     pub type Farad<T>     = SiUnit<T, P4, N2, N1, P2, Z0, Z0, Z0>; | ||||
|     /// resistance impedance, reactance | ||||
|     pub type Ohm<T>       = SiUnit<T, N3, P2, P1, N2, Z0, Z0, Z0>; | ||||
|     /// electrical conductance | ||||
|     pub type Siemens<T>   = SiUnit<T, P3, N2, N1, P2, Z0, Z0, Z0>; | ||||
|     /// magnetic flux | ||||
|     pub type Weber<T>     = SiUnit<T, N2, P2, P1, N1, Z0, Z0, Z0>; | ||||
|     /// magnetic flux density | ||||
|     pub type Tesla<T>     = SiUnit<T, N2, Z0, P1, N1, Z0, Z0, Z0>; | ||||
|     /// inductance | ||||
|     pub type Henry<T>     = SiUnit<T, N2, P2, P1, N2, Z0, Z0, Z0>; | ||||
|     /// luminous flux | ||||
|     pub type Lumen<T>     = Candela<T>; | ||||
|     /// iluminance | ||||
|     pub type Lux<T>       = SiUnit<T, Z0, N2, Z0, Z0, Z0, Z0, P1>; | ||||
|     /// activity referred to a radionuclide | ||||
|     pub type Becquerel<T> = Herz<T>; | ||||
|     /// absorbed dose | ||||
|     pub type Gray<T>      = SiUnit<T, N2, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// equivalent dose | ||||
|     pub type Sievert<T>   = Gray<T>; | ||||
|     /// catalytic activity | ||||
|     pub type Katal<T>     = SiUnit<T, N1, Z0, Z0, Z0, Z0, P1, Z0>; | ||||
|  | ||||
|     // Derived units without special names | ||||
|     /// area | ||||
|     pub type SquareMeter<T>            = SiUnit<T, Z0, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// volume | ||||
|     pub type CubicMeter<T>             = SiUnit<T, Z0, P3, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// speed, velocity | ||||
|     pub type MeterPerSecond<T>         = SiUnit<T, N1, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// acceleration | ||||
|     pub type MeterPerSquareSecond<T>   = SiUnit<T, N2, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// wavenumber, vergence | ||||
|     pub type ReciprocalMeter<T>        = SiUnit<T, Z0, N1, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// density, mass concentration | ||||
|     pub type KilogramPerCubicMeter<T>  = SiUnit<T, Z0, N3, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// surface density | ||||
|     pub type KilogramPerSquareMeter<T> = SiUnit<T, Z0, N2, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// specific density | ||||
|     pub type CubicMeterPerKilogram<T>  = SiUnit<T, Z0, P3, N1, Z0, Z0, Z0, Z0>; | ||||
|     /// current density | ||||
|     pub type AmperePerSquareMeter<T>   = SiUnit<T, Z0, N2, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// magnetic field strength | ||||
|     pub type AmperePerMeter<T>         = SiUnit<T, Z0, N1, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// concentration | ||||
|     pub type MolePerCubicMeter<T>      = SiUnit<T, Z0, N3, Z0, Z0, Z0, P1, Z0>; | ||||
|     /// luminance | ||||
|     pub type CandelaPerSquareMeter<T>  = SiUnit<T, Z0, N2, Z0, Z0, Z0, Z0, P1>; | ||||
|  | ||||
|     // Derived units including special names | ||||
|     /// dynamic viscosity | ||||
|     pub type PascalSecond<T>                = SiUnit<T, N1, N1, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// moment of force | ||||
|     pub type NewtonMeter<T>                 = SiUnit<T, N2, P2, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// surface tension | ||||
|     pub type NewtonPerMeter<T>              = SiUnit<T, N2, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// angular velocity, angular frequency | ||||
|     pub type RadianPerSecond<T>             = SiUnit<T, N1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// angular acceleration | ||||
|     pub type RadianPerSquareSecond<T>       = SiUnit<T, N2, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// heat flux density, irradiance | ||||
|     pub type WattPerSquareMeter<T>          = SiUnit<T, N3, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// entropy, heat capacity | ||||
|     pub type JoulePerKelvin<T>              = SiUnit<T, N2, P2, P1, Z0, N1, Z0, Z0>; | ||||
|     /// specific heat capacity, specific entropy | ||||
|     pub type JoulePerKilogramKelvin<T>      = SiUnit<T, N2, P2, Z0, Z0, N1, Z0, Z0>; | ||||
|     /// specific energy | ||||
|     pub type JoulePerKilogram<T>            = SiUnit<T, N2, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// themal conductivity | ||||
|     pub type WattPerMeterKelvin<T>          = SiUnit<T, N3, P1, P1, Z0, N1, Z0, Z0>; | ||||
|     /// energy density | ||||
|     pub type JoulePerCubicMeter<T>          = SiUnit<T, N2, N1, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// electric field strength | ||||
|     pub type VoltPerMeter<T>                = SiUnit<T, N3, P1, P1, N1, Z0, Z0, Z0>; | ||||
|     /// electric charge density | ||||
|     pub type CoulombPerCubicMeter<T>        = SiUnit<T, P1, N3, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// surface charge density, electirc flusx density, electric displacement | ||||
|     pub type CoulombPerSquareMeter<T>       = SiUnit<T, P1, N2, Z0, P1, Z0, Z0, Z0>; | ||||
|     /// permittivity | ||||
|     pub type FaradPerMeter<T>               = SiUnit<T, P4, N3, N1, P2, Z0, Z0, Z0>; | ||||
|     /// permeability | ||||
|     pub type HenryPerMeter<T>               = SiUnit<T, N2, P1, P1, N2, Z0, Z0, Z0>; | ||||
|     /// molar energy | ||||
|     pub type JoulePerMole<T>                = SiUnit<T, N2, P2, P1, Z0, Z0, N1, Z0>; | ||||
|     /// molar entropy, molar heat capacity | ||||
|     pub type JoulePerMoleKelvin<T>          = SiUnit<T, N2, P2, P1, Z0, N1, N1, Z0>; | ||||
|     /// exposure (x- and gamma-rays) | ||||
|     pub type CoulombPerKilogram<T>          = SiUnit<T, P1, Z0, N1, P1, Z0, Z0, Z0>; | ||||
|     /// absorbed dose rate | ||||
|     pub type GrayPerSecond<T>               = SiUnit<T, N3, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
|     /// radiant intensity | ||||
|     pub type WattPerSteradian<T>            = SiUnit<T, N3, P2, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// radiance | ||||
|     pub type WattPerSquareMeterSteradian<T> = SiUnit<T, N3, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
|     /// catalytic activity concentration | ||||
|     pub type KatalPerCubicMeter<T>          = SiUnit<T, N1, N3, Z0, Z0, Z0, P1, Z0>; | ||||
| } | ||||
| pub use aliases::*; | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use super::*; | ||||
|  | ||||
|     #[test] | ||||
|     fn debug() { | ||||
|         let m = Meter::new(2); | ||||
|         assert_eq!(format!("{m:?}"), "SiUnit { value: 2, _s: PhantomData<typenum::int::Z0>, _m: PhantomData<typenum::int::PInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>>>, _kg: PhantomData<typenum::int::Z0>, _a: PhantomData<typenum::int::Z0>, _k: PhantomData<typenum::int::Z0>, _mol: PhantomData<typenum::int::Z0>, _cd: PhantomData<typenum::int::Z0> }".to_owned()); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn display() { | ||||
|         let unit = Unit::new(2); | ||||
|         let second = Second::new(2); | ||||
|         let meter = Meter::new(2); | ||||
|         let kilogram = Kilogram::new(2); | ||||
|         let ampere = Ampere::new(2); | ||||
|         let kelvin = Kelvin::new(2); | ||||
|         let mole = Mole::new(2); | ||||
|         let candela = Candela::new(2); | ||||
|         assert_eq!(unit.to_string(), "2"); | ||||
|         assert_eq!(second.to_string(), "2s"); | ||||
|         assert_eq!(meter.to_string(), "2m"); | ||||
|         assert_eq!(kilogram.to_string(), "2kg"); | ||||
|         assert_eq!(ampere.to_string(), "2A"); | ||||
|         assert_eq!(kelvin.to_string(), "2K"); | ||||
|         assert_eq!(mole.to_string(), "2mol"); | ||||
|         assert_eq!(candela.to_string(), "2cd"); | ||||
|         let square_second: SiUnit<i32, _, _, _, _, _, _, _> = second * second; | ||||
|         let square_meter: SiUnit<i32, _, _, _, _, _, _, _> = meter * meter; | ||||
|         let square_kilogram: SiUnit<i32, _, _, _, _, _, _, _> = kilogram * kilogram; | ||||
|         let square_ampere: SiUnit<i32, _, _, _, _, _, _, _> = ampere * ampere; | ||||
|         let square_kelvin: SiUnit<i32, _, _, _, _, _, _, _> = kelvin * kelvin; | ||||
|         let square_mole: SiUnit<i32, _, _, _, _, _, _, _> = mole * mole; | ||||
|         let square_candela: SiUnit<i32, _, _, _, _, _, _, _> = candela * candela; | ||||
|         assert_eq!(square_second.to_string(), "4s^2"); | ||||
|         assert_eq!(square_meter.to_string(), "4m^2"); | ||||
|         assert_eq!(square_kilogram.to_string(), "4kg^2"); | ||||
|         assert_eq!(square_ampere.to_string(), "4A^2"); | ||||
|         assert_eq!(square_kelvin.to_string(), "4K^2"); | ||||
|         assert_eq!(square_mole.to_string(), "4mol^2"); | ||||
|         assert_eq!(square_candela.to_string(), "4cd^2"); | ||||
|  | ||||
|         assert_eq!(Herz::new(2).to_string(), "2Hz"); | ||||
|         assert_eq!(Newton::new(2).to_string(), "2N"); | ||||
|         assert_eq!(Pascal::new(2).to_string(), "2Pa"); | ||||
|         assert_eq!(Joule::new(2).to_string(), "2J"); | ||||
|         assert_eq!(Watt::new(2).to_string(), "2W"); | ||||
|         assert_eq!(Coulomb::new(2).to_string(), "2C"); | ||||
|         assert_eq!(Volt::new(2).to_string(), "2V"); | ||||
|         assert_eq!(Farad::new(2).to_string(), "2F"); | ||||
|         assert_eq!(Ohm::new(2).to_string(), "2Ohm"); | ||||
|         assert_eq!(Siemens::new(2).to_string(), "2S"); | ||||
|         assert_eq!(Weber::new(2).to_string(), "2Wb"); | ||||
|         assert_eq!(Tesla::new(2).to_string(), "2T"); | ||||
|         assert_eq!(Henry::new(2).to_string(), "2H"); | ||||
|         assert_eq!(Lux::new(2).to_string(), "2lx"); | ||||
|         assert_eq!(Gray::new(2).to_string(), "2Gy|Sv"); | ||||
|         assert_eq!(Katal::new(2).to_string(), "2kat"); | ||||
|  | ||||
|         assert_eq!(MeterPerSecond::new(2).to_string(), "2m/s"); | ||||
|         assert_eq!(MeterPerSquareSecond::new(2).to_string(), "2m/s²"); | ||||
|         assert_eq!(KilogramPerCubicMeter::new(2).to_string(), "2kg/m³"); | ||||
|         assert_eq!(KilogramPerSquareMeter::new(2).to_string(), "2kg/m²"); | ||||
|         assert_eq!(CubicMeterPerKilogram::new(2).to_string(), "2m³/kg"); | ||||
|         assert_eq!(AmperePerSquareMeter::new(2).to_string(), "2A/m²"); | ||||
|         assert_eq!(AmperePerMeter::new(2).to_string(), "2A/m"); | ||||
|         assert_eq!(MolePerCubicMeter::new(2).to_string(), "2mol/m³"); | ||||
|  | ||||
|         assert_eq!(PascalSecond::new(2).to_string(), "2Pa*s"); | ||||
|         assert_eq!(NewtonPerMeter::new(2).to_string(), "2N/m"); | ||||
|         assert_eq!(WattPerSquareMeter::new(2).to_string(), "2W/m²"); | ||||
|         assert_eq!(JoulePerKelvin::new(2).to_string(), "2J/K"); | ||||
|         assert_eq!(JoulePerKilogramKelvin::new(2).to_string(), "2J/(kg*K)"); | ||||
|         assert_eq!(WattPerMeterKelvin::new(2).to_string(), "2W/(m*K)"); | ||||
|         assert_eq!(VoltPerMeter::new(2).to_string(), "2V/m"); | ||||
|         assert_eq!(CoulombPerCubicMeter::new(2).to_string(), "2C/m³"); | ||||
|         assert_eq!(CoulombPerSquareMeter::new(2).to_string(), "2C/m²"); | ||||
|         assert_eq!(FaradPerMeter::new(2).to_string(), "2F/m"); | ||||
|         assert_eq!(HenryPerMeter::new(2).to_string(), "2H/m"); | ||||
|         assert_eq!(JoulePerMole::new(2).to_string(), "2J/mol"); | ||||
|         assert_eq!(JoulePerMoleKelvin::new(2).to_string(), "2J/(mol*K)"); | ||||
|         assert_eq!(CoulombPerKilogram::new(2).to_string(), "2C/kg"); | ||||
|         assert_eq!(GrayPerSecond::new(2).to_string(), "2Gy/s"); | ||||
|         assert_eq!(KatalPerCubicMeter::new(2).to_string(), "2kat/m³"); | ||||
|     } | ||||
|     use super::types::*; | ||||
|     use num_traits::{Num, One, Zero}; | ||||
|  | ||||
|     #[test] | ||||
|     fn clone() { | ||||
|   | ||||
							
								
								
									
										137
									
								
								src/types.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								src/types.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| use crate::SiUnit; | ||||
| use typenum::consts::{N1, N2, N3, P1, P2, P3, P4, Z0}; | ||||
|  | ||||
| // Base units | ||||
| pub type Unit<T> = SiUnit<T, Z0, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// time | ||||
| pub type Second<T> = SiUnit<T, P1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// length | ||||
| pub type Meter<T> = SiUnit<T, Z0, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// mass | ||||
| pub type Kilogram<T> = SiUnit<T, Z0, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
| /// electric current | ||||
| pub type Ampere<T> = SiUnit<T, Z0, Z0, Z0, P1, Z0, Z0, Z0>; | ||||
| /// thermodynamic temperature | ||||
| pub type Kelvin<T> = SiUnit<T, Z0, Z0, Z0, Z0, P1, Z0, Z0>; | ||||
| /// amount of substance | ||||
| pub type Mole<T> = SiUnit<T, Z0, Z0, Z0, Z0, Z0, P1, Z0>; | ||||
| /// luminous intensity | ||||
| pub type Candela<T> = SiUnit<T, Z0, Z0, Z0, Z0, Z0, Z0, P1>; | ||||
|  | ||||
| // Derived units with special names | ||||
| /// plane angle | ||||
| pub type Radian<T> = Unit<T>; | ||||
| /// solid angle | ||||
| pub type Steradian<T> = Unit<T>; | ||||
| /// frequency | ||||
| pub type Herz<T> = SiUnit<T, N1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// force, weight | ||||
| pub type Newton<T> = SiUnit<T, N2, P1, P1, Z0, Z0, Z0, Z0>; | ||||
| /// pressure, stress | ||||
| pub type Pascal<T> = SiUnit<T, N2, N1, P1, Z0, Z0, Z0, Z0>; | ||||
| /// energy, work, heat | ||||
| pub type Joule<T> = SiUnit<T, N2, P2, P1, Z0, Z0, Z0, Z0>; | ||||
| /// power, radiant flux | ||||
| pub type Watt<T> = SiUnit<T, N3, P2, P1, Z0, Z0, Z0, Z0>; | ||||
| /// electric charge | ||||
| pub type Coulomb<T> = SiUnit<T, P1, Z0, Z0, P1, Z0, Z0, Z0>; | ||||
| /// electric potential, voltage, emf | ||||
| pub type Volt<T> = SiUnit<T, N3, P2, P1, N1, Z0, Z0, Z0>; | ||||
| /// capacitance | ||||
| pub type Farad<T> = SiUnit<T, P4, N2, N1, P2, Z0, Z0, Z0>; | ||||
| /// resistance impedance, reactance | ||||
| pub type Ohm<T> = SiUnit<T, N3, P2, P1, N2, Z0, Z0, Z0>; | ||||
| /// electrical conductance | ||||
| pub type Siemens<T> = SiUnit<T, P3, N2, N1, P2, Z0, Z0, Z0>; | ||||
| /// magnetic flux | ||||
| pub type Weber<T> = SiUnit<T, N2, P2, P1, N1, Z0, Z0, Z0>; | ||||
| /// magnetic flux density | ||||
| pub type Tesla<T> = SiUnit<T, N2, Z0, P1, N1, Z0, Z0, Z0>; | ||||
| /// inductance | ||||
| pub type Henry<T> = SiUnit<T, N2, P2, P1, N2, Z0, Z0, Z0>; | ||||
| /// luminous flux | ||||
| pub type Lumen<T> = Candela<T>; | ||||
| /// iluminance | ||||
| pub type Lux<T> = SiUnit<T, Z0, N2, Z0, Z0, Z0, Z0, P1>; | ||||
| /// activity referred to a radionuclide | ||||
| pub type Becquerel<T> = Herz<T>; | ||||
| /// absorbed dose | ||||
| pub type Gray<T> = SiUnit<T, N2, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// equivalent dose | ||||
| pub type Sievert<T> = Gray<T>; | ||||
| /// catalytic activity | ||||
| pub type Katal<T> = SiUnit<T, N1, Z0, Z0, Z0, Z0, P1, Z0>; | ||||
|  | ||||
| // Derived units without special names | ||||
| /// area | ||||
| pub type SquareMeter<T> = SiUnit<T, Z0, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// volume | ||||
| pub type CubicMeter<T> = SiUnit<T, Z0, P3, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// speed, velocity | ||||
| pub type MeterPerSecond<T> = SiUnit<T, N1, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// acceleration | ||||
| pub type MeterPerSquareSecond<T> = SiUnit<T, N2, P1, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// wavenumber, vergence | ||||
| pub type ReciprocalMeter<T> = SiUnit<T, Z0, N1, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// density, mass concentration | ||||
| pub type KilogramPerCubicMeter<T> = SiUnit<T, Z0, N3, P1, Z0, Z0, Z0, Z0>; | ||||
| /// surface density | ||||
| pub type KilogramPerSquareMeter<T> = SiUnit<T, Z0, N2, P1, Z0, Z0, Z0, Z0>; | ||||
| /// specific density | ||||
| pub type CubicMeterPerKilogram<T> = SiUnit<T, Z0, P3, N1, Z0, Z0, Z0, Z0>; | ||||
| /// current density | ||||
| pub type AmperePerSquareMeter<T> = SiUnit<T, Z0, N2, Z0, P1, Z0, Z0, Z0>; | ||||
| /// magnetic field strength | ||||
| pub type AmperePerMeter<T> = SiUnit<T, Z0, N1, Z0, P1, Z0, Z0, Z0>; | ||||
| /// concentration | ||||
| pub type MolePerCubicMeter<T> = SiUnit<T, Z0, N3, Z0, Z0, Z0, P1, Z0>; | ||||
| /// luminance | ||||
| pub type CandelaPerSquareMeter<T> = SiUnit<T, Z0, N2, Z0, Z0, Z0, Z0, P1>; | ||||
|  | ||||
| // Derived units including special names | ||||
| /// dynamic viscosity | ||||
| pub type PascalSecond<T> = SiUnit<T, N1, N1, P1, Z0, Z0, Z0, Z0>; | ||||
| /// moment of force | ||||
| pub type NewtonMeter<T> = SiUnit<T, N2, P2, P1, Z0, Z0, Z0, Z0>; | ||||
| /// surface tension | ||||
| pub type NewtonPerMeter<T> = SiUnit<T, N2, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
| /// angular velocity, angular frequency | ||||
| pub type RadianPerSecond<T> = SiUnit<T, N1, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// angular acceleration | ||||
| pub type RadianPerSquareSecond<T> = SiUnit<T, N2, Z0, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// heat flux density, irradiance | ||||
| pub type WattPerSquareMeter<T> = SiUnit<T, N3, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
| /// entropy, heat capacity | ||||
| pub type JoulePerKelvin<T> = SiUnit<T, N2, P2, P1, Z0, N1, Z0, Z0>; | ||||
| /// specific heat capacity, specific entropy | ||||
| pub type JoulePerKilogramKelvin<T> = SiUnit<T, N2, P2, Z0, Z0, N1, Z0, Z0>; | ||||
| /// specific energy | ||||
| pub type JoulePerKilogram<T> = SiUnit<T, N2, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// themal conductivity | ||||
| pub type WattPerMeterKelvin<T> = SiUnit<T, N3, P1, P1, Z0, N1, Z0, Z0>; | ||||
| /// energy density | ||||
| pub type JoulePerCubicMeter<T> = SiUnit<T, N2, N1, P1, Z0, Z0, Z0, Z0>; | ||||
| /// electric field strength | ||||
| pub type VoltPerMeter<T> = SiUnit<T, N3, P1, P1, N1, Z0, Z0, Z0>; | ||||
| /// electric charge density | ||||
| pub type CoulombPerCubicMeter<T> = SiUnit<T, P1, N3, Z0, P1, Z0, Z0, Z0>; | ||||
| /// surface charge density, electirc flusx density, electric displacement | ||||
| pub type CoulombPerSquareMeter<T> = SiUnit<T, P1, N2, Z0, P1, Z0, Z0, Z0>; | ||||
| /// permittivity | ||||
| pub type FaradPerMeter<T> = SiUnit<T, P4, N3, N1, P2, Z0, Z0, Z0>; | ||||
| /// permeability | ||||
| pub type HenryPerMeter<T> = SiUnit<T, N2, P1, P1, N2, Z0, Z0, Z0>; | ||||
| /// molar energy | ||||
| pub type JoulePerMole<T> = SiUnit<T, N2, P2, P1, Z0, Z0, N1, Z0>; | ||||
| /// molar entropy, molar heat capacity | ||||
| pub type JoulePerMoleKelvin<T> = SiUnit<T, N2, P2, P1, Z0, N1, N1, Z0>; | ||||
| /// exposure (x- and gamma-rays) | ||||
| pub type CoulombPerKilogram<T> = SiUnit<T, P1, Z0, N1, P1, Z0, Z0, Z0>; | ||||
| /// absorbed dose rate | ||||
| pub type GrayPerSecond<T> = SiUnit<T, N3, P2, Z0, Z0, Z0, Z0, Z0>; | ||||
| /// radiant intensity | ||||
| pub type WattPerSteradian<T> = SiUnit<T, N3, P2, P1, Z0, Z0, Z0, Z0>; | ||||
| /// radiance | ||||
| pub type WattPerSquareMeterSteradian<T> = SiUnit<T, N3, Z0, P1, Z0, Z0, Z0, Z0>; | ||||
| /// catalytic activity concentration | ||||
| pub type KatalPerCubicMeter<T> = SiUnit<T, N1, N3, Z0, Z0, Z0, P1, Z0>; | ||||
		Reference in New Issue
	
	Block a user