ryu/pretty/
exponent.rs

1use core::ptr;
2
3use digit_table::*;
4
5#[cfg_attr(feature = "no-panic", inline)]
6pub unsafe fn write_exponent3(mut k: isize, mut result: *mut u8) -> usize {
7    let sign = k < 0;
8    if sign {
9        *result = b'-';
10        result = result.offset(1);
11        k = -k;
12    }
13
14    debug_assert!(k < 1000);
15    if k >= 100 {
16        *result = b'0' + (k / 100) as u8;
17        k %= 100;
18        let d = DIGIT_TABLE.get_unchecked(k as usize * 2);
19        ptr::copy_nonoverlapping(d, result.offset(1), 2);
20        sign as usize + 3
21    } else if k >= 10 {
22        let d = DIGIT_TABLE.get_unchecked(k as usize * 2);
23        ptr::copy_nonoverlapping(d, result, 2);
24        sign as usize + 2
25    } else {
26        *result = b'0' + k as u8;
27        sign as usize + 1
28    }
29}
30
31#[cfg_attr(feature = "no-panic", inline)]
32pub unsafe fn write_exponent2(mut k: isize, mut result: *mut u8) -> usize {
33    let sign = k < 0;
34    if sign {
35        *result = b'-';
36        result = result.offset(1);
37        k = -k;
38    }
39
40    debug_assert!(k < 100);
41    if k >= 10 {
42        let d = DIGIT_TABLE.get_unchecked(k as usize * 2);
43        ptr::copy_nonoverlapping(d, result, 2);
44        sign as usize + 2
45    } else {
46        *result = b'0' + k as u8;
47        sign as usize + 1
48    }
49}