use std::mem::size_of;
use num_traits::{PrimInt, Unsigned};
use crate::{BitRef, CompactBitset};
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
}
}