blob: 357e372bd73be8a0f52a00d971a7c445df3a1682 [file] [log] [blame]
use crate::lsm_tree::{BoxedLayerIterator, ItemRef, Layer, LayerIterator};
use failure::Error;
use std::ops::Bound;
pub struct SingleItemLayer<'item, K, V> {
item: ItemRef<'item, K, V>,
}
impl<K, V> SingleItemLayer<'_, K, V> {
pub fn new(item: ItemRef<K, V>) -> SingleItemLayer<K, V> {
SingleItemLayer { item }
}
}
enum SingleItemLayerIteratorState {
Start,
AtItem,
End,
}
struct SingleItemLayerIterator<'item, K, V> {
item: ItemRef<'item, K, V>,
pos: i32,
}
impl<K: PartialOrd, V> Layer<K, V> for SingleItemLayer<'_, K, V> {
fn get_iterator(&self) -> BoxedLayerIterator<K, V> {
Box::new(SingleItemLayerIterator { item: self.item, pos: 0 })
}
}
impl<K: PartialOrd, V> LayerIterator<K, V> for SingleItemLayerIterator<'_, K, V> {
fn seek(&mut self, bound: std::ops::Bound<&K>) -> Result<(), Error> {
match bound {
Bound::Unbounded => self.pos = 1,
Bound::Included(key) => {
if key <= self.item.key {
self.pos = 1;
} else {
self.pos = 2;
}
}
Bound::Excluded(key) => {
panic!("Not supported!");
}
}
Ok(())
}
fn advance(&mut self) -> Result<(), Error> {
self.pos += 1;
Ok(())
}
fn get(&self) -> Option<ItemRef<K, V>> {
match self.pos {
1 => Some(self.item),
_ => None,
}
}
}