use crate::integer::Integer;
use crate::natural::InnerNatural::{Large, Small};
use crate::natural::Natural;
use crate::platform::Limb;
use malachite_base::num::basic::integers::PrimitiveInt;
use malachite_base::num::logic::traits::{CountOnes, CountZeros};
pub_crate_test! {limbs_count_zeros_neg(xs: &[Limb]) -> u64 {
let mut sum = 0;
let mut nonzero_seen = false;
for &x in xs {
sum += if nonzero_seen {
CountOnes::count_ones(x)
} else if x == 0 {
Limb::WIDTH
} else {
nonzero_seen = true;
CountZeros::count_zeros(x.wrapping_neg())
};
}
sum
}}
impl Natural {
fn count_zeros_neg(&self) -> u64 {
match self {
Self(Small(small)) => CountZeros::count_zeros(small.wrapping_neg()),
Self(Large(limbs)) => limbs_count_zeros_neg(limbs),
}
}
}
impl Integer {
pub fn checked_count_zeros(&self) -> Option<u64> {
if self.sign {
None
} else {
Some(self.abs.count_zeros_neg())
}
}
}