use util::*;
const TABLE: &[u8] = &DIGIT_TO_BASE10_SQUARED;
macro_rules! cltz {
($value:ident) => {
$value.leading_zeros().as_usize()
};
}
macro_rules! calculate_offset {
($value:ident, $digits:ident, $max_digits:expr, $size:expr) => ({
let value = $value | 1;
let log2 = $size - cltz!(value);
let digits = (log2 * 1233) >> 12;
let mut offset = $max_digits - digits - 1;
debug_assert!(offset < $digits.len());
if digits != 0 && unchecked_index!($digits[offset]) == b'0' {
offset += 1;
}
offset
});
}
macro_rules! sequential_index {
($v0:ident, $v1:ident) => (($v0 * 2 - $v1 * 200).as_usize());
}
macro_rules! last_index {
($value:ident) => ((2 * $value).as_usize());
}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_1(value: u32, buffer: &mut [u8]) {
unchecked_index_mut!(buffer[0] = digit_to_char(value));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_2(value: u32, buffer: &mut [u8]) {
let i_0 = last_index!(value);
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_0+0]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_3(value: u32, buffer: &mut [u8]) {
let v_0 = value;
let v_1 = v_0 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = last_index!(v_1);
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_1+1]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_4(value: u32, buffer: &mut [u8]) {
let v_0 = value;
let v_1 = v_0 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = last_index!(v_1);
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_1+0]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_5(value: u32, buffer: &mut [u8]) {
let v_0 = value;
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = last_index!(v_2);
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_2+1]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_10(value: u32, buffer: &mut [u8]) {
let t0 = value / 100000000;
let v_0 = value.wrapping_sub(t0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t0;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = last_index!(v_4);
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_4+0]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_15(value: u64, buffer: &mut [u8]) {
let t_0 = (value / 100000000).as_u32();
let v_0 = value.as_u32().wrapping_sub(t_0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t_0;
let v_5 = v_4 / 100;
let v_6 = v_5 / 100;
let v_7 = v_6 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = sequential_index!(v_4, v_5);
let i_5 = sequential_index!(v_5, v_6);
let i_6 = sequential_index!(v_6, v_7);
let i_7 = last_index!(v_7);
unchecked_index_mut!(buffer[14] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[13] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[12] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[11] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[10] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_4+0]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_5+1]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_5+0]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_6+1]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_6+0]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_7+1]));
}}
perftools_inline!{
#[cfg(has_i128)]
#[allow(unused_unsafe)]
fn write_19(value: u64, buffer: &mut [u8]) {
let t_0 = (value / 100000000).as_u32();
let t_1 = (value / 10000000000000000).as_u32();
let v_0 = value.as_u32().wrapping_sub(t_0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t_0.wrapping_sub(t_1.wrapping_mul(100000000));
let v_5 = v_4 / 100;
let v_6 = v_5 / 100;
let v_7 = v_6 / 100;
let v_8 = t_1;
let v_9 = v_8 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = sequential_index!(v_4, v_5);
let i_5 = sequential_index!(v_5, v_6);
let i_6 = sequential_index!(v_6, v_7);
let i_7 = last_index!(v_7);
let i_8 = sequential_index!(v_8, v_9);
let i_9 = last_index!(v_9);
unchecked_index_mut!(buffer[18] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[17] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[16] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[15] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[14] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[13] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[12] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[11] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[10] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_4+0]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_5+1]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_5+0]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_6+1]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_6+0]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_7+1]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_7+0]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_8+1]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_8+0]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_9+1]));
}}
perftools_inline!{
#[allow(unused_unsafe)]
fn write_20(value: u64, buffer: &mut [u8]) {
let t_0 = (value / 100000000).as_u32();
let t_1 = (value / 10000000000000000).as_u32();
let v_0 = value.as_u32().wrapping_sub(t_0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t_0.wrapping_sub(t_1.wrapping_mul(100000000));
let v_5 = v_4 / 100;
let v_6 = v_5 / 100;
let v_7 = v_6 / 100;
let v_8 = t_1;
let v_9 = v_8 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = sequential_index!(v_4, v_5);
let i_5 = sequential_index!(v_5, v_6);
let i_6 = sequential_index!(v_6, v_7);
let i_7 = last_index!(v_7);
let i_8 = sequential_index!(v_8, v_9);
let i_9 = last_index!(v_9);
unchecked_index_mut!(buffer[19] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[18] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[17] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[16] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[15] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[14] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[13] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[12] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[11] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[10] = unchecked_index!(TABLE[i_4+0]));
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_5+1]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_5+0]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_6+1]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_6+0]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_7+1]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_7+0]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_8+1]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_8+0]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_9+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_9+0]));
}}
perftools_inline!{
#[cfg(has_i128)]
#[allow(unused_unsafe)]
fn write_25(value: u128, buffer: &mut [u8]) {
let (high, low) = u128_divrem_1e19(value);
write_19(low, &mut unchecked_index_mut!(buffer[6..]));
let value = high.as_u64();
let v_0 = value.as_u32();
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = last_index!(v_2);
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_2+0]));
}}
perftools_inline!{
#[cfg(has_i128)]
#[allow(unused_unsafe)]
fn write_29(value: u128, buffer: &mut [u8]) {
let (high, low) = u128_divrem_1e19(value);
write_19(low, &mut unchecked_index_mut!(buffer[10..]));
let value = high.as_u64();
let t_0 = (value / 100000000).as_u32();
let v_0 = value.as_u32().wrapping_sub(t_0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t_0;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = last_index!(v_4);
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_4+0]));
}}
perftools_inline!{
#[cfg(has_i128)]
#[allow(unused_unsafe)]
fn write_34(value: u128, buffer: &mut [u8]) {
let (high, low) = u128_divrem_1e19(value);
write_19(low, &mut unchecked_index_mut!(buffer[15..]));
let value = high.as_u64();
let t_0 = (value / 100000000).as_u32();
let v_0 = value.as_u32().wrapping_sub(t_0.wrapping_mul(100000000));
let v_1 = v_0 / 100;
let v_2 = v_1 / 100;
let v_3 = v_2 / 100;
let v_4 = t_0;
let v_5 = v_4 / 100;
let v_6 = v_5 / 100;
let v_7 = v_6 / 100;
let i_0 = sequential_index!(v_0, v_1);
let i_1 = sequential_index!(v_1, v_2);
let i_2 = sequential_index!(v_2, v_3);
let i_3 = last_index!(v_3);
let i_4 = sequential_index!(v_4, v_5);
let i_5 = sequential_index!(v_5, v_6);
let i_6 = sequential_index!(v_6, v_7);
let i_7 = last_index!(v_7);
unchecked_index_mut!(buffer[14] = unchecked_index!(TABLE[i_0+1]));
unchecked_index_mut!(buffer[13] = unchecked_index!(TABLE[i_0+0]));
unchecked_index_mut!(buffer[12] = unchecked_index!(TABLE[i_1+1]));
unchecked_index_mut!(buffer[11] = unchecked_index!(TABLE[i_1+0]));
unchecked_index_mut!(buffer[10] = unchecked_index!(TABLE[i_2+1]));
unchecked_index_mut!(buffer[9] = unchecked_index!(TABLE[i_2+0]));
unchecked_index_mut!(buffer[8] = unchecked_index!(TABLE[i_3+1]));
unchecked_index_mut!(buffer[7] = unchecked_index!(TABLE[i_3+0]));
unchecked_index_mut!(buffer[6] = unchecked_index!(TABLE[i_4+1]));
unchecked_index_mut!(buffer[5] = unchecked_index!(TABLE[i_4+0]));
unchecked_index_mut!(buffer[4] = unchecked_index!(TABLE[i_5+1]));
unchecked_index_mut!(buffer[3] = unchecked_index!(TABLE[i_5+0]));
unchecked_index_mut!(buffer[2] = unchecked_index!(TABLE[i_6+1]));
unchecked_index_mut!(buffer[1] = unchecked_index!(TABLE[i_6+0]));
unchecked_index_mut!(buffer[0] = unchecked_index!(TABLE[i_7+1]));
}}
perftools_inline!{
#[cfg(has_i128)]
#[allow(unused_unsafe)]
fn write_39(value: u128, buffer: &mut [u8]) {
let (high, low) = u128_divrem_1e19(value);
write_19(low, &mut unchecked_index_mut!(buffer[20..]));
let (high, mid) = u128_divrem_1e19(high);
write_19(mid, &mut unchecked_index_mut!(buffer[1..]));
unchecked_index_mut!(buffer[0] = digit_to_char(high));
}}
perftools_inline!{
fn write_1_3(value: u32, buffer: &mut [u8]) -> usize {
if value < 10 {
write_1(value, buffer);
1
} else if value < 100 {
write_2(value, buffer);
2
} else {
write_3(value, buffer);
3
}
}}
perftools_inline!{
fn write_1_5(value: u32, buffer: &mut [u8]) -> usize {
if value < 10 {
write_1(value, buffer);
1
} else if value < 100 {
write_2(value, buffer);
2
} else if value < 1000 {
write_3(value, buffer);
3
} else if value < 10000 {
write_4(value, buffer);
4
} else {
write_5(value, buffer);
5
}
}}
perftools_inline!{
fn write_5_10(value: u32, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 16] = [b'0'; 16];
let digits = &mut tmp_buf[..10];
write_10(value, digits);
let offset = calculate_offset!(value, digits, 10, 32);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
fn write_10_15(value: u64, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 32] = [b'0'; 32];
let digits = &mut tmp_buf[..15];
write_15(value, digits);
let offset = calculate_offset!(value, digits, 15, 64);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
fn write_15_20(value: u64, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 32] = [b'0'; 32];
let digits = &mut tmp_buf[..20];
write_20(value, digits);
let offset = calculate_offset!(value, digits, 20, 64);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
#[cfg(has_i128)]
fn write_20_25(value: u128, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 64] = [b'0'; 64];
let digits = &mut tmp_buf[..25];
write_25(value, digits);
let offset = calculate_offset!(value, digits, 25, 128);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
#[cfg(has_i128)]
fn write_25_29(value: u128, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 64] = [b'0'; 64];
let digits = &mut tmp_buf[..29];
write_29(value, digits);
let offset = calculate_offset!(value, digits, 29, 128);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
#[cfg(has_i128)]
fn write_29_34(value: u128, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 64] = [b'0'; 64];
let digits = &mut tmp_buf[..34];
write_34(value, digits);
let offset = calculate_offset!(value, digits, 34, 128);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
#[cfg(has_i128)]
fn write_34_39(value: u128, buffer: &mut [u8]) -> usize {
let mut tmp_buf: [u8; 64] = [b'0'; 64];
let digits = &mut tmp_buf[..39];
write_39(value, digits);
let offset = calculate_offset!(value, digits, 39, 128);
copy_to_dst(buffer, &unchecked_index!(digits[offset..]))
}}
perftools_inline!{
fn u8toa(value: u8, buffer: &mut [u8]) -> usize {
write_1_3(value.as_u32(), buffer)
}}
perftools_inline!{
fn u16toa(value: u16, buffer: &mut [u8]) -> usize {
write_1_5(value.as_u32(), buffer)
}}
perftools_inline!{
fn u32toa(value: u32, buffer: &mut [u8]) -> usize {
if value >> 16 == 0 {
write_1_5(value, buffer)
} else {
write_5_10(value, buffer)
}
}}
perftools_inline!{
fn u64toa(value: u64, buffer: &mut [u8]) -> usize {
if value >> 16 == 0 {
write_1_5(value.as_u32(), buffer)
} else if value >> 32 == 0 {
write_5_10(value.as_u32(), buffer)
} else if value >> 48 == 0 {
write_10_15(value, buffer)
} else {
write_15_20(value, buffer)
}
}}
perftools_inline!{
#[cfg(has_i128)]
fn u128toa(value: u128, buffer: &mut [u8]) -> usize {
if value >> 16 == 0 {
write_1_5(value.as_u32(), buffer)
} else if value >> 32 == 0 {
write_5_10(value.as_u32(), buffer)
} else if value >> 48 == 0 {
write_10_15(value.as_u64(), buffer)
} else if value >> 64 == 0 {
write_15_20(value.as_u64(), buffer)
} else if value >> 80 == 0 {
write_20_25(value, buffer)
} else if value >> 96 == 0 {
write_25_29(value, buffer)
} else if value >> 112 == 0 {
write_29_34(value, buffer)
} else {
write_34_39(value, buffer)
}
}}
cfg_if! {
if #[cfg(target_pointer_width = "16")] {
perftools_inline!{
fn usizetoa(value: usize, buffer: &mut [u8]) -> usize {
u16toa(value.as_u16(), buffer)
}}
} else if #[cfg(target_pointer_width = "32")] {
perftools_inline!{
fn usizetoa(value: usize, buffer: &mut [u8]) -> usize {
u32toa(value.as_u32(), buffer)
}}
} else if #[cfg(target_pointer_width = "64")] {
perftools_inline!{
fn usizetoa(value: usize, buffer: &mut [u8]) -> usize {
u64toa(value.as_u64(), buffer)
}}
}}
pub(crate) trait Decimal {
fn decimal(self, buffer: &mut [u8]) -> usize;
}
macro_rules! decimal_impl {
($t:ty, $cb:ident) => (
impl Decimal for $t {
perftools_inline_always!{
fn decimal(self, buffer: &mut [u8]) -> usize {
$cb(self, buffer)
}}
}
);
}
decimal_impl!(u8, u8toa);
decimal_impl!(u16, u16toa);
decimal_impl!(u32, u32toa);
decimal_impl!(u64, u64toa);
decimal_impl!(usize, usizetoa);
#[cfg(has_i128)]
decimal_impl!(u128, u128toa);