#![cfg(not(feature = "compact"))]
#![cfg(feature = "power-of-two")]
#![doc(hidden)]
use lexical_util::algorithm::copy_to_dst;
use lexical_util::format;
use lexical_util::num::{Integer, UnsignedInteger};
use crate::algorithm::{algorithm, algorithm_u128};
use crate::table::get_table;
pub trait Radix: UnsignedInteger {
fn radix<const FORMAT: u128, const MASK: u128, const SHIFT: i32>(
self,
buffer: &mut [u8],
) -> usize;
}
macro_rules! radix_unimpl {
($($t:ty)*) => ($(
impl Radix for $t {
#[inline(always)]
fn radix<const __: u128, const ___: u128, const ____: i32>(self, _: &mut [u8]) -> usize {
unimplemented!()
}
}
)*);
}
radix_unimpl! { u8 u16 usize }
macro_rules! radix_impl {
($($t:ty)*) => ($(
impl Radix for $t {
#[inline(always)]
fn radix<const FORMAT: u128, const MASK: u128, const SHIFT: i32>(
self,
buffer: &mut [u8]
) -> usize {
debug_assert!(<Self as Integer>::BITS <= 64);
let radix = format::radix_from_flags(FORMAT, MASK, SHIFT);
let table = get_table::<FORMAT, MASK, SHIFT>();
let mut digits: [u8; 64] = [0u8; 64];
let count = digits.len();
let index = unsafe { algorithm(self, radix, table, &mut digits, count) };
copy_to_dst(buffer, &mut digits[index..])
}
}
)*);
}
radix_impl! { u32 u64 }
impl Radix for u128 {
#[inline(always)]
fn radix<const FORMAT: u128, const MASK: u128, const SHIFT: i32>(
self,
buffer: &mut [u8],
) -> usize {
let table = get_table::<FORMAT, MASK, SHIFT>();
let mut digits: [u8; 128] = [0u8; 128];
let count = digits.len();
let index =
unsafe { algorithm_u128::<FORMAT, MASK, SHIFT>(self, table, &mut digits, count) };
copy_to_dst(buffer, &mut digits[index..])
}
}