use crate::recognizer::{recognize, Value};
use crate::Rounding;
#[derive(Eq, PartialEq)]
pub enum Number {
Finite(
bool,
u64,
u64,
i32,
),
Infinite(
bool,
),
NaN(
bool,
bool,
),
}
pub fn number_from_string(input: &str) -> Number {
match recognize(input, 34, Rounding::ToNearest) {
Value::Finite(sign, value, exponent, _status) => Number::Finite(sign, (value >> 64) as u64, value as u64, exponent),
Value::Infinity(sign) => Number::Infinite(sign),
Value::NaN(sign, signaling) => Number::NaN(sign, signaling),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_eq() {
assert!((Number::Finite(false, 0, 0, 0) == Number::Finite(false, 0, 0, 0)));
assert!((Number::Finite(false, 0, 0, 0) != Number::Infinite(false)));
assert!((Number::Infinite(true) != Number::Infinite(false)));
assert!((Number::Infinite(true) == Number::Infinite(true)));
assert!((Number::NaN(true, true) != Number::NaN(false, false)));
assert!((Number::NaN(false, false) == Number::NaN(false, false)));
Number::Infinite(false).assert_receiver_is_total_eq();
}
}