use super::*;
use core::iter::FusedIterator;
impl<C, T> IntoIterator for BitBox<C, T>
where C: Cursor, T: BitStore {
type Item = bool;
type IntoIter = IntoIter<C, T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter {
region: self.bitptr(),
bitbox: self,
}
}
}
impl<'a, C, T> IntoIterator for &'a BitBox<C, T>
where C: Cursor, T: 'a + BitStore {
type Item = &'a bool;
type IntoIter = <&'a BitSlice<C, T> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.as_bitslice().into_iter()
}
}
#[repr(C)]
pub struct IntoIter<C, T>
where C: Cursor, T: BitStore {
bitbox: BitBox<C, T>,
region: BitPtr<T>,
}
impl<C, T> IntoIter<C, T>
where C: Cursor, T: BitStore {
fn iterator(&self) -> <&BitSlice<C, T> as IntoIterator>::IntoIter {
self.region.into_bitslice().into_iter()
}
}
impl<C, T> Iterator for IntoIter<C, T>
where C: Cursor, T: BitStore {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.next().copied();
self.region = slice_iter.bitptr();
out
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iterator().size_hint()
}
fn count(self) -> usize {
self.len()
}
fn nth(&mut self, n: usize) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.nth(n).copied();
self.region = slice_iter.bitptr();
out
}
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<C, T> DoubleEndedIterator for IntoIter<C, T>
where C: Cursor, T: BitStore {
fn next_back(&mut self) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.next_back().copied();
self.region = slice_iter.bitptr();
out
}
}
impl<C, T> ExactSizeIterator for IntoIter<C, T>
where C: Cursor, T: BitStore {}
impl<C, T> FusedIterator for IntoIter<C, T>
where C: Cursor, T: BitStore {}