Added more units

This commit is contained in:
2023-04-13 20:11:20 -07:00
parent ce2217e7f9
commit b2a809ea8b
8 changed files with 245 additions and 85 deletions

View File

@ -64,7 +64,7 @@ pub(in crate::parser) fn find_subs(
//"upsilon" => {Some("υ")},
"phi" => {Some("φ")},
"chi" => {Some("χ")},
"psi" => {Some("ψ")},
//"psi" => {Some("ψ")}, Conflict with pound / square inch
"omega" => {Some("ω")},
_ => {None}
};

View File

@ -25,25 +25,20 @@ pub struct RationalBase where {
pub val: Rational
}
/*
fn to_string_radix(&self, radix: i32, num_digits: Option<usize>) -> String {
self.to_float().to_string_radix(radix, num_digits)
}
fn to_sign_string_exp(&self, radix: i32, num_digits: Option<usize>) -> (bool, String, Option<i32>) {
self.to_float().to_sign_string_exp(radix, num_digits)
}
*/
impl ToString for RationalBase{
fn to_string(&self) -> String {
return self.val.to_string();
}
}
impl RationalBase {
pub fn from_frac(t: i64, b: i64) -> Option<RationalBase> {
let v = Rational::from((t, b));
return Some(RationalBase{ val: v });
}
}
impl ScalarBase for RationalBase {
fn from_f64(f: f64) -> Option<RationalBase> {
let v = Rational::from_f64(f);
if v.is_none() { return None }

View File

@ -116,6 +116,12 @@ impl Scalar {
return Some(wrap_rational!(r.unwrap()));
}
pub fn new_rational_from_frac(t: i64, b: i64) -> Option<Self> {
let r = RationalBase::from_frac(t, b);
if r.is_none() { return None; }
return Some(wrap_rational!(r.unwrap()));
}
pub fn new_float_from_string(s: &str) -> Option<Self> {
let v = FloatBase::from_string(s);
if v.is_none() { return None; }

View File

@ -60,6 +60,24 @@ macro_rules! unpack_base_factor {
])
})
};
(
$unit:expr,
$display_string:expr,
rational_frac,
($t:expr, $b:expr),
$( ($u:expr, $p:expr) ),*
) => {
Some(Quantity {
scalar: Scalar::new_rational_from_frac($t, $b).unwrap(),
unit: Unit::from_array(&[
$(
(FreeUnit::from_base($u), Scalar::new_rational($p).unwrap()),
)*
(FreeUnit::from_base($unit), Scalar::new_rational(-1f64).unwrap())
])
})
};
}

View File

