#[cfg(feature = "std")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "std")]
#[non_exhaustive]
#[derive(
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
)]
pub struct Constant {
pub name: &'static str,
pub value: String,
}
#[cfg(feature = "std")]
#[derive(Clone, Serialize, Debug)]
pub struct Constants {
pub constants: Vec<Constant>,
}
#[cfg(feature = "std")]
impl Constants {
pub fn get_value(&self, name: &str) -> Option<ConstantValue> {
if let Some(constant) = self.constant(name) {
match name {
"HASH_COST" => {
constant.value.parse().map(ConstantValue::U32).ok()
}
"HASH_LENGTH" => constant
.value
.parse()
.map(ConstantValue::Usize)
.ok(),
_ => {
if let Ok(float_value) =
constant.value.parse::<f64>()
{
Some(ConstantValue::Float(float_value))
} else if let Some(char_array) =
Self::get_char_array(name)
{
Some(ConstantValue::CharArray(char_array))
} else {
Some(ConstantValue::String(
constant.value.clone(),
))
}
}
}
} else {
None
}
}
fn get_char_array(name: &str) -> Option<&'static [char]> {
match name {
"SPECIAL_CHARS" => Some(SPECIAL_CHARS),
_ => None,
}
}
pub fn constant(&self, name: &str) -> Option<Constant> {
self.constants
.iter()
.find(|constant| constant.name == name)
.cloned()
}
pub fn constants(&self) -> &[Constant] {
&self.constants
}
pub fn new() -> Self {
let mut constants = Vec::with_capacity(55);
constants.extend([
Constant {
name: "APERY",
value: APERY.to_string(),
},
Constant {
name: "AVOGADRO",
value: AVOGADRO.to_string(),
},
Constant {
name: "BOLTZMANN",
value: BOLTZMANN.to_string(),
},
Constant {
name: "CATALAN",
value: CATALAN.to_string(),
},
Constant {
name: "COULOMB",
value: COULOMB.to_string(),
},
Constant {
name: "EULER",
value: EULER.to_string(),
},
Constant {
name: "FARADAY",
value: FARADAY.to_string(),
},
Constant {
name: "GAMMA",
value: GAMMA.to_string(),
},
Constant {
name: "GAS_CONSTANT",
value: GAS_CONSTANT.to_string(),
},
Constant {
name: "GLAISHER_KINKELIN",
value: GLAISHER_KINKELIN.to_string(),
},
Constant {
name: "GRAVITATIONAL_CONSTANT",
value: GRAVITATIONAL_CONSTANT.to_string(),
},
Constant {
name: "HASH_ALGORITHM",
value: HASH_ALGORITHM.to_string(),
},
Constant {
name: "HASH_COST",
value: HASH_COST.to_string(),
},
Constant {
name: "HASH_LENGTH",
value: HASH_LENGTH.to_string(),
},
Constant {
name: "KHINCHIN",
value: KHINCHIN.to_string(),
},
Constant {
name: "PHI",
value: PHI.to_string(),
},
Constant {
name: "PI",
value: PI.to_string(),
},
Constant {
name: "PLANCK",
value: PLANCK.to_string(),
},
Constant {
name: "PLANCK_REDUCED",
value: PLANCK_REDUCED.to_string(),
},
Constant {
name: "SILVER_RATIO",
value: SILVER_RATIO.to_string(),
},
Constant {
name: "SPEED_OF_LIGHT",
value: SPEED_OF_LIGHT.to_string(),
},
Constant {
name: "SPECIAL_CHARS",
value: SPECIAL_CHARS.iter().collect::<String>(),
},
Constant {
name: "SQRT2",
value: SQRT2.to_string(),
},
Constant {
name: "SQRT3",
value: SQRT3.to_string(),
},
Constant {
name: "SQRT5",
value: SQRT5.to_string(),
},
Constant {
name: "TAU",
value: TAU.to_string(),
},
Constant {
name: "VACUUM_PERMEABILITY",
value: VACUUM_PERMEABILITY.to_string(),
},
Constant {
name: "VACUUM_PERMITTIVITY",
value: VACUUM_PERMITTIVITY.to_string(),
},
Constant {
name: "LN_2",
value: LN_2.to_string(),
},
Constant {
name: "LN_10",
value: LN_10.to_string(),
},
Constant {
name: "LOG2_E",
value: LOG2_E.to_string(),
},
Constant {
name: "LOG10_E",
value: LOG10_E.to_string(),
},
Constant {
name: "FRAC_1_SQRT_2",
value: FRAC_1_SQRT_2.to_string(),
},
Constant {
name: "FRAC_1_PI",
value: FRAC_1_PI.to_string(),
},
Constant {
name: "FRAC_2_PI",
value: FRAC_2_PI.to_string(),
},
Constant {
name: "FRAC_2_SQRT_PI",
value: FRAC_2_SQRT_PI.to_string(),
},
Constant {
name: "FRAC_PI_2",
value: FRAC_PI_2.to_string(),
},
Constant {
name: "FRAC_PI_3",
value: FRAC_PI_3.to_string(),
},
Constant {
name: "FRAC_PI_4",
value: FRAC_PI_4.to_string(),
},
Constant {
name: "FRAC_PI_6",
value: FRAC_PI_6.to_string(),
},
Constant {
name: "FRAC_PI_8",
value: FRAC_PI_8.to_string(),
},
Constant {
name: "ELEMENTARY_CHARGE",
value: ELEMENTARY_CHARGE.to_string(),
},
Constant {
name: "ELECTRON_MASS",
value: ELECTRON_MASS.to_string(),
},
Constant {
name: "PROTON_MASS",
value: PROTON_MASS.to_string(),
},
Constant {
name: "NEUTRON_MASS",
value: NEUTRON_MASS.to_string(),
},
Constant {
name: "STEFAN_BOLTZMANN",
value: STEFAN_BOLTZMANN.to_string(),
},
Constant {
name: "WIEN_DISPLACEMENT",
value: WIEN_DISPLACEMENT.to_string(),
},
Constant {
name: "STANDARD_GRAVITY",
value: STANDARD_GRAVITY.to_string(),
},
Constant {
name: "STANDARD_ATMOSPHERE",
value: STANDARD_ATMOSPHERE.to_string(),
},
Constant {
name: "ATOMIC_MASS_UNIT",
value: ATOMIC_MASS_UNIT.to_string(),
},
Constant {
name: "BOHR_RADIUS",
value: BOHR_RADIUS.to_string(),
},
Constant {
name: "FINE_STRUCTURE",
value: FINE_STRUCTURE.to_string(),
},
Constant {
name: "RYDBERG",
value: RYDBERG.to_string(),
},
Constant {
name: "MAGNETIC_FLUX_QUANTUM",
value: MAGNETIC_FLUX_QUANTUM.to_string(),
},
Constant {
name: "CONDUCTANCE_QUANTUM",
value: CONDUCTANCE_QUANTUM.to_string(),
},
]);
Self { constants }
}
pub fn is_valid(&self) -> bool {
self.constants().iter().all(|constant| {
!constant.name.is_empty() && !constant.value.is_empty()
})
}
}
#[cfg(feature = "std")]
impl Default for Constants {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "std")]
#[derive(Debug, Clone, Serialize)]
pub enum ConstantValue {
Float(f64),
String(String),
U32(u32),
Usize(usize),
CharArray(&'static [char]),
}
pub const CONSTANTS_TABLE: &[(&str, f64)] = &[
("APERY", APERY),
("AVOGADRO", AVOGADRO),
("BOLTZMANN", BOLTZMANN),
("CATALAN", CATALAN),
("COULOMB", COULOMB),
("EULER", EULER),
("FARADAY", FARADAY),
("GAMMA", GAMMA),
("GAS_CONSTANT", GAS_CONSTANT),
("GLAISHER_KINKELIN", GLAISHER_KINKELIN),
("GRAVITATIONAL_CONSTANT", GRAVITATIONAL_CONSTANT),
("KHINCHIN", KHINCHIN),
("PHI", PHI),
("PI", PI),
("PLANCK", PLANCK),
("PLANCK_REDUCED", PLANCK_REDUCED),
("SILVER_RATIO", SILVER_RATIO),
("SPEED_OF_LIGHT", SPEED_OF_LIGHT),
("SQRT2", SQRT2),
("SQRT3", SQRT3),
("SQRT5", SQRT5),
("TAU", TAU),
("VACUUM_PERMEABILITY", VACUUM_PERMEABILITY),
("VACUUM_PERMITTIVITY", VACUUM_PERMITTIVITY),
("LN_2", LN_2),
("LN_10", LN_10),
("LOG2_E", LOG2_E),
("LOG10_E", LOG10_E),
("FRAC_1_SQRT_2", FRAC_1_SQRT_2),
("FRAC_1_PI", FRAC_1_PI),
("FRAC_2_PI", FRAC_2_PI),
("FRAC_2_SQRT_PI", FRAC_2_SQRT_PI),
("FRAC_PI_2", FRAC_PI_2),
("FRAC_PI_3", FRAC_PI_3),
("FRAC_PI_4", FRAC_PI_4),
("FRAC_PI_6", FRAC_PI_6),
("FRAC_PI_8", FRAC_PI_8),
("ELEMENTARY_CHARGE", ELEMENTARY_CHARGE),
("ELECTRON_MASS", ELECTRON_MASS),
("PROTON_MASS", PROTON_MASS),
("NEUTRON_MASS", NEUTRON_MASS),
("STEFAN_BOLTZMANN", STEFAN_BOLTZMANN),
("WIEN_DISPLACEMENT", WIEN_DISPLACEMENT),
("STANDARD_GRAVITY", STANDARD_GRAVITY),
("STANDARD_ATMOSPHERE", STANDARD_ATMOSPHERE),
("ATOMIC_MASS_UNIT", ATOMIC_MASS_UNIT),
("BOHR_RADIUS", BOHR_RADIUS),
("FINE_STRUCTURE", FINE_STRUCTURE),
("RYDBERG", RYDBERG),
("MAGNETIC_FLUX_QUANTUM", MAGNETIC_FLUX_QUANTUM),
("CONDUCTANCE_QUANTUM", CONDUCTANCE_QUANTUM),
];
pub const APERY: f64 = 1.2020569031595942;
pub const AVOGADRO: f64 = 6.02214076e23;
pub const BOLTZMANN: f64 = 1.380_649e-23;
pub const CATALAN: f64 = 0.915_965_594_177_219;
pub const COULOMB: f64 = 8.9875517923e9;
pub const COULOMB_UNCERTAINTY: f64 = 0.0;
pub const EULER: f64 = core::f64::consts::E;
pub const FARADAY: f64 = 96485.33212;
pub const GAMMA: f64 = 0.5772156649015329;
pub const GAS_CONSTANT: f64 = 8.314462618;
pub const GLAISHER_KINKELIN: f64 = 1.2824271291006226;
pub const GRAVITATIONAL_CONSTANT: f64 = 6.67430e-11;
pub const GRAVITATIONAL_CONSTANT_UNCERTAINTY: f64 = 0.00015e-11;
pub const HASH_ALGORITHM: &str = "Blake3";
pub const HASH_COST: u32 = 8;
pub const HASH_LENGTH: usize = 32;
pub const KHINCHIN: f64 = 2.6854520010653064;
pub const PHI: f64 = (1.0 + SQRT5) / 2.0;
pub const PI: f64 = core::f64::consts::PI;
pub const PLANCK: f64 = 6.62607015e-34;
pub const PLANCK_REDUCED: f64 = PLANCK / (2.0 * PI);
pub const SILVER_RATIO: f64 = 1.0 + SQRT2;
pub const SPEED_OF_LIGHT: f64 = 299792458.0;
pub const SPECIAL_CHARS: &[char] = &[
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=',
'[', ']', '{', '}', '|', ';', ':', '"', '<', '>', ',', '.', '?',
'/', '~', '`',
];
pub const SQRT2: f64 = core::f64::consts::SQRT_2;
pub const SQRT3: f64 = 1.7320508075688772;
pub const SQRT5: f64 = 2.236_067_977_499_79;
pub const TAU: f64 = core::f64::consts::TAU;
pub const VACUUM_PERMEABILITY: f64 = 1.25663706212e-6;
pub const VACUUM_PERMEABILITY_UNCERTAINTY: f64 = 0.00000000019e-6;
pub const VACUUM_PERMITTIVITY: f64 = 8.8541878128e-12;
pub const VACUUM_PERMITTIVITY_UNCERTAINTY: f64 = 0.0000000013e-12;
pub const LN_2: f64 = core::f64::consts::LN_2;
pub const LN_10: f64 = core::f64::consts::LN_10;
pub const LOG2_E: f64 = core::f64::consts::LOG2_E;
pub const LOG10_E: f64 = core::f64::consts::LOG10_E;
pub const FRAC_1_SQRT_2: f64 = core::f64::consts::FRAC_1_SQRT_2;
pub const FRAC_1_PI: f64 = core::f64::consts::FRAC_1_PI;
pub const FRAC_2_PI: f64 = core::f64::consts::FRAC_2_PI;
pub const FRAC_2_SQRT_PI: f64 = core::f64::consts::FRAC_2_SQRT_PI;
pub const FRAC_PI_2: f64 = core::f64::consts::FRAC_PI_2;
pub const FRAC_PI_3: f64 = core::f64::consts::FRAC_PI_3;
pub const FRAC_PI_4: f64 = core::f64::consts::FRAC_PI_4;
pub const FRAC_PI_6: f64 = core::f64::consts::FRAC_PI_6;
pub const FRAC_PI_8: f64 = core::f64::consts::FRAC_PI_8;
pub const ELEMENTARY_CHARGE: f64 = 1.602_176_634e-19;
pub const ELECTRON_MASS: f64 = 9.109_383_701_5e-31;
pub const ELECTRON_MASS_UNCERTAINTY: f64 = 0.000_000_002_8e-31;
pub const PROTON_MASS: f64 = 1.672_621_923_69e-27;
pub const PROTON_MASS_UNCERTAINTY: f64 = 0.000_000_000_51e-27;
pub const NEUTRON_MASS: f64 = 1.674_927_498_04e-27;
pub const NEUTRON_MASS_UNCERTAINTY: f64 = 0.000_000_000_95e-27;
pub const STEFAN_BOLTZMANN: f64 = 5.670_374_419e-8;
pub const WIEN_DISPLACEMENT: f64 = 2.897_771_955e-3;
pub const WIEN_DISPLACEMENT_UNCERTAINTY: f64 = 0.000_000_013e-3;
pub const STANDARD_GRAVITY: f64 = 9.806_65;
pub const STANDARD_ATMOSPHERE: f64 = 101_325.0;
pub const ATOMIC_MASS_UNIT: f64 = 1.660_539_066_60e-27;
pub const ATOMIC_MASS_UNIT_UNCERTAINTY: f64 = 0.000_000_000_50e-27;
pub const BOHR_RADIUS: f64 = 5.291_772_109_03e-11;
pub const BOHR_RADIUS_UNCERTAINTY: f64 = 0.000_000_000_80e-11;
pub const FINE_STRUCTURE: f64 = 7.297_352_569_3e-3;
pub const FINE_STRUCTURE_UNCERTAINTY: f64 = 0.000_000_001_1e-3;
pub const RYDBERG: f64 = 10_973_731.568_160;
pub const RYDBERG_UNCERTAINTY: f64 = 0.000_021;
pub const MAGNETIC_FLUX_QUANTUM: f64 = 2.067_833_848e-15;
pub const CONDUCTANCE_QUANTUM: f64 = 7.748_091_729e-5;