use crate::{
table::{block::ParsedItem, index_block::Iter as IndexBlockIter, IndexBlock, KeyedBlockHandle},
SeqNo,
};
use self_cell::self_cell;
self_cell!(
pub struct OwnedIndexBlockIter {
owner: IndexBlock,
#[covariant]
dependent: IndexBlockIter,
}
);
impl OwnedIndexBlockIter {
pub fn seek_lower(&mut self, needle: &[u8], seqno: SeqNo) -> bool {
self.with_dependent_mut(|_, m| m.seek(needle, seqno))
}
pub fn seek_upper(&mut self, needle: &[u8], seqno: SeqNo) -> bool {
self.with_dependent_mut(|_, m| m.seek_upper(needle, seqno))
}
}
impl Iterator for OwnedIndexBlockIter {
type Item = KeyedBlockHandle;
fn next(&mut self) -> Option<Self::Item> {
self.with_dependent_mut(|block, iter| {
iter.next().map(|item| item.materialize(&block.inner.data))
})
}
}
impl DoubleEndedIterator for OwnedIndexBlockIter {
fn next_back(&mut self) -> Option<Self::Item> {
self.with_dependent_mut(|block, iter| {
iter.next_back()
.map(|item| item.materialize(&block.inner.data))
})
}
}