1use std::collections::BinaryHeap;
2
3use crate::merge_entry::MergeEntry;
4
5pub trait MergeTree<T> {
6 fn push(&mut self, item: MergeEntry<T>);
8
9 fn pop(&mut self) -> Option<MergeEntry<T>>;
11
12 fn is_empty(&self) -> bool;
14
15 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 assert!(heap.is_empty());
47 assert_eq!(heap.len(), 0);
48 assert!(heap.pop().is_none());
49
50 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 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 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}