bitit 0.1.2

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

/// An iterator over the bits in a value.
/// Represents each bit from least significant to most significant as a boolean.
///
/// # Examples
/// ```
/// use bitit::BitIter;
///
/// let x = 0b10101100u8;
/// let mut iter = x.bits();
///
/// assert_eq!(iter.next(), Some(false));
/// assert_eq!(iter.next(), Some(false));
/// assert_eq!(iter.next(), Some(true));
/// assert_eq!(iter.next(), Some(true));
/// assert_eq!(iter.next(), Some(false));
/// assert_eq!(iter.next(), Some(true));
/// assert_eq!(iter.next(), Some(false));
/// assert_eq!(iter.next(), Some(true));
/// assert_eq!(iter.next(), None);
/// ```
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Bits<T: Binary> {
    /// The value being iterated.
    n: T,

    /// A mask of the bit that is being checked.
    b: T,
}

impl<T: Binary> Bits<T> {
    pub const fn new(n: T) -> Self {
        Self { n, b: T::ONE }
    }
}

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

    fn next(&mut self) -> Option<Self::Item> {
        // This will stop when shifting left by one pushes out the single 1-bit.
        self.b.has_one().then(|| {
            // Get the current bit and push the mask.
            let x = self.n & self.b;
            self.b <<= 1;

            x != T::ZERO
        })
    }
}