use dashmap::DashMap;
use crate::SegmentPtr;
pub struct BLinkTree {
index: DashMap<u64, SegmentPtr>,
}
impl BLinkTree {
pub fn new() -> Self {
Self {
index: DashMap::new(),
}
}
pub fn insert(&self, conn_id: u64, ptr: SegmentPtr) {
self.index.insert(conn_id, ptr);
}
pub fn search(&self, conn_id: u64) -> Option<SegmentPtr> {
self.index.get(&conn_id).map(|r| *r)
}
pub fn remove(&self, conn_id: u64) -> Option<SegmentPtr> {
self.index.remove(&conn_id).map(|(_, v)| v)
}
pub fn len(&self) -> usize {
self.index.len()
}
pub fn is_empty(&self) -> bool {
self.index.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (u64, SegmentPtr)> + '_ {
self.index.iter().map(|r| (*r.key(), *r.value()))
}
}
impl Default for BLinkTree {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_insert_search() {
let tree = BLinkTree::new();
let ptr = SegmentPtr {
segment_id: 1,
offset: 100,
};
tree.insert(42, ptr);
let found = tree.search(42).unwrap();
assert_eq!(found.segment_id, 1);
assert_eq!(found.offset, 100);
}
#[test]
fn test_remove() {
let tree = BLinkTree::new();
let ptr = SegmentPtr {
segment_id: 1,
offset: 100,
};
tree.insert(42, ptr);
assert!(tree.search(42).is_some());
tree.remove(42);
assert!(tree.search(42).is_none());
}
}