use crate::{
BitStore,
Unsigned,
};
use std::marker::PhantomData;
pub struct Bits<'a, Store: BitStore<Word>, Word: Unsigned> {
store: &'a Store,
index: usize,
_phantom: PhantomData<Word>,
}
impl<'a, Store: BitStore<Word>, Word: Unsigned> Bits<'a, Store, Word> {
pub fn new(store: &'a Store) -> Self { Self { store, index: 0, _phantom: PhantomData } }
}
impl<Store: BitStore<Word>, Word: Unsigned> Iterator for Bits<'_, Store, Word> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.store.len() {
self.index += 1;
return Some(self.store.get(self.index - 1));
}
None
}
}
impl<Store: BitStore<Word>, Word: Unsigned> ExactSizeIterator for Bits<'_, Store, Word> {
fn len(&self) -> usize { self.store.len() - self.index }
}
impl<Store: BitStore<Word>, Word: Unsigned> DoubleEndedIterator for Bits<'_, Store, Word> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.index < self.store.len() {
let item = self.store.get(self.store.len() - 1 - self.index);
self.index += 1;
return Some(item);
}
None
}
}
pub struct SetBits<'a, Store: BitStore<Word>, Word: Unsigned> {
store: &'a Store,
index: Option<usize>,
_phantom: PhantomData<Word>,
}
impl<'a, Store: BitStore<Word>, Word: Unsigned> SetBits<'a, Store, Word> {
pub fn new(store: &'a Store) -> Self {
Self { store, index: Some(usize::MAX), _phantom: PhantomData }
}
}
impl<Store: BitStore<Word>, Word: Unsigned> Iterator for SetBits<'_, Store, Word> {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
if self.index == Some(usize::MAX) {
self.index = self.store.first_set();
}
else if self.index.is_some() {
self.index = self.store.next_set(self.index.unwrap());
}
self.index
}
}
pub struct UnsetBits<'a, Store: BitStore<Word>, Word: Unsigned> {
store: &'a Store,
index: Option<usize>,
_phantom: PhantomData<Word>,
}
impl<'a, Store: BitStore<Word>, Word: Unsigned> UnsetBits<'a, Store, Word> {
pub fn new(store: &'a Store) -> Self {
Self { store, index: Some(usize::MAX), _phantom: PhantomData }
}
}
impl<Store: BitStore<Word>, Word: Unsigned> Iterator for UnsetBits<'_, Store, Word> {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
if self.index == Some(usize::MAX) {
self.index = self.store.first_unset();
}
else if self.index.is_some() {
self.index = self.store.next_unset(self.index.unwrap());
}
self.index
}
}
pub struct Words<'a, Store: BitStore<Word>, Word: Unsigned> {
store: &'a Store,
index: usize,
_phantom: PhantomData<Word>,
}
impl<'a, Store: BitStore<Word>, Word: Unsigned> Words<'a, Store, Word> {
pub fn new(store: &'a Store) -> Self { Self { store, index: 0, _phantom: PhantomData } }
}
impl<Store: BitStore<Word>, Word: Unsigned> Iterator for Words<'_, Store, Word> {
type Item = Word;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.store.words() {
self.index += 1;
return Some(self.store.word(self.index - 1));
}
None
}
}
impl<Store: BitStore<Word>, Word: Unsigned> ExactSizeIterator for Words<'_, Store, Word> {
fn len(&self) -> usize { self.store.words() - self.index }
}
impl<Store: BitStore<Word>, Word: Unsigned> DoubleEndedIterator for Words<'_, Store, Word> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.index < self.store.words() {
let item = self.store.word(self.store.words() - 1 - self.index);
self.index += 1;
return Some(item);
}
None
}
}