@@ -1697,10 +1697,9 @@ impl<'a, K: 'a, V: 'a> DrainFilterInner<'a, K, V> {
1697
1697
let ( k, v) = kv. kv_mut ( ) ;
1698
1698
if pred ( k, v) {
1699
1699
* self . length -= 1 ;
1700
- let RemoveResult { old_kv , pos, emptied_internal_root } = kv. remove_kv_tracking ( ) ;
1700
+ let ( kv , pos) = kv. remove_kv_tracking ( |_| self . emptied_internal_root = true ) ;
1701
1701
self . cur_leaf_edge = Some ( pos) ;
1702
- self . emptied_internal_root |= emptied_internal_root;
1703
- return Some ( old_kv) ;
1702
+ return Some ( kv) ;
1704
1703
}
1705
1704
self . cur_leaf_edge = Some ( kv. next_leaf_edge ( ) ) ;
1706
1705
}
@@ -2645,35 +2644,28 @@ impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> {
2645
2644
fn remove_kv ( self ) -> ( K , V ) {
2646
2645
* self . length -= 1 ;
2647
2646
2648
- let RemoveResult { old_kv, pos, emptied_internal_root } = self . handle . remove_kv_tracking ( ) ;
2649
- let root = pos. into_node ( ) . into_root_mut ( ) ;
2650
- if emptied_internal_root {
2651
- root. pop_internal_level ( ) ;
2652
- }
2647
+ let ( old_kv, _) =
2648
+ self . handle . remove_kv_tracking ( |root| root. into_root_mut ( ) . pop_internal_level ( ) ) ;
2653
2649
old_kv
2654
2650
}
2655
2651
}
2656
2652
2657
- struct RemoveResult < ' a , K , V > {
2658
- // Key and value removed.
2659
- old_kv : ( K , V ) ,
2660
- // Unique location at the leaf level that the removed KV lopgically collapsed into.
2661
- pos : Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > ,
2662
- // Whether the remove left behind and empty internal root node, that should be removed
2663
- // using `pop_internal_level`.
2664
- emptied_internal_root : bool ,
2665
- }
2666
-
2667
2653
impl < ' a , K : ' a , V : ' a > Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: LeafOrInternal > , marker:: KV > {
2668
2654
/// Removes a key/value-pair from the tree, and returns that pair, as well as
2669
2655
/// the leaf edge corresponding to that former pair. It's possible this leaves
2670
2656
/// an empty internal root node, which the caller should subsequently pop from
2671
2657
/// the map holding the tree. The caller should also decrement the map's length.
2672
- fn remove_kv_tracking ( self ) -> RemoveResult < ' a , K , V > {
2673
- let ( mut pos, old_key, old_val, was_internal) = match self . force ( ) {
2658
+ fn remove_kv_tracking < F > (
2659
+ self ,
2660
+ handle_emptied_internal_root : F ,
2661
+ ) -> ( ( K , V ) , Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > )
2662
+ where
2663
+ F : FnOnce ( NodeRef < marker:: Mut < ' a > , K , V , marker:: Internal > ) ,
2664
+ {
2665
+ let ( old_kv, mut pos, was_internal) = match self . force ( ) {
2674
2666
Leaf ( leaf) => {
2675
- let ( hole , old_key , old_val ) = leaf. remove ( ) ;
2676
- ( hole , old_key , old_val , false )
2667
+ let ( old_kv , pos ) = leaf. remove ( ) ;
2668
+ ( old_kv , pos , false )
2677
2669
}
2678
2670
Internal ( mut internal) => {
2679
2671
// Replace the location freed in the internal node with the next KV,
@@ -2688,17 +2680,16 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInter
2688
2680
let to_remove = internal. left_edge ( ) . descend ( ) . last_leaf_edge ( ) . left_kv ( ) . ok ( ) ;
2689
2681
let to_remove = unsafe { unwrap_unchecked ( to_remove) } ;
2690
2682
2691
- let ( hole , key , val ) = to_remove. remove ( ) ;
2683
+ let ( kv , pos ) = to_remove. remove ( ) ;
2692
2684
2693
- let old_key = unsafe { mem:: replace ( & mut * key_loc, key ) } ;
2694
- let old_val = unsafe { mem:: replace ( & mut * val_loc, val ) } ;
2685
+ let old_key = unsafe { mem:: replace ( & mut * key_loc, kv . 0 ) } ;
2686
+ let old_val = unsafe { mem:: replace ( & mut * val_loc, kv . 1 ) } ;
2695
2687
2696
- ( hole , old_key, old_val, true )
2688
+ ( ( old_key, old_val) , pos , true )
2697
2689
}
2698
2690
} ;
2699
2691
2700
2692
// Handle underflow
2701
- let mut emptied_internal_root = false ;
2702
2693
let mut cur_node = unsafe { ptr:: read ( & pos) . into_node ( ) . forget_type ( ) } ;
2703
2694
let mut at_leaf = true ;
2704
2695
while cur_node. len ( ) < node:: MIN_LEN {
@@ -2719,8 +2710,10 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInter
2719
2710
2720
2711
let parent = edge. into_node ( ) ;
2721
2712
if parent. len ( ) == 0 {
2722
- // This empty parent must be the root, and should be popped off the tree.
2723
- emptied_internal_root = true ;
2713
+ // The parent that was just emptied must be the root,
2714
+ // because nodes on a lower level would not have been
2715
+ // left underfull. It has to be popped off the tree soon.
2716
+ handle_emptied_internal_root ( parent) ;
2724
2717
break ;
2725
2718
} else {
2726
2719
cur_node = parent. forget_type ( ) ;
@@ -2747,7 +2740,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInter
2747
2740
pos = unsafe { unwrap_unchecked ( pos. next_kv ( ) . ok ( ) ) . next_leaf_edge ( ) } ;
2748
2741
}
2749
2742
2750
- RemoveResult { old_kv : ( old_key , old_val ) , pos, emptied_internal_root }
2743
+ ( old_kv , pos)
2751
2744
}
2752
2745
}
2753
2746
0 commit comments