From 03981b54f6a24893399a1c4521d2405b85986102 Mon Sep 17 00:00:00 2001 From: Alexis Beingessner Date: Tue, 8 Jul 2014 20:09:21 -0400 Subject: [PATCH] Removing recursion from find_mut in treemap --- src/libcollections/treemap.rs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/libcollections/treemap.rs b/src/libcollections/treemap.rs index becceffe6d027..cc51d0fe1be8c 100644 --- a/src/libcollections/treemap.rs +++ b/src/libcollections/treemap.rs @@ -89,7 +89,7 @@ impl Mutable for TreeMap { impl Map for TreeMap { fn find<'a>(&'a self, key: &K) -> Option<&'a V> { - let mut current: &'a Option>> = &self.root; + let mut current = &self.root; loop { match *current { Some(ref r) => { @@ -108,7 +108,20 @@ impl Map for TreeMap { impl MutableMap for TreeMap { #[inline] fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V> { - find_mut(&mut self.root, key) + let mut current = &mut self.root; + loop { + let temp = current; // hack to appease borrowck + match *temp { + Some(ref mut r) => { + match key.cmp(&r.key) { + Less => current = &mut r.left, + Greater => current = &mut r.right, + Equal => return Some(&mut r.value) + } + } + None => return None + } + } } fn swap(&mut self, key: K, value: V) -> Option { @@ -840,21 +853,6 @@ fn split(node: &mut Box>) { } } -fn find_mut<'r, K: Ord, V>(node: &'r mut Option>>, - key: &K) - -> Option<&'r mut V> { - match *node { - Some(ref mut x) => { - match key.cmp(&x.key) { - Less => find_mut(&mut x.left, key), - Greater => find_mut(&mut x.right, key), - Equal => Some(&mut x.value), - } - } - None => None - } -} - fn insert(node: &mut Option>>, key: K, value: V) -> Option { match *node {