#![cfg(not(feature = "compact"))] #![cfg(feature = "power-of-two")] mod util; use core::num::ParseIntError; #[cfg(feature = "radix")] use core::str::from_utf8_unchecked; use lexical_util::constants::BUFFER_SIZE; use lexical_write_integer::write::WriteInteger; use crate::util::from_radix; pub trait FromRadix: Sized { fn from_radix(src: &str, radix: u32) -> Result; } macro_rules! impl_from_radix { ($($t:ty)*) => ($(impl FromRadix for $t { #[inline] fn from_radix(src: &str, radix: u32) -> Result { <$t>::from_str_radix(src, radix) } })*) } impl_from_radix! { u32 u64 u128 } #[test] #[cfg(feature = "radix")] fn u128toa_test() { const FORMAT: u128 = from_radix(12); let mut buffer = [b'\x00'; BUFFER_SIZE]; let value = 136551478823710021067381144334863695872u128; let count = value.write_mantissa::(&mut buffer); unsafe { let y = u128::from_str_radix(from_utf8_unchecked(&buffer[..count]), 12); assert_eq!(y, Ok(value)); } } #[cfg(feature = "power-of-two")] fn write_integer(x: T, actual: &[u8]) { let mut buffer = [b'\x00'; BUFFER_SIZE]; let count = x.write_mantissa::(&mut buffer); assert_eq!(actual.len(), count); assert_eq!(actual, &buffer[..count]) } #[test] #[cfg(feature = "power-of-two")] fn binary_test() { // Binary const BINARY: u128 = from_radix(2); write_integer::<_, BINARY>(0u128, b"0"); write_integer::<_, BINARY>(1u128, b"1"); write_integer::<_, BINARY>(5u128, b"101"); write_integer::<_, BINARY>(170141183460469231731687303715884105727u128, b"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); // Hexadecimal const HEX: u128 = from_radix(16); write_integer::<_, HEX>( 170141183460469231731687303715884105727u128, b"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", ); } #[test] #[cfg(feature = "radix")] fn radix_test() { write_integer::(37u32, b"100101"); write_integer::(37u32, b"1101"); write_integer::(37u32, b"211"); write_integer::(37u32, b"122"); write_integer::(37u32, b"101"); write_integer::(37u32, b"52"); write_integer::(37u32, b"45"); write_integer::(37u32, b"41"); write_integer::(37u32, b"37"); write_integer::(37u32, b"34"); write_integer::(37u32, b"31"); write_integer::(37u32, b"2B"); write_integer::(37u32, b"29"); write_integer::(37u32, b"27"); write_integer::(37u32, b"25"); write_integer::(37u32, b"23"); write_integer::(37u32, b"21"); write_integer::(37u32, b"1I"); write_integer::(37u32, b"1H"); write_integer::(37u32, b"1G"); write_integer::(37u32, b"1F"); write_integer::(37u32, b"1E"); write_integer::(37u32, b"1D"); write_integer::(37u32, b"1C"); write_integer::(37u32, b"1B"); write_integer::(37u32, b"1A"); write_integer::(37u32, b"19"); write_integer::(37u32, b"18"); write_integer::(37u32, b"17"); write_integer::(37u32, b"16"); write_integer::(37u32, b"15"); write_integer::(37u32, b"14"); write_integer::(37u32, b"13"); write_integer::(37u32, b"12"); write_integer::(37u32, b"11"); } #[test] #[cfg(feature = "radix")] fn issue_169_tests() { let value = 213850084767170003246100602438595641344u128; write_integer::( value, b"3411233210434101044040414300210231141130323220441010334", ); }