apfsds_storage/
blink_tree.rs1use dashmap::DashMap;
4
5use crate::SegmentPtr;
6
7pub struct BLinkTree {
10 index: DashMap<u64, SegmentPtr>,
12}
13
14impl BLinkTree {
15 pub fn new() -> Self {
17 Self {
18 index: DashMap::new(),
19 }
20 }
21
22 pub fn insert(&self, conn_id: u64, ptr: SegmentPtr) {
24 self.index.insert(conn_id, ptr);
25 }
26
27 pub fn search(&self, conn_id: u64) -> Option<SegmentPtr> {
29 self.index.get(&conn_id).map(|r| *r)
30 }
31
32 pub fn remove(&self, conn_id: u64) -> Option<SegmentPtr> {
34 self.index.remove(&conn_id).map(|(_, v)| v)
35 }
36
37 pub fn len(&self) -> usize {
39 self.index.len()
40 }
41
42 pub fn is_empty(&self) -> bool {
44 self.index.is_empty()
45 }
46
47 pub fn iter(&self) -> impl Iterator<Item = (u64, SegmentPtr)> + '_ {
49 self.index.iter().map(|r| (*r.key(), *r.value()))
50 }
51}
52
53impl Default for BLinkTree {
54 fn default() -> Self {
55 Self::new()
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
64 fn test_insert_search() {
65 let tree = BLinkTree::new();
66
67 let ptr = SegmentPtr {
68 segment_id: 1,
69 offset: 100,
70 };
71
72 tree.insert(42, ptr);
73
74 let found = tree.search(42).unwrap();
75 assert_eq!(found.segment_id, 1);
76 assert_eq!(found.offset, 100);
77 }
78
79 #[test]
80 fn test_remove() {
81 let tree = BLinkTree::new();
82
83 let ptr = SegmentPtr {
84 segment_id: 1,
85 offset: 100,
86 };
87
88 tree.insert(42, ptr);
89 assert!(tree.search(42).is_some());
90
91 tree.remove(42);
92 assert!(tree.search(42).is_none());
93 }
94}