use crate::natural::InnerNatural::{Large, Small};
use crate::natural::Natural;
use crate::platform::Limb;
use alloc::vec::Vec;
use malachite_base::num::basic::traits::Zero;
fn limbs_significant_length(xs: &[Limb]) -> usize {
xs.iter()
.enumerate()
.rev()
.find(|&(_, &x)| x != 0)
.map_or(0, |(i, _)| i + 1)
}
impl Natural {
pub fn from_limbs_asc(xs: &[Limb]) -> Self {
let significant_length = limbs_significant_length(xs);
match significant_length {
0 => Self::ZERO,
1 => Self(Small(xs[0])),
_ => Self(Large(xs[..significant_length].to_vec())),
}
}
pub fn from_limbs_desc(xs: &[Limb]) -> Self {
Self::from_owned_limbs_asc(xs.iter().copied().rev().collect())
}
pub fn from_owned_limbs_asc(mut xs: Vec<Limb>) -> Self {
let significant_length = limbs_significant_length(&xs);
match significant_length {
0 => Self::ZERO,
1 => Self(Small(xs[0])),
_ => {
xs.truncate(significant_length);
Self(Large(xs))
}
}
}
pub fn from_owned_limbs_desc(mut xs: Vec<Limb>) -> Self {
xs.reverse();
Self::from_owned_limbs_asc(xs)
}
}