macro_rules! encode {
($number:expr, $buf:expr) => {{
let mut n = $number;
let mut i = 0;
for b in $buf.iter_mut() {
*b = n as u8 | 0x80;
n >>= 7;
if n == 0 {
*b &= 0x7f;
break
}
i += 1
}
debug_assert_eq!(n, 0);
&$buf[0..=i]
}}
}
#[inline]
pub fn u8(number: u8, buf: &mut [u8; U8_LEN]) -> &[u8] {
encode!(number, buf)
}
#[inline]
pub fn u16(number: u16, buf: &mut [u8; U16_LEN]) -> &[u8] {
encode!(number, buf)
}
#[inline]
pub fn u32(number: u32, buf: &mut [u8; U32_LEN]) -> &[u8] {
encode!(number, buf)
}
#[inline]
pub fn u64(number: u64, buf: &mut [u8; U64_LEN]) -> &[u8] {
encode!(number, buf)
}
#[inline]
pub fn u128(number: u128, buf: &mut [u8; U128_LEN]) -> &[u8] {
encode!(number, buf)
}
#[inline]
#[cfg(target_pointer_width = "64")]
pub fn usize(number: usize, buf: &mut [u8; USIZE_LEN]) -> &[u8] {
u64(number as u64, buf)
}
#[inline]
#[cfg(target_pointer_width = "32")]
pub fn usize(number: usize, buf: &mut [u8; USIZE_LEN]) -> &[u8] {
u32(number as u32, buf)
}
#[inline]
pub fn u8_buffer() -> [u8; U8_LEN] {
[0; U8_LEN]
}
#[inline]
pub fn u16_buffer() -> [u8; U16_LEN] {
[0; U16_LEN]
}
#[inline]
pub fn u32_buffer() -> [u8; U32_LEN] {
[0; U32_LEN]
}
#[inline]
pub fn u64_buffer() -> [u8; U64_LEN] {
[0; U64_LEN]
}
#[inline]
pub fn u128_buffer() -> [u8; U128_LEN] {
[0; U128_LEN]
}
#[inline]
pub fn usize_buffer() -> [u8; USIZE_LEN] {
[0; USIZE_LEN]
}
const U8_LEN: usize = 2;
const U16_LEN: usize = 3;
const U32_LEN: usize = 5;
const U64_LEN: usize = 10;
const U128_LEN: usize = 19;
#[cfg(target_pointer_width = "64")]
const USIZE_LEN: usize = U64_LEN;
#[cfg(target_pointer_width = "32")]
const USIZE_LEN: usize = U32_LEN;