@ -29,8 +29,10 @@ pub enum UnitBase {
Point, // pt, typesetting unit
Inch,
Foot,
Mile,
Yard,
Furlong,
Mile,
AstronomicalUnit,
// Time units
Minute,
@ -39,6 +41,19 @@ pub enum UnitBase {
Week,
Month,
Fortnight,
GregorianYear,
JulianYear,
// Pressure
Pascal,
Atmosphere,
Bar,
Barye,
Psi,
MillimeterMercury,
Torr,
MeterSeaWater,
FootSeaWater
}
@ -64,46 +79,12 @@ macro_rules! fromstring_db {
(UnitBase::Ampere, "amperes"),
(UnitBase::Gram, "gram"),
(UnitBase::Gram, "grams"),
(UnitBase::Gram, "gramme"),
(UnitBase::Gram, "grammes"),
(UnitBase::Kelvin, "kelvin"),
(UnitBase::Mole, "mole"),
(UnitBase::Candela, "candela"),
// Length
(UnitBase::Angstrom, "angstrom"),
(UnitBase::Angstrom, "Å"),
(UnitBase::Thou, "thou"),
(UnitBase::Point, "pt"),
(UnitBase::Point, "point"),
(UnitBase::Inch, "in"),
(UnitBase::Inch, "inch"),
(UnitBase::Foot, "ft"),
(UnitBase::Foot, "foot"),
(UnitBase::Foot, "feet"),
(UnitBase::Mile, "mi"),
(UnitBase::Mile, "mile"),
(UnitBase::Mile, "miles"),
// Time
(UnitBase::Second, "sec"),
(UnitBase::Second, "second"),
(UnitBase::Second, "seconds"),
(UnitBase::Minute, "min"),
(UnitBase::Minute, "minute"),
(UnitBase::Minute, "minutes"),
(UnitBase::Hour, "h"),
(UnitBase::Hour, "hour"),
(UnitBase::Hour, "hours"),
(UnitBase::Day, "d"),
(UnitBase::Day, "day"),
(UnitBase::Day, "days"),
(UnitBase::Week, "w"),
(UnitBase::Week, "week"),
(UnitBase::Week, "weeks"),
(UnitBase::Month, "month"),
(UnitBase::Month, "months"),
(UnitBase::Fortnight, "fortnight"),
(UnitBase::Fortnight, "fortnights"),
(UnitBase::Meter, "m",
("Q","R","Y","Z","E","P","T","G","M","k","h","da","d","c","m","u","n","p","f","a","z","y","r","q")
),
@ -130,6 +111,77 @@ macro_rules! fromstring_db {
(UnitBase::Candela, "cd",
("Q","R","Y","Z","E","P","T","G","M","k","h","da","d","c","m","u","n","p","f","a","z","y","r","q")
),
// Length
(UnitBase::Angstrom, "angstrom"),
(UnitBase::Angstrom, "Å"),
(UnitBase::Thou, "thou"),
(UnitBase::Point, "pt"),
(UnitBase::Point, "point"),
(UnitBase::Inch, "in"),
(UnitBase::Inch, "inch"),
(UnitBase::Foot, "ft"),
(UnitBase::Foot, "foot"),
(UnitBase::Foot, "feet"),
(UnitBase::Yard, "yard"),
(UnitBase::Yard, "yd"),
(UnitBase::Yard, "yards"),
(UnitBase::Mile, "mi"),
(UnitBase::Mile, "mile"),
(UnitBase::Mile, "miles"),
(UnitBase::AstronomicalUnit, "au"),
(UnitBase::AstronomicalUnit, "AU"),
(UnitBase::AstronomicalUnit, "astronomicalUnit"),
(UnitBase::AstronomicalUnit, "astronomicalUnits"),
// Time
(UnitBase::Second, "sec"),
(UnitBase::Second, "second"),
(UnitBase::Second, "seconds"),
(UnitBase::Minute, "min"),
(UnitBase::Minute, "minute"),
(UnitBase::Minute, "minutes"),
(UnitBase::Hour, "h"),
(UnitBase::Hour, "hour"),
(UnitBase::Hour, "hours"),
(UnitBase::Day, "d"),
(UnitBase::Day, "day"),
(UnitBase::Day, "days"),
(UnitBase::Week, "w"),
(UnitBase::Week, "week"),
(UnitBase::Week, "weeks"),
(UnitBase::Month, "month"),
(UnitBase::Month, "months"),
(UnitBase::Fortnight, "fortnight"),
(UnitBase::Fortnight, "fortnights"),
(UnitBase::GregorianYear, "year"),
(UnitBase::GregorianYear, "years"),
(UnitBase::JulianYear, "julianYear"),
(UnitBase::JulianYear, "julianYears"),
// Pressure
(UnitBase::Atmosphere, "atm"),
(UnitBase::Atmosphere, "atmosphere"),
(UnitBase::Atmosphere, "atmospheres"),
(UnitBase::Pascal, "pascal"),
(UnitBase::Barye, "Ba"),
(UnitBase::Psi, "psi"),
(UnitBase::MillimeterMercury, "mmhg"),
(UnitBase::MillimeterMercury, "mmHg"),
(UnitBase::Torr, "torr"),
(UnitBase::Torr, "Torr"),
(UnitBase::MeterSeaWater, "msw"),
(UnitBase::FootSeaWater, "fsw"),
(UnitBase::MeterSeaWater, "MSW"),
(UnitBase::FootSeaWater, "FSW"),
(UnitBase::Pascal, "Pa",
("Q","R","Y","Z","E","P","T","G","M","k","h","da","d","c","m","u","n","p","f","a","z","y","r","q")
),
(UnitBase::Bar, "bar",
("Q","R","Y","Z","E","P","T","G","M","k","h","da","d","c","m","u","n","p","f","a","z","y","r","q")
)
)
}
@ -146,6 +198,9 @@ macro_rules! unit_db {
($a:expr, $X:ident) => {
match $a {
// Base
UnitBase::Second => $X!(
UnitBase::Second, // Repeat the name of this base unit
@ -182,6 +237,10 @@ macro_rules! unit_db {
),
// Time
UnitBase::Minute => $X!(
UnitBase::Minute, "min",
@ -231,6 +290,22 @@ macro_rules! unit_db {
(UnitBase::Second, 1f64)
),
UnitBase::GregorianYear => $X!(
UnitBase::GregorianYear, "year",
rational, "31557000",
(UnitBase::Second, 1f64)
),
UnitBase::JulianYear => $X!(
UnitBase::JulianYear, "julianYear",
rational, "31557600",
(UnitBase::Second, 1f64)
),
// Length
UnitBase::Angstrom => $X!(
UnitBase::Angstrom, "Å",
rational, "1e-10",
@ -239,39 +314,129 @@ macro_rules! unit_db {
UnitBase::Thou => $X!(
UnitBase::Thou, "thou",
float, "0.0000254",
rational, "0.0000254",
(UnitBase::Meter, 1f64)
),
UnitBase::Point => $X!(
UnitBase::Point, "pt",
float, "0.000352778",
rational, "0.0003514598",
(UnitBase::Meter, 1f64)
),
UnitBase::Inch => $X!(
UnitBase::Inch, "in",
float, "0.0254",
rational, "0.0254",
(UnitBase::Meter, 1f64)
),
UnitBase::Foot => $X!(
UnitBase::Foot, "ft",
float, "0.3048",
rational, "0.3048",
(UnitBase::Meter, 1f64)
),
UnitBase::Mile => $X!(
UnitBase::Mile, "mi",
float, "1609",
UnitBase::Yard => $X!(
UnitBase::Yard, "yd",
rational, "0.9144",
(UnitBase::Meter, 1f64)
),
UnitBase::Furlong => $X!(
UnitBase::Furlong, "furlong",
float, "201.168",
rational, "201.17",
(UnitBase::Meter, 1f64)
),
UnitBase::Mile => $X!(
UnitBase::Mile, "mi",
rational, "1609.344",
(UnitBase::Meter, 1f64)
),
UnitBase::AstronomicalUnit => $X!(
UnitBase::AstronomicalUnit, "AU",
rational, "149597870700",
(UnitBase::Meter, 1f64)
),
// Pressure
UnitBase::Pascal => $X!(
UnitBase::Pascal, "Pa",
rational, "1000",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::Bar => $X!(
UnitBase::Bar, "bar",
rational, "100000000",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::Barye => $X!(
UnitBase::Barye, "Ba",
rational, "100",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::Atmosphere => $X!(
UnitBase::Atmosphere, "atm",
rational, "101325000",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::Psi => $X!(
UnitBase::Psi, "psi",
rational, "6894757.2931783",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::MillimeterMercury => $X!(
UnitBase::MillimeterMercury, "mmHg",
rational, "133322.387415",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::Torr => $X!(
UnitBase::Torr, "torr",
rational_frac, (101325000, 760),
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::MeterSeaWater => $X!(
UnitBase::MeterSeaWater, "MSW",
rational, "10000000",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
UnitBase::FootSeaWater => $X!(
UnitBase::FootSeaWater, "FSW",
rational, "3064330",
(UnitBase::Gram, 1f64),
(UnitBase::Meter, -1f64),
(UnitBase::Second, -2f64)
),
}