gravityfile_scan/
inode.rs1use dashmap::DashSet;
4use gravityfile_core::InodeInfo;
5
6#[derive(Debug, Default)]
11pub struct InodeTracker {
12 seen: DashSet<InodeInfo>,
13}
14
15impl InodeTracker {
16 pub fn new() -> Self {
18 Self {
19 seen: DashSet::new(),
20 }
21 }
22
23 pub fn track(&self, info: InodeInfo) -> bool {
28 self.seen.insert(info)
29 }
30
31 pub fn has_seen(&self, info: &InodeInfo) -> bool {
33 self.seen.contains(info)
34 }
35
36 pub fn len(&self) -> usize {
38 self.seen.len()
39 }
40
41 pub fn is_empty(&self) -> bool {
43 self.seen.is_empty()
44 }
45
46 pub fn clear(&self) {
48 self.seen.clear();
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55
56 #[test]
57 fn test_track_new_inode() {
58 let tracker = InodeTracker::new();
59 let info = InodeInfo::new(12345, 1);
60
61 assert!(tracker.track(info));
62 assert!(!tracker.track(info)); }
64
65 #[test]
66 fn test_has_seen() {
67 let tracker = InodeTracker::new();
68 let info = InodeInfo::new(12345, 1);
69
70 assert!(!tracker.has_seen(&info));
71 tracker.track(info);
72 assert!(tracker.has_seen(&info));
73 }
74
75 #[test]
76 fn test_different_devices() {
77 let tracker = InodeTracker::new();
78 let info1 = InodeInfo::new(12345, 1);
79 let info2 = InodeInfo::new(12345, 2); assert!(tracker.track(info1));
82 assert!(tracker.track(info2)); }
84}