use crate::util::*;
macro_rules! naive_algorithm {
($value:ident, $radix:ident, $buffer:ident, $index:ident) => ({
while $value >= $radix {
let r = ($value % $radix).as_usize();
$value /= $radix;
$index -= 1;
unchecked_index_mut!($buffer[$index] = digit_to_char(r));
}
let r = ($value % $radix).as_usize();
$index -= 1;
unchecked_index_mut!($buffer[$index] = digit_to_char(r));
});
}
perftools_inline!{
fn naive<T>(mut value: T, radix: u32, buffer: &mut [u8])
-> usize
where T: UnsignedInteger
{
let mut index = buffer.len();
let radix: T = as_cast(radix);
naive_algorithm!(value, radix, buffer, index);
index
}}
pub(crate) trait Naive {
fn naive(self, radix: u32, buffer: &mut [u8]) -> usize;
}
macro_rules! naive_impl {
($($t:ty)*) => ($(
impl Naive for $t {
perftools_inline_always!{
fn naive(self, radix: u32, buffer: &mut [u8]) -> usize {
naive(self, radix, buffer)
}}
}
)*);
}
naive_impl! { u8 u16 u32 u64 usize }
perftools_inline!{
fn naive_u128(value: u128, radix: u32, buffer: &mut [u8])
-> usize
{
let (divisor, digits_per_iter, d_cltz) = u128_divisor(radix);
let radix: u64 = as_cast(radix);
let mut index = buffer.len();
let mut start_index = index;
let (value, mut low) = u128_divrem(value, divisor, d_cltz);
naive_algorithm!(low, radix, buffer, index);
if value != 0 {
start_index -= digits_per_iter;
index = index.min(start_index);
let (value, mut mid) = u128_divrem(value, divisor, d_cltz);
naive_algorithm!(mid, radix, buffer, index);
if value != 0 {
start_index -= digits_per_iter;
index = index.min(start_index);
let mut high = value as u64;
naive_algorithm!(high, radix, buffer, index);
}
}
index
}}
impl Naive for u128 {
perftools_inline_always!{
fn naive(self, radix: u32, buffer: &mut [u8]) -> usize {
naive_u128(self, radix, buffer)
}}
}