@@ -576,29 +576,25 @@ pure fn each_reverse<K: Ord, V>(node: &r/Option<~TreeNode<K, V>>,
576
576
}
577
577
578
578
// Remove left horizontal link by rotating right
579
- fn skew<K : Ord , V >( mut node: ~ TreeNode < K , V > ) -> ~TreeNode <K , V > {
579
+ fn skew<K : Ord , V >( node: & mut ~TreeNode <K , V >) {
580
580
if node. left. map_default( false, |x| x. level == node. level) {
581
581
let mut save = node. left. swap_unwrap( ) ;
582
582
node. left <-> save. right; // save.right now None
583
- save. right = Some ( node) ;
584
- save
585
- } else {
586
- node // nothing to do
583
+ * node <-> save;
584
+ node. right = Some ( save) ;
587
585
}
588
586
}
589
587
590
588
// Remove dual horizontal link by rotating left and increasing level of
591
589
// the parent
592
- fn split<K : Ord , V >( mut node: ~ TreeNode < K , V > ) -> ~TreeNode <K , V > {
590
+ fn split<K : Ord , V >( node: & mut ~TreeNode <K , V >) {
593
591
if node. right. map_default( false,
594
592
|x| x. right. map_default( false, |y| y. level == node. level) ) {
595
593
let mut save = node. right. swap_unwrap( ) ;
596
594
node. right <-> save. left; // save.left now None
597
- save. left = Some ( node) ;
598
595
save. level += 1 ;
599
- save
600
- } else {
601
- node // nothing to do
596
+ * node <-> save;
597
+ node. left = Some ( save) ;
602
598
}
603
599
}
604
600
@@ -611,11 +607,15 @@ fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
611
607
let mut save = node. swap_unwrap( ) ;
612
608
if key < save. key {
613
609
let inserted = insert( & mut save. left, key, value) ;
614
- * node = Some ( split( skew( save) ) ) ; // re-balance, if necessary
610
+ skew( & mut save) ;
611
+ split( & mut save) ;
612
+ * node = Some ( save) ; // re-balance, if necessary
615
613
inserted
616
614
} else if save. key < key {
617
615
let inserted = insert( & mut save. right, key, value) ;
618
- * node = Some ( split( skew( save) ) ) ; // re-balance, if necessary
616
+ skew( & mut save) ;
617
+ split( & mut save) ;
618
+ * node = Some ( save) ; // re-balance, if necessary
619
619
inserted
620
620
} else {
621
621
save. key = key;
@@ -684,15 +684,24 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
684
684
do save. right . mutate |mut x| { x. level = save. level ; x }
685
685
}
686
686
687
- save = skew ( save) ;
687
+ skew ( & mut save) ;
688
+
689
+ match save. right {
690
+ Some ( ref mut right) => {
691
+ skew ( right) ;
692
+ match right. right {
693
+ Some ( ref mut x) => { skew ( x) } ,
694
+ None => ( )
695
+ }
696
+ }
697
+ None => ( )
698
+ }
688
699
689
- do save . right . mutate | mut right| {
690
- right = skew ( right ) ;
691
- right . right . mutate ( skew ) ;
692
- right
700
+ split ( & mut save ) ;
701
+ match save . right {
702
+ Some ( ref mut x ) => { split ( x ) } ,
703
+ None => ( )
693
704
}
694
- save = split ( save) ;
695
- save. right . mutate ( split) ;
696
705
}
697
706
698
707
* node = Some ( save) ;
0 commit comments