48 lines
1.2 KiB
Rust
48 lines
1.2 KiB
Rust
use crate::digit_table::DIGIT_TABLE;
|
|
use core::ptr;
|
|
|
|
#[cfg_attr(feature = "no-panic", inline)]
|
|
pub unsafe fn write_exponent3(mut k: isize, mut result: *mut u8) -> usize {
|
|
let sign = k < 0;
|
|
if sign {
|
|
*result = b'-';
|
|
result = result.offset(1);
|
|
k = -k;
|
|
}
|
|
|
|
debug_assert!(k < 1000);
|
|
if k >= 100 {
|
|
*result = b'0' + (k / 100) as u8;
|
|
k %= 100;
|
|
let d = DIGIT_TABLE.as_ptr().offset(k * 2);
|
|
ptr::copy_nonoverlapping(d, result.offset(1), 2);
|
|
sign as usize + 3
|
|
} else if k >= 10 {
|
|
let d = DIGIT_TABLE.as_ptr().offset(k * 2);
|
|
ptr::copy_nonoverlapping(d, result, 2);
|
|
sign as usize + 2
|
|
} else {
|
|
*result = b'0' + k as u8;
|
|
sign as usize + 1
|
|
}
|
|
}
|
|
|
|
#[cfg_attr(feature = "no-panic", inline)]
|
|
pub unsafe fn write_exponent2(mut k: isize, mut result: *mut u8) -> usize {
|
|
let sign = k < 0;
|
|
if sign {
|
|
*result = b'-';
|
|
result = result.offset(1);
|
|
k = -k;
|
|
}
|
|
|
|
debug_assert!(k < 100);
|
|
if k >= 10 {
|
|
let d = DIGIT_TABLE.as_ptr().offset(k * 2);
|
|
ptr::copy_nonoverlapping(d, result, 2);
|
|
sign as usize + 2
|
|
} else {
|
|
*result = b'0' + k as u8;
|
|
sign as usize + 1
|
|
}
|
|
}
|