@@ -241,7 +241,7 @@ impl<T: Ord> BinaryHeap<T> {
241
241
/// }
242
242
/// ```
243
243
#[ unstable = "matches collection reform specification, waiting for dust to settle" ]
244
- pub fn iter < ' a > ( & ' a self ) -> Items < ' a , T > {
244
+ pub fn iter ( & self ) -> Items < T > {
245
245
Items { iter : self . data . iter ( ) }
246
246
}
247
247
@@ -282,8 +282,8 @@ impl<T: Ord> BinaryHeap<T> {
282
282
/// assert_eq!(heap.top(), Some(&5i));
283
283
///
284
284
/// ```
285
- pub fn top < ' a > ( & ' a self ) -> Option < & ' a T > {
286
- if self . is_empty ( ) { None } else { Some ( & self . data [ 0 ] ) }
285
+ pub fn top ( & self ) -> Option < & T > {
286
+ self . data . get ( 0 )
287
287
}
288
288
289
289
/// Returns the number of elements the queue can hold without reallocating.
@@ -394,9 +394,9 @@ impl<T: Ord> BinaryHeap<T> {
394
394
/// ```
395
395
#[ unstable = "matches collection reform specification, waiting for dust to settle" ]
396
396
pub fn push ( & mut self , item : T ) {
397
+ let old_len = self . len ( ) ;
397
398
self . data . push ( item) ;
398
- let new_len = self . len ( ) - 1 ;
399
- self . siftup ( 0 , new_len) ;
399
+ self . siftup ( 0 , old_len) ;
400
400
}
401
401
402
402
/// Pushes an item onto a queue then pops the greatest item off the queue in
@@ -417,10 +417,16 @@ impl<T: Ord> BinaryHeap<T> {
417
417
/// assert_eq!(heap.top(), Some(&3i));
418
418
/// ```
419
419
pub fn push_pop ( & mut self , mut item : T ) -> T {
420
- if !self . is_empty ( ) && * self . top ( ) . unwrap ( ) > item {
421
- swap ( & mut item, & mut self . data [ 0 ] ) ;
422
- self . siftdown ( 0 ) ;
420
+ match self . data . get_mut ( 0 ) {
421
+ None => return item,
422
+ Some ( top) => if * top > item {
423
+ swap ( & mut item, top) ;
424
+ } else {
425
+ return item;
426
+ } ,
423
427
}
428
+
429
+ self . siftdown ( 0 ) ;
424
430
item
425
431
}
426
432
@@ -467,7 +473,7 @@ impl<T: Ord> BinaryHeap<T> {
467
473
/// println!("{}", x);
468
474
/// }
469
475
/// ```
470
- pub fn into_vec ( self ) -> Vec < T > { let BinaryHeap { data : v } = self ; v }
476
+ pub fn into_vec ( self ) -> Vec < T > { self . data }
471
477
472
478
/// Consumes the `BinaryHeap` and returns a vector in sorted
473
479
/// (ascending) order.
@@ -484,15 +490,14 @@ impl<T: Ord> BinaryHeap<T> {
484
490
/// let vec = heap.into_sorted_vec();
485
491
/// assert_eq!(vec, vec![1i, 2, 3, 4, 5, 6, 7]);
486
492
/// ```
487
- pub fn into_sorted_vec ( self ) -> Vec < T > {
488
- let mut q = self ;
489
- let mut end = q. len ( ) ;
493
+ pub fn into_sorted_vec ( mut self ) -> Vec < T > {
494
+ let mut end = self . len ( ) ;
490
495
while end > 1 {
491
496
end -= 1 ;
492
- q . data . swap ( 0 , end) ;
493
- q . siftdown_range ( 0 , end)
497
+ self . data . swap ( 0 , end) ;
498
+ self . siftdown_range ( 0 , end)
494
499
}
495
- q . into_vec ( )
500
+ self . into_vec ( )
496
501
}
497
502
498
503
// The implementations of siftup and siftdown use unsafe blocks in
@@ -559,21 +564,21 @@ impl<T: Ord> BinaryHeap<T> {
559
564
}
560
565
561
566
/// `BinaryHeap` iterator.
562
- pub struct Items < ' a , T : ' a > {
567
+ pub struct Items < ' a , T : ' a > {
563
568
iter : slice:: Items < ' a , T > ,
564
569
}
565
570
566
571
impl < ' a , T > Iterator < & ' a T > for Items < ' a , T > {
567
572
#[ inline]
568
- fn next ( & mut self ) -> Option < ( & ' a T ) > { self . iter . next ( ) }
573
+ fn next ( & mut self ) -> Option < & ' a T > { self . iter . next ( ) }
569
574
570
575
#[ inline]
571
576
fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . iter . size_hint ( ) }
572
577
}
573
578
574
579
impl < ' a , T > DoubleEndedIterator < & ' a T > for Items < ' a , T > {
575
580
#[ inline]
576
- fn next_back ( & mut self ) -> Option < ( & ' a T ) > { self . iter . next_back ( ) }
581
+ fn next_back ( & mut self ) -> Option < & ' a T > { self . iter . next_back ( ) }
577
582
}
578
583
579
584
impl < ' a , T > ExactSizeIterator < & ' a T > for Items < ' a , T > { }
@@ -600,8 +605,7 @@ impl<T> ExactSizeIterator<T> for MoveItems<T> {}
600
605
601
606
impl < T : Ord > FromIterator < T > for BinaryHeap < T > {
602
607
fn from_iter < Iter : Iterator < T > > ( iter : Iter ) -> BinaryHeap < T > {
603
- let vec: Vec < T > = iter. collect ( ) ;
604
- BinaryHeap :: from_vec ( vec)
608
+ BinaryHeap :: from_vec ( iter. collect ( ) )
605
609
}
606
610
}
607
611
@@ -796,20 +800,20 @@ mod tests {
796
800
797
801
#[ test]
798
802
fn test_empty_pop ( ) {
799
- let mut heap: BinaryHeap < int > = BinaryHeap :: new ( ) ;
803
+ let mut heap = BinaryHeap :: < int > :: new ( ) ;
800
804
assert ! ( heap. pop( ) . is_none( ) ) ;
801
805
}
802
806
803
807
#[ test]
804
808
fn test_empty_top ( ) {
805
- let empty: BinaryHeap < int > = BinaryHeap :: new ( ) ;
809
+ let empty = BinaryHeap :: < int > :: new ( ) ;
806
810
assert ! ( empty. top( ) . is_none( ) ) ;
807
811
}
808
812
809
813
#[ test]
810
814
fn test_empty_replace ( ) {
811
- let mut heap: BinaryHeap < int > = BinaryHeap :: new ( ) ;
812
- heap. replace ( 5 ) . is_none ( ) ;
815
+ let mut heap = BinaryHeap :: < int > :: new ( ) ;
816
+ assert ! ( heap. replace( 5 ) . is_none( ) ) ;
813
817
}
814
818
815
819
#[ test]
0 commit comments