Files
daisy/src/quantity/unit/prefix.rs
2023-06-13 21:18:00 -07:00

168 lines
3.2 KiB
Rust

use crate::quantity::Quantity;
#[derive(Hash)]
#[derive(Debug)]
#[derive(Copy, Clone)]
#[derive(Eq, PartialEq)]
pub enum Prefix {
None,
Quetta,
Ronna,
Yotta,
Zetta,
Exa,
Peta,
Tera,
Giga,
Mega,
Kilo,
Hecto,
Deka,
Deci,
Centi,
Milli,
Micro,
Nano,
Pico,
Femto,
Atto,
Zepto,
Yocto,
Ronto,
Quecto,
BinExa,
BinPeta,
BinTera,
BinGiga,
BinMega,
BinKilo
}
impl Prefix {
pub fn to_ratio(&self) -> Quantity {
let q = Quantity::new_rational_from_string(match self {
Prefix::Quetta => "1e30",
Prefix::Ronna => "1e27",
Prefix::Yotta => "1e24",
Prefix::Zetta => "1e21",
Prefix::Exa => "1e18",
Prefix::Peta => "1e15",
Prefix::Tera => "1e12",
Prefix::Giga => "1e9",
Prefix::Mega => "1e6",
Prefix::Kilo => "1e3",
Prefix::Hecto => "1e2",
Prefix::Deka => "1e1",
Prefix::Deci => "1e-1",
Prefix::Centi => "1e-2",
Prefix::Milli => "1e-3",
Prefix::Micro => "1e-6",
Prefix::Nano => "1e-9",
Prefix::Pico => "1e-12",
Prefix::Femto => "1e-15",
Prefix::Atto => "1e-18",
Prefix::Zepto => "1e-21",
Prefix::Yocto => "1e-24",
Prefix::Ronto => "1e-27",
Prefix::Quecto => "1e-30",
Prefix::BinExa => "1152921504606846976", // 2^60
Prefix::BinPeta => "1125899906842624", // 2^50
Prefix::BinTera => "1099511627776", // 2^40
Prefix::BinGiga => "1073741824", // 2^30
Prefix::BinMega => "1048576", // 2^20
Prefix::BinKilo => "1024", // 2^10
Prefix::None => { "1" }
}).unwrap();
return q;
}
}
macro_rules! str_to_prefix {
("") => {Prefix::None};
("Q") => {Prefix::Quetta};
("R") => {Prefix::Ronna};
("Y") => {Prefix::Yotta};
("Z") => {Prefix::Zetta};
("E") => {Prefix::Exa};
("P") => {Prefix::Peta};
("T") => {Prefix::Tera};
("G") => {Prefix::Giga};
("M") => {Prefix::Mega};
("k") => {Prefix::Kilo};
("h") => {Prefix::Hecto};
("da") => {Prefix::Deka};
("d") => {Prefix::Deci};
("c") => {Prefix::Centi};
("m") => {Prefix::Milli};
("u") => {Prefix::Micro};
("n") => {Prefix::Nano};
("p") => {Prefix::Pico};
("f") => {Prefix::Femto};
("a") => {Prefix::Atto};
("z") => {Prefix::Zepto};
("y") => {Prefix::Yocto};
("r") => {Prefix::Ronto};
("q") => {Prefix::Quecto};
("Ei") => {Prefix::BinExa};
("Pi") => {Prefix::BinPeta};
("Ti") => {Prefix::BinTera};
("Gi") => {Prefix::BinGiga};
("Mi") => {Prefix::BinMega};
("Ki") => {Prefix::BinKilo};
}
pub (super) use str_to_prefix;
impl ToString for Prefix {
fn to_string(&self) -> String {
String::from(match self {
Prefix::Quetta => "Q",
Prefix::Ronna => "R",
Prefix::Yotta => "Y",
Prefix::Zetta => "Z",
Prefix::Exa => "E",
Prefix::Peta => "P",
Prefix::Tera => "T",
Prefix::Giga => "G",
Prefix::Mega => "M",
Prefix::Kilo => "k",
Prefix::Hecto => "h",
Prefix::Deka => "da",
Prefix::Deci => "d",
Prefix::Centi => "c",
Prefix::Milli => "m",
Prefix::Micro => "u",
Prefix::Nano => "n",
Prefix::Pico => "p",
Prefix::Femto => "f",
Prefix::Atto => "a",
Prefix::Zepto => "z",
Prefix::Yocto => "y",
Prefix::Ronto => "r",
Prefix::Quecto => "q",
Prefix::BinExa => "Ei",
Prefix::BinPeta => "Pi",
Prefix::BinTera => "Ti",
Prefix::BinGiga => "Gi",
Prefix::BinMega => "Mi",
Prefix::BinKilo => "Ki",
Prefix::None => ""
})
}
}