twibint 0.3.2

Crate for arithmetic on arbitrarily large integers. Provides Python bindings as well.
Documentation
use crate::BigInt;
use crate::BigUint;

use crate::traits::Digit;

use crate::BigFloat;

fn clean_uint<T: Digit>(uint: &mut BigUint<T>) -> isize {
    let residual_scale = uint.val.iter().take_while(|d| d == &&T::ZERO).count();

    // As always, keep at least one zero
    let residual_scale = residual_scale.min(uint.val.len() - 1);

    uint.val.drain(..residual_scale);
    residual_scale.try_into().unwrap()
}

impl<T: Digit> From<BigInt<T>> for BigFloat<T> {
    fn from(mut val: BigInt<T>) -> Self {
        let scale = clean_uint(&mut val.uint);
        Self { int: val, scale }
    }
}

impl<T: Digit> From<BigUint<T>> for BigFloat<T> {
    fn from(mut val: BigUint<T>) -> Self {
        let scale = clean_uint(&mut val);
        Self {
            int: val.into(),
            scale,
        }
    }
}

impl<T: Digit> From<Vec<T>> for BigFloat<T> {
    fn from(val: Vec<T>) -> Self {
        Self::from(BigUint::from(val))
    }
}

impl<T: Digit> From<T> for BigFloat<T> {
    fn from(val: T) -> Self {
        Self::from(BigUint::new(val))
    }
}