Skip to content

Commit a7f7145

Browse files
committed
---
yaml --- r: 44373 b: refs/heads/master c: f9c7ba0 h: refs/heads/master i: 44371: 1977de7 v: v3
1 parent dbb5399 commit a7f7145

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: b0f58f6e684ca9076fac99e8f3917d01eeb5775e
2+
refs/heads/master: f9c7ba009b51f39629d74ac67781c034643e74e8
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a6d9689399d091c3265f00434a69c551a61c28dc
55
refs/heads/try: ef355f6332f83371e4acf04fc4eb940ab41d78d3

trunk/src/libstd/treemap.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
626626
}
627627

628628
fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
629-
fn heir_swap<K: Ord, V>(node: &mut TreeNode<K, V>,
629+
fn heir_swap<K: Ord, V>(node: &mut ~TreeNode<K, V>,
630630
child: &mut Option<~TreeNode<K, V>>) {
631631
// *could* be done without recursion, but it won't borrow check
632632
do child.mutate |mut child| {
@@ -640,15 +640,15 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
640640
}
641641
}
642642

643-
if node.is_none() {
643+
match *node {
644+
None => {
644645
return false // bottom of tree
645-
} else {
646-
let mut save = node.swap_unwrap();
647-
648-
let removed = if save.key < *key {
649-
remove(&mut save.right, key)
646+
}
647+
Some(ref mut save) => {
648+
let (removed, this) = if save.key < *key {
649+
(remove(&mut save.right, key), false)
650650
} else if *key < save.key {
651-
remove(&mut save.left, key)
651+
(remove(&mut save.left, key), false)
652652
} else {
653653
if save.left.is_some() {
654654
if save.right.is_some() {
@@ -662,16 +662,22 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
662662
save.left = Some(left);
663663
remove(&mut save.left, key);
664664
} else {
665-
save = save.left.swap_unwrap();
665+
*save = save.left.swap_unwrap();
666666
}
667+
(true, false)
667668
} else if save.right.is_some() {
668-
save = save.right.swap_unwrap();
669+
*save = save.right.swap_unwrap();
670+
(true, false)
669671
} else {
670-
return true // leaf
672+
(true, true)
671673
}
672-
true
673674
};
674675

676+
if this {
677+
*node = None;
678+
return true;
679+
}
680+
675681
let left_level = save.left.map_default(0, |x| x.level);
676682
let right_level = save.right.map_default(0, |x| x.level);
677683

@@ -683,7 +689,7 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
683689
do save.right.mutate |mut x| { x.level = save.level; x }
684690
}
685691

686-
skew(&mut save);
692+
skew(save);
687693

688694
match save.right {
689695
Some(ref mut right) => {
@@ -696,15 +702,15 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
696702
None => ()
697703
}
698704

699-
split(&mut save);
705+
split(save);
700706
match save.right {
701707
Some(ref mut x) => { split(x) },
702708
None => ()
703709
}
704710
}
705711

706-
*node = Some(save);
707712
removed
713+
}
708714
}
709715
}
710716

0 commit comments

Comments
 (0)