1 //! Ignore float-parsing data interface. 2 3 use crate::util::*; 4 use super::exponent::*; 5 use super::traits::*; 6 use super::trim::*; 7 use super::validate::*; 8 9 // Ignore data interface for fast float parsers. 10 // 11 // Guaranteed to parse `NumberFormat::ignore(digit_separator)`. 12 // 13 // The requirements: 14 // 1). Must contain significant digits. 15 data_interface!( 16 struct IgnoreFastDataInterface, 17 struct IgnoreSlowDataInterface, 18 fields => { 19 format: NumberFormat, 20 }, 21 integer_iter => (IteratorSeparator, iterate_digits_ignore_separator), 22 fraction_iter => (IteratorSeparator, iterate_digits_ignore_separator), 23 exponent_iter => (IteratorSeparator, iterate_digits_ignore_separator), 24 format => |this: &Self| this.format, 25 consume_integer_digits => consume_digits_ignore_separator, 26 consume_fraction_digits => consume_digits_ignore_separator, 27 extract_exponent => extract_exponent_ignore_separator, 28 validate_mantissa => validate_permissive_mantissa, 29 validate_exponent => validate_optional_exponent, 30 validate_exponent_fraction => validate_exponent_optional_fraction, 31 validate_exponent_sign => validate_optional_exponent_sign, 32 ltrim_zero => ltrim_zero_separator, 33 ltrim_separator => ltrim_separator_separator, 34 rtrim_zero => rtrim_zero_separator, 35 rtrim_separator => rtrim_separator_separator, 36 new => fn new(format: NumberFormat) -> Self { 37 Self { 38 format, 39 integer: &[], 40 fraction: None, 41 exponent: None, 42 raw_exponent: 0 43 } 44 } 45 ); 46 47 // TESTS 48 // ----- 49 50 #[cfg(test)] 51 mod tests { 52 use super::*; 53 54 macro_rules! ignore { 55 ($integer:expr, $fraction:expr, $exponent:expr, $raw_exponent:expr) => { 56 IgnoreFastDataInterface { 57 format: NumberFormat::ignore(b'_').unwrap(), 58 integer: $integer, 59 fraction: $fraction, 60 exponent: $exponent, 61 raw_exponent: $raw_exponent 62 } 63 }; 64 } 65 66 #[test] extract_test()67 fn extract_test() { 68 IgnoreFastDataInterface::new(NumberFormat::ignore(b'_').unwrap()).run_tests([ 69 // Valid 70 ("1.2345", Ok(ignore!(b"1", Some(b!("2345")), None, 0))), 71 ("12.345", Ok(ignore!(b"12", Some(b!("345")), None, 0))), 72 ("12345.6789", Ok(ignore!(b"12345", Some(b!("6789")), None, 0))), 73 ("1.2345e10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("10")), 10))), 74 ("1.2345e+10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("+10")), 10))), 75 ("1.2345e-10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("-10")), -10))), 76 ("100000000000000000000", Ok(ignore!(b"100000000000000000000", None, None, 0))), 77 ("100000000000000000001", Ok(ignore!(b"100000000000000000001", None, None, 0))), 78 ("179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791.9999999999999999999999999999999999999999999999999999999999999999999999", Ok(ignore!(b"179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791", Some(b!("9999999999999999999999999999999999999999999999999999999999999999999999")), None, 0))), 79 ("1009e-31", Ok(ignore!(b"1009", None, Some(b!("-31")), -31))), 80 ("001.0", Ok(ignore!(b"1", Some(b!("")), None, 0))), 81 ("1.", Ok(ignore!(b"1", Some(b!("")), None, 0))), 82 ("12.", Ok(ignore!(b"12", Some(b!("")), None, 0))), 83 ("1234567.", Ok(ignore!(b"1234567", Some(b!("")), None, 0))), 84 (".1", Ok(ignore!(b"", Some(b!("1")), None, 0))), 85 (".12", Ok(ignore!(b"", Some(b!("12")), None, 0))), 86 (".1234567", Ok(ignore!(b"", Some(b!("1234567")), None, 0))), 87 ("1.2345e", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("")), 0))), 88 (".3e", Ok(ignore!(b"", Some(b!("3")), Some(b!("")), 0))), 89 ("_1.2345_e_+_10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("_+_10")), 10))), 90 ("12__1_._23__45e+1__0_", Ok(ignore!(b"12__1_", Some(b!("_23__45")), Some(b!("+1__0_")), 10))), 91 92 // Invalid 93 ("", Err(ErrorCode::EmptyMantissa)), 94 ("+", Err(ErrorCode::EmptyMantissa)), 95 ("-", Err(ErrorCode::EmptyMantissa)), 96 (".", Err(ErrorCode::EmptyMantissa)), 97 ("+.", Err(ErrorCode::EmptyMantissa)), 98 ("-.", Err(ErrorCode::EmptyMantissa)), 99 ("e", Err(ErrorCode::EmptyMantissa)), 100 ("E", Err(ErrorCode::EmptyMantissa)), 101 ("e1", Err(ErrorCode::EmptyMantissa)), 102 ("e+1", Err(ErrorCode::EmptyMantissa)), 103 ("e-1", Err(ErrorCode::EmptyMantissa)), 104 (".e", Err(ErrorCode::EmptyMantissa)), 105 (".E", Err(ErrorCode::EmptyMantissa)), 106 (".e1", Err(ErrorCode::EmptyMantissa)), 107 (".e+1", Err(ErrorCode::EmptyMantissa)), 108 (".e-1", Err(ErrorCode::EmptyMantissa)), 109 ].iter()); 110 } 111 } 112