pub(crate) const INT_BUF: usize = 20;
pub(crate) fn fmt_u64(mut v: u64, out: &mut [u8; INT_BUF]) -> usize {
let mut i = INT_BUF;
loop {
i -= 1;
out[i] = b'0' + (v % 10) as u8;
v /= 10;
if v == 0 {
break;
}
}
let n = INT_BUF - i;
out.copy_within(i.., 0);
n
}
pub(crate) fn fmt_i64(v: i64, out: &mut [u8; INT_BUF]) -> usize {
let mut m = v.unsigned_abs(); let mut i = INT_BUF;
loop {
i -= 1;
out[i] = b'0' + (m % 10) as u8;
m /= 10;
if m == 0 {
break;
}
}
if v < 0 {
i -= 1;
out[i] = b'-';
}
let n = INT_BUF - i;
out.copy_within(i.., 0);
n
}
#[cfg(test)]
mod tests {
use super::*;
fn u64s(v: u64) -> String {
let mut out = [0u8; INT_BUF];
let n = fmt_u64(v, &mut out);
String::from_utf8(out[..n].to_vec()).unwrap()
}
fn i64s(v: i64) -> String {
let mut out = [0u8; INT_BUF];
let n = fmt_i64(v, &mut out);
String::from_utf8(out[..n].to_vec()).unwrap()
}
#[test]
fn integer_formatting() {
assert_eq!(u64s(0), "0");
assert_eq!(u64s(5432), "5432");
assert_eq!(u64s(u64::MAX), "18446744073709551615");
assert_eq!(i64s(0), "0");
assert_eq!(i64s(-1), "-1");
assert_eq!(i64s(i64::MAX), "9223372036854775807");
assert_eq!(i64s(i64::MIN), "-9223372036854775808");
}
}