diff --git a/src/backing/pure/binary_heap.rs b/src/backing/pure/binary_heap.rs index 5195756..4d79d97 100644 --- a/src/backing/pure/binary_heap.rs +++ b/src/backing/pure/binary_heap.rs @@ -103,6 +103,18 @@ impl BinaryHeap { } } +impl FromIterator for BinaryHeap { + fn from_iter>(iter: U) -> Self { + let mut this = Self { + data: Vec::from_iter(iter), + }; + for i in (0..=(this.data.len() / 2)).rev() { + this.sift_down(i); + } + this + } +} + impl PureBacking for BinaryHeap { fn new() -> Self { Self { data: vec![] } diff --git a/src/backing/pure/mod.rs b/src/backing/pure/mod.rs index 24f69c9..9d82347 100644 --- a/src/backing/pure/mod.rs +++ b/src/backing/pure/mod.rs @@ -2,7 +2,7 @@ pub mod binary_heap; /// A data structure usable for backing a "pure" queue -pub trait PureBacking { +pub trait PureBacking: FromIterator { /// Instantiates a new data structure fn new() -> Self; /// Places an item into the queue diff --git a/tests/pure_binary_heap.rs b/tests/pure_binary_heap.rs index a6326c2..597d6eb 100644 --- a/tests/pure_binary_heap.rs +++ b/tests/pure_binary_heap.rs @@ -3,26 +3,26 @@ mod tests { use pyority_queue::backing::pure::{binary_heap::BinaryHeap, PureBacking}; #[test] - fn test_pure_binary_heap() { + fn test_pure_binary_heap_manual_creation() { let mut heap = BinaryHeap::new(); - assert_eq!(heap.len(), 0); heap.add(4); - assert_eq!(heap.len(), 1); heap.add(-3); - assert_eq!(heap.len(), 2); heap.add(6); - assert_eq!(heap.len(), 3); heap.add(1); - assert_eq!(heap.len(), 4); assert_eq!(heap.pop(), Some(-3)); - assert_eq!(heap.len(), 3); assert_eq!(heap.pop(), Some(1)); - assert_eq!(heap.len(), 2); assert_eq!(heap.pop(), Some(4)); - assert_eq!(heap.len(), 1); assert_eq!(heap.pop(), Some(6)); - assert_eq!(heap.len(), 0); assert_eq!(heap.pop(), None); - assert_eq!(heap.len(), 0); + } + + #[test] + fn test_pure_binary_heap_from_iter() { + let mut heap = BinaryHeap::from_iter(vec![7, 3, 6, 9]); + assert_eq!(heap.pop(), Some(3)); + assert_eq!(heap.pop(), Some(6)); + assert_eq!(heap.pop(), Some(7)); + assert_eq!(heap.pop(), Some(9)); + assert_eq!(heap.pop(), None); } }