compact_bitset 0.1.3

A type for storing fixed-size arrays of booleans densely to optimize space
Documentation
use std::mem::size_of;

use num_traits::{PrimInt, Unsigned};

use crate::{BitRef, CompactBitset};

/// A utility type for iterating `CompactBitset` via `BitRef`.
/// `BitIter` is an immutable iterator for `CompactBitset.`
///
/// # Example
///
/// ```
/// use compact_bitset::CompactBitset;
///
/// let alternating = CompactBitset::<u8>::from_slice([true, false, true, false, true, false, true, false]);
/// let alternating_double = CompactBitset::<u8>::from_slice([true, true, false, false, true, true, false, false]);
/// let anded: CompactBitset<u8> = alternating.iter().zip(alternating_double.iter()).map(|(a, b)| *a & *b).collect();
/// assert_eq!(anded, CompactBitset::<u8>::from_slice([true, false, false, false, true, false, false, false]));
/// ```
pub struct BitIter<'set, T: PrimInt + Unsigned> {
    pub(crate) bitref: BitRef<'set, T>,
}

impl<'set, T: PrimInt + Unsigned> Iterator for BitIter<'set, T> {
    type Item = BitRef<'set, T>;
    fn next(&mut self) -> Option<Self::Item> {
        if self.bitref.idx >= self.bitref.parent.len() {
            None
        } else {
            self.bitref.idx += 1;
            Some(self.bitref.parent.at(self.bitref.idx - 1))
        }
    }
}

impl<'parent, U: PrimInt + Unsigned> FromIterator<BitRef<'parent, U>> for Vec<bool> {
    fn from_iter<T: IntoIterator<Item = BitRef<'parent, U>>>(iter: T) -> Self {
        let mut vec = Vec::with_capacity(size_of::<U>());
        for item in iter.into_iter() {
            vec.push(*item);
        }
        vec
    }
}

impl<'parent, U: PrimInt + Unsigned> FromIterator<BitRef<'parent, U>> for CompactBitset<U> {
    fn from_iter<T: IntoIterator<Item = BitRef<'parent, U>>>(iter: T) -> Self {
        let mut ret = Self::new();
        for (i, item) in iter.into_iter().enumerate() {
            ret.at_mut(i).set(item);
        }
        ret
    }
}

impl<'parent, U: PrimInt + Unsigned> FromIterator<bool> for CompactBitset<U> {
    fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
        let mut ret = Self::new();
        for (i, item) in iter.into_iter().enumerate() {
            ret.at_mut(i).set(item);
        }
        ret
    }
}