bitit 0.1.2

Bitwise iteration over integers.
Documentation
use crate::binary::Binary;

/// An iterator over the 0-bits in a binary value.
/// Represents each bit as a single-bit mask.
///
/// # Examples
/// ```
/// use bitit::BitIter;
///
/// let x = 0b10101100u8;
/// let mut iter = x.zeros();
///
/// assert_eq!(iter.next(), Some(0b00000001u8));
/// assert_eq!(iter.next_back(), Some(0b01000000u8));
/// assert_eq!(iter.next(), Some(0b00000010u8));
/// assert_eq!(iter.next(), Some(0b00010000u8));
/// assert_eq!(iter.next(), None);
/// ```
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Zeros<T: Binary> {
    n: T,
}

impl<T: Binary> Zeros<T> {
    pub const fn new(n: T) -> Self {
        Self { n }
    }
}

impl<T: Binary> Iterator for Zeros<T> {
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        self.n.has_zero().then(|| {
            // Get the least significant 0 and toggle it to 1.
            let b = self.n.lowest_zero();
            self.n ^= b;

            b
        })
    }
}

impl<T: Binary> DoubleEndedIterator for Zeros<T> {
    fn next_back(&mut self) -> Option<Self::Item> {
        self.n.has_zero().then(|| {
            // Get the most significant 0 and toggle it to 1.
            let b = self.n.highest_zero();
            self.n ^= b;

            b
        })
    }
}