about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-02-10 20:37:21 -0500
committerDaniel Micay <danielmicay@gmail.com>2013-02-10 20:47:22 -0500
commitf9c15de1fd271032ff44288fa2f0599edd9dd204 (patch)
tree96b06bf7615bac8af3c8feb7fdfc3075d1880f9d
parent9d7014e55c06a184b02ccf724497c4c72d4d2041 (diff)
downloadrust-f9c15de1fd271032ff44288fa2f0599edd9dd204.tar.gz
rust-f9c15de1fd271032ff44288fa2f0599edd9dd204.zip
treemap: use an &mut parameter for skew and split
results in a small performance improvement and reduces the compiled
code size
-rw-r--r--src/libstd/treemap.rs47
1 files changed, 28 insertions, 19 deletions
diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs
index d8deea60725..c3cb45a2bfb 100644
--- a/src/libstd/treemap.rs
+++ b/src/libstd/treemap.rs
@@ -576,29 +576,25 @@ pure fn each_reverse<K: Ord, V>(node: &r/Option<~TreeNode<K, V>>,
 }
 
 // Remove left horizontal link by rotating right
-fn skew<K: Ord, V>(mut node: ~TreeNode<K, V>) -> ~TreeNode<K, V> {
+fn skew<K: Ord, V>(node: &mut ~TreeNode<K, V>) {
     if node.left.map_default(false, |x| x.level == node.level) {
         let mut save = node.left.swap_unwrap();
         node.left <-> save.right; // save.right now None
-        save.right = Some(node);
-        save
-    } else {
-        node // nothing to do
+        *node <-> save;
+        node.right = Some(save);
     }
 }
 
 // Remove dual horizontal link by rotating left and increasing level of
 // the parent
-fn split<K: Ord, V>(mut node: ~TreeNode<K, V>) -> ~TreeNode<K, V> {
+fn split<K: Ord, V>(node: &mut ~TreeNode<K, V>) {
     if node.right.map_default(false,
       |x| x.right.map_default(false, |y| y.level == node.level)) {
         let mut save = node.right.swap_unwrap();
         node.right <-> save.left; // save.left now None
-        save.left = Some(node);
         save.level += 1;
-        save
-    } else {
-        node // nothing to do
+        *node <-> save;
+        node.left = Some(save);
     }
 }
 
@@ -611,11 +607,15 @@ fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
         let mut save = node.swap_unwrap();
         if key < save.key {
             let inserted = insert(&mut save.left, key, value);
-            *node = Some(split(skew(save))); // re-balance, if necessary
+            skew(&mut save);
+            split(&mut save);
+            *node = Some(save); // re-balance, if necessary
             inserted
         } else if save.key < key {
             let inserted = insert(&mut save.right, key, value);
-            *node = Some(split(skew(save))); // re-balance, if necessary
+            skew(&mut save);
+            split(&mut save);
+            *node = Some(save); // re-balance, if necessary
             inserted
         } else {
             save.key = key;
@@ -684,15 +684,24 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
                 do save.right.mutate |mut x| { x.level = save.level; x }
             }
 
-            save = skew(save);
+            skew(&mut save);
+
+            match save.right {
+              Some(ref mut right) => {
+                skew(right);
+                match right.right {
+                  Some(ref mut x) => { skew(x) },
+                  None => ()
+                }
+              }
+              None => ()
+            }
 
-            do save.right.mutate |mut right| {
-                right = skew(right);
-                right.right.mutate(skew);
-                right
+            split(&mut save);
+            match save.right {
+              Some(ref mut x) => { split(x) },
+              None => ()
             }
-            save = split(save);
-            save.right.mutate(split);
         }
 
         *node = Some(save);