pub static mut NAN_STRING: &str = "NaN";
pub static mut INF_STRING: &str = "inf";
pub static mut INFINITY_STRING: &str = "infinity";
pub static mut EXPONENT_DEFAULT_CHAR: u8 = b'e';
pub static mut EXPONENT_BACKUP_CHAR: u8 = b'^';
cfg_if! {
if #[cfg(feature = "radix")] {
pub const MAX_I8_SIZE: usize = 16;
pub const MAX_I16_SIZE: usize = 32;
pub const MAX_I32_SIZE: usize = 64;
pub const MAX_I64_SIZE: usize = 128;
pub const MAX_I128_SIZE: usize = 256;
pub const MAX_U8_SIZE: usize = 16;
pub const MAX_U16_SIZE: usize = 32;
pub const MAX_U32_SIZE: usize = 64;
pub const MAX_U64_SIZE: usize = 128;
pub const MAX_U128_SIZE: usize = 256;
pub const MAX_F32_SIZE: usize = 256;
pub const MAX_F64_SIZE: usize = 256;
} else {
pub const MAX_I8_SIZE: usize = 4;
pub const MAX_I16_SIZE: usize = 6;
pub const MAX_I32_SIZE: usize = 11;
pub const MAX_I64_SIZE: usize = 20;
pub const MAX_I128_SIZE: usize = 40;
pub const MAX_U8_SIZE: usize = 3;
pub const MAX_U16_SIZE: usize = 5;
pub const MAX_U32_SIZE: usize = 10;
pub const MAX_U64_SIZE: usize = 20;
pub const MAX_U128_SIZE: usize = 39;
pub const MAX_F32_SIZE: usize = 64;
pub const MAX_F64_SIZE: usize = 64;
}}
cfg_if! {
if #[cfg(target_pointer_width = "16")] {
pub const MAX_ISIZE_SIZE: usize = MAX_I16_SIZE;
pub const MAX_USIZE_SIZE: usize = MAX_U16_SIZE;
} else if #[cfg(target_pointer_width = "32")] {
pub const MAX_ISIZE_SIZE: usize = MAX_I32_SIZE;
pub const MAX_USIZE_SIZE: usize = MAX_U32_SIZE;
} else if #[cfg(target_pointer_width = "64")] {
pub const MAX_ISIZE_SIZE: usize = MAX_I64_SIZE;
pub const MAX_USIZE_SIZE: usize = MAX_U64_SIZE;
}}
pub const BUFFER_SIZE: usize = MAX_F64_SIZE;
pub(crate) extern "C" fn exponent_notation_char(radix: u32)
-> u8
{
unsafe {
if radix >= 15 { EXPONENT_BACKUP_CHAR } else { EXPONENT_DEFAULT_CHAR }
}
}
#[cfg(test)]
mod tests {
use atof::*;
use ftoa::*;
use util::*;
use util::test::*;
use super::*;
#[test]
fn exponent_notation_char_test() {
unsafe {
assert_eq!(exponent_notation_char(2), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(8), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(10), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(15), EXPONENT_BACKUP_CHAR);
assert_eq!(exponent_notation_char(16), EXPONENT_BACKUP_CHAR);
assert_eq!(exponent_notation_char(32), EXPONENT_BACKUP_CHAR);
}
}
#[test]
#[ignore]
fn special_bytes_test() {
let mut buffer = new_buffer();
assert!(try_atof32_slice(10, b"NaN").value.is_nan());
assert!(try_atof32_slice(10, b"nan").value.is_nan());
assert!(try_atof32_slice(10, b"NAN").value.is_nan());
assert!(try_atof32_slice(10, b"inf").value.is_infinite());
assert!(try_atof32_slice(10, b"INF").value.is_infinite());
assert!(try_atof32_slice(10, b"Infinity").value.is_infinite());
assert_eq!(f64toa_slice(f64::NAN, 10, &mut buffer), b"NaN");
assert_eq!(f64toa_slice(f64::INFINITY, 10, &mut buffer), b"inf");
unsafe {
NAN_STRING = "nan";
INF_STRING = "Infinity";
}
assert!(try_atof32_slice(10, b"inf").error.code == ErrorCode::InvalidDigit);
assert!(try_atof32_slice(10, b"Infinity").value.is_infinite());
assert_eq!(f64toa_slice(f64::NAN, 10, &mut buffer), b"nan");
assert_eq!(f64toa_slice(f64::INFINITY, 10, &mut buffer), b"Infinity");
unsafe {
NAN_STRING = "NaN";
INF_STRING = "inf";
}
}
}