use crate::traits::ResourceKey;
use std::fmt::Display;
use std::path::PathBuf;
use subway::skiplist::SkipList;
#[derive(Clone)]
pub struct TableAddress {
pub path: PathBuf,
pub offset: usize,
}
impl TableAddress {
pub fn new(path: &PathBuf, offset: usize) -> TableAddress {
TableAddress {
path: path.clone(),
offset,
}
}
}
pub struct SparseIndex<K> {
data: SkipList<K, TableAddress>,
}
impl<K> SparseIndex<K>
where
K: ResourceKey,
{
pub fn new() -> SparseIndex<K> {
SparseIndex {
data: SkipList::new(),
}
}
pub fn update(&mut self, key: K, address: TableAddress) {
if self.data.get(&key).is_some() {
self.data.delete(&key);
}
self.data.insert(key, address);
}
pub fn get_nearest_address(&mut self, key: &K) -> Option<TableAddress> {
let maybe_nearest_key = self.data.bisect(key);
return maybe_nearest_key.and_then(|nearest_key| self.data.get(&nearest_key));
}
pub fn reset(&mut self) {
self.data = SkipList::new();
}
}