toolbox_rs/
merge_tree.rs

1use std::collections::BinaryHeap;
2
3use crate::merge_entry::MergeEntry;
4
5pub trait MergeTree<T> {
6    /// Pushes an item onto the merge tree
7    fn push(&mut self, item: MergeEntry<T>);
8
9    /// Removes and returns the minimum item from the tree
10    fn pop(&mut self) -> Option<MergeEntry<T>>;
11
12    /// Returns true if the tree is empty
13    fn is_empty(&self) -> bool;
14
15    /// Returns the number of items in the tree
16    fn len(&self) -> usize;
17}
18
19impl<T: Ord> MergeTree<T> for BinaryHeap<MergeEntry<T>> {
20    fn push(&mut self, item: MergeEntry<T>) {
21        self.push(item);
22    }
23
24    fn pop(&mut self) -> std::option::Option<MergeEntry<T>> {
25        self.pop()
26    }
27
28    fn is_empty(&self) -> bool {
29        self.is_empty()
30    }
31
32    fn len(&self) -> usize {
33        self.len()
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_binary_heap_merge_tree() {
43        let mut heap: BinaryHeap<MergeEntry<i32>> = BinaryHeap::new();
44
45        // test empty heap
46        assert!(heap.is_empty());
47        assert_eq!(heap.len(), 0);
48        assert!(heap.pop().is_none());
49
50        // test push operations
51        heap.push(MergeEntry { item: 3, index: 0 });
52        assert_eq!(heap.len(), 1);
53        assert!(!heap.is_empty());
54
55        heap.push(MergeEntry { item: 1, index: 1 });
56        heap.push(MergeEntry { item: 4, index: 2 });
57        heap.push(MergeEntry { item: 2, index: 3 });
58        assert_eq!(heap.len(), 4);
59
60        // test pop operations - items shall be sorted
61        assert_eq!(heap.pop().unwrap().item, 1);
62        assert_eq!(heap.pop().unwrap().item, 2);
63        assert_eq!(heap.pop().unwrap().item, 3);
64        assert_eq!(heap.pop().unwrap().item, 4);
65
66        // test empty heap - again
67        assert!(heap.is_empty());
68        assert_eq!(heap.len(), 0);
69        assert!(heap.pop().is_none());
70    }
71
72    #[test]
73    fn test_push_duplicate_values() {
74        let mut heap: BinaryHeap<MergeEntry<i32>> = BinaryHeap::new();
75
76        heap.push(MergeEntry { item: 1, index: 0 });
77        heap.push(MergeEntry { item: 1, index: 1 });
78
79        assert_eq!(heap.len(), 2);
80        assert_eq!(heap.pop().unwrap().index, 0);
81        assert_eq!(heap.pop().unwrap().index, 1);
82    }
83
84    #[test]
85    fn test_mixed_operations() {
86        let mut heap: BinaryHeap<MergeEntry<i32>> = BinaryHeap::new();
87
88        heap.push(MergeEntry { item: 3, index: 0 });
89        assert_eq!(heap.len(), 1);
90
91        heap.push(MergeEntry { item: 1, index: 1 });
92        assert_eq!(heap.len(), 2);
93
94        assert_eq!(heap.pop().unwrap().item, 1);
95        assert_eq!(heap.len(), 1);
96
97        heap.push(MergeEntry { item: 2, index: 2 });
98        assert_eq!(heap.len(), 2);
99
100        assert_eq!(heap.pop().unwrap().item, 2);
101        assert_eq!(heap.pop().unwrap().item, 3);
102        assert!(heap.is_empty());
103    }
104}