use super::iter::{IterBackward, IterForward};
use super::*;
use core::marker::PhantomData;
pub struct Cursor<'a, K: Ord + Clone + Sized, V: Sized> {
pub(super) leaf: Option<LeafNode<K, V>>,
pub(super) idx: u32,
pub(super) is_exist: bool,
pub(super) _marker: PhantomData<&'a ()>,
}
impl<'a, K: Ord + Clone + Sized + 'a, V: Sized + 'a> Iterator for Cursor<'a, K, V> {
type Item = (&'a K, &'a V);
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a V)> {
unsafe {
loop {
let leaf = self.leaf.as_ref()?;
let idx = self.idx;
if self.is_exist {
let (_k, _v) = leaf.get_raw_pair_unchecked(idx);
let res = Some((&*_k, &*_v));
if idx + 1 < leaf.key_count() {
self.idx = idx + 1;
} else {
if let Some(right) = leaf.get_right_node() {
self.leaf.replace(right);
self.idx = 0;
} else {
self.is_exist = false;
self.idx = idx + 1;
}
}
return res;
} else {
if self.idx < leaf.key_count() {
self.is_exist = true;
} else if let Some(right) = leaf.get_right_node() {
_ = leaf;
self.leaf.replace(right);
self.idx = 0;
self.is_exist = true;
} else {
return None;
}
}
}
}
}
}
impl<'a, K: Ord + Clone + Sized, V: Sized> Cursor<'a, K, V> {
#[inline(always)]
pub fn is_exist(&self) -> bool {
self.is_exist
}
#[inline]
pub fn previous(&mut self) -> Option<(&K, &V)> {
let leaf = self.leaf.as_ref()?;
let idx = self.idx;
unsafe {
if self.idx > 0 {
self.idx -= 1;
if self.is_exist && idx < leaf.key_count() {
let (_k, _v) = leaf.get_raw_pair_unchecked(idx);
return Some((&*_k, &*_v));
} else {
let (_k, _v) = leaf.get_raw_pair_unchecked(self.idx);
return Some((&*_k, &*_v));
}
}
if self.is_exist {
let (_k, _v) = leaf.get_raw_pair_unchecked(0);
let res = Some((&*_k, &*_v));
if let Some(prev) = leaf.get_left_node() {
let count = prev.key_count();
debug_assert!(count > 0);
self.idx = count - 1;
self.leaf.replace(prev);
} else {
self.is_exist = false;
}
return res;
}
if let Some(prev) = leaf.get_left_node() {
let count = prev.key_count();
debug_assert!(count > 0);
self.leaf.replace(prev.clone());
if count > 1 {
self.idx = count - 2;
self.is_exist = true;
} else {
self.idx = 0;
self.is_exist = false;
}
let (_k, _v) = prev.get_raw_pair_unchecked(count - 1);
Some((&*_k, &*_v))
} else {
None
}
}
}
#[inline]
pub fn peek_backward(&self) -> Option<(&K, &V)> {
let leaf = self.leaf.as_ref()?;
let mut cursor = IterBackward { back_leaf: leaf.clone(), back_idx: self.idx };
unsafe {
if let Some((k, v)) = cursor.prev_pair() {
return Some((&*k, &*v));
}
}
None
}
pub fn peek_forward(&self) -> Option<(&K, &V)> {
let leaf = self.leaf.as_ref()?;
unsafe {
if self.is_exist {
let mut cursor = IterForward { front_leaf: leaf.clone(), idx: self.idx + 1 };
if let Some((k, v)) = cursor.next_pair() {
return Some((&*k, &*v));
}
} else {
if let Some((k, v)) = leaf.get_raw_pair(self.idx) {
return Some((&*k, &*v));
}
if let Some(right) = leaf.get_right_node() {
if let Some((k, v)) = right.get_raw_pair(0) {
return Some((&*k, &*v));
}
}
}
}
None
}
}