about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/treemap.rs23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs
index c3cb45a2bfb..4b02a13583f 100644
--- a/src/libstd/treemap.rs
+++ b/src/libstd/treemap.rs
@@ -600,29 +600,28 @@ fn split<K: Ord, V>(node: &mut ~TreeNode<K, V>) {
 
 fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
                      value: V) -> bool {
-    if node.is_none() {
-        *node = Some(~TreeNode::new(key, value));
-        true
-    } else {
-        let mut save = node.swap_unwrap();
+    match *node {
+      Some(ref mut save) => {
         if key < save.key {
             let inserted = insert(&mut save.left, key, value);
-            skew(&mut save);
-            split(&mut save);
-            *node = Some(save); // re-balance, if necessary
+            skew(save);
+            split(save);
             inserted
         } else if save.key < key {
             let inserted = insert(&mut save.right, key, value);
-            skew(&mut save);
-            split(&mut save);
-            *node = Some(save); // re-balance, if necessary
+            skew(save);
+            split(save);
             inserted
         } else {
             save.key = key;
             save.value = value;
-            *node = Some(save);
             false
         }
+      }
+      None => {
+       *node = Some(~TreeNode::new(key, value));
+        true
+      }
     }
 }