#![cfg(feature = "compact")]
#![doc(hidden)]
use lexical_util::algorithm::copy_to_dst;
use lexical_util::constants::FormattedSize;
use lexical_util::digit::digit_to_char;
use lexical_util::num::{AsCast, UnsignedInteger};
pub trait Compact: UnsignedInteger + FormattedSize {
fn compact(self, radix: u32, buffer: &mut [u8]) -> usize {
assert!(Self::BITS <= 128);
let mut digits: [u8; 128] = [0u8; 128];
let mut index = digits.len();
let radix = Self::from_u32(radix);
let mut value = self;
while value >= radix {
let r = value % radix;
value /= radix;
index -= 1;
digits[index] = digit_to_char(u32::as_cast(r));
}
let r = value;
index -= 1;
digits[index] = digit_to_char(u32::as_cast(r));
let slc = &digits[index..];
copy_to_dst(buffer, slc)
}
}
macro_rules! compact_impl {
($($t:ty)*) => ($(
impl Compact for $t {}
)*)
}
compact_impl! { u8 u16 u32 u64 u128 usize }