use alloc::vec::Vec;
use crate::node::Node;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub(crate) struct NodeId(pub(crate) u32);
pub(crate) trait NodeStore<K, V> {
fn alloc(&mut self, node: Node<K, V>) -> NodeId;
fn reclaim(&mut self, id: NodeId) -> Node<K, V>;
fn get(&self, id: NodeId) -> &Node<K, V>;
fn get_mut(&mut self, id: NodeId) -> &mut Node<K, V>;
fn reset(&mut self) -> NodeId;
}
pub(crate) struct InMemoryStore<K, V> {
slab: Vec<Node<K, V>>,
free: Vec<NodeId>,
}
impl<K, V> InMemoryStore<K, V> {
#[inline]
pub(crate) fn new() -> Self {
InMemoryStore {
slab: Vec::new(),
free: Vec::new(),
}
}
}
impl<K, V> NodeStore<K, V> for InMemoryStore<K, V> {
fn alloc(&mut self, node: Node<K, V>) -> NodeId {
if let Some(id) = self.free.pop() {
self.slab[id.0 as usize] = node;
id
} else {
let id = NodeId(self.slab.len() as u32);
self.slab.push(node);
id
}
}
fn reclaim(&mut self, id: NodeId) -> Node<K, V> {
let node = core::mem::replace(&mut self.slab[id.0 as usize], Node::empty_leaf());
self.free.push(id);
node
}
#[inline]
fn get(&self, id: NodeId) -> &Node<K, V> {
&self.slab[id.0 as usize]
}
#[inline]
fn get_mut(&mut self, id: NodeId) -> &mut Node<K, V> {
&mut self.slab[id.0 as usize]
}
fn reset(&mut self) -> NodeId {
self.slab.clear();
self.free.clear();
self.alloc(Node::empty_leaf())
}
}