use alloc::vec::Vec;
use crate::store::NodeId;
pub(crate) enum Node<K, V> {
Leaf(Leaf<K, V>),
Internal(Internal<K>),
}
pub(crate) struct Leaf<K, V> {
pub(crate) keys: Vec<K>,
pub(crate) vals: Vec<V>,
}
pub(crate) struct Internal<K> {
pub(crate) keys: Vec<K>,
pub(crate) children: Vec<NodeId>,
}
impl<K, V> Node<K, V> {
#[inline]
pub(crate) fn empty_leaf() -> Self {
Node::Leaf(Leaf {
keys: Vec::new(),
vals: Vec::new(),
})
}
#[inline]
pub(crate) fn keys_len(&self) -> usize {
match self {
Node::Leaf(leaf) => leaf.keys.len(),
Node::Internal(internal) => internal.keys.len(),
}
}
#[inline]
pub(crate) fn as_leaf(&self) -> Option<&Leaf<K, V>> {
match self {
Node::Leaf(leaf) => Some(leaf),
Node::Internal(_) => None,
}
}
}
impl<K: Ord, V> Leaf<K, V> {
#[inline]
pub(crate) fn get(&self, key: &K) -> Option<&V> {
match self.keys.binary_search(key) {
Ok(i) => Some(&self.vals[i]),
Err(_) => None,
}
}
pub(crate) fn remove(&mut self, key: &K) -> Option<V> {
match self.keys.binary_search(key) {
Ok(i) => {
let _removed_key = self.keys.remove(i);
Some(self.vals.remove(i))
}
Err(_) => None,
}
}
}
impl<K: Ord> Internal<K> {
#[inline]
pub(crate) fn child_index(&self, key: &K) -> usize {
match self.keys.binary_search(key) {
Ok(i) => i + 1,
Err(i) => i,
}
}
}