]> git.lizzy.rs Git - rust.git/commitdiff
Move levenshtein distance fn to core::str.
authorLuqman Aden <laden@csclub.uwaterloo.ca>
Mon, 25 Feb 2013 04:44:01 +0000 (20:44 -0800)
committerLuqman Aden <laden@csclub.uwaterloo.ca>
Wed, 27 Feb 2013 01:23:30 +0000 (17:23 -0800)
src/libcore/str.rs
src/librustc/middle/resolve.rs

index 3c15a89081d7f4ae37d7bd34201f1fdd55c657eb..92e980e34d08ffedea5cddfdddd936aa2f1b3165 100644 (file)
@@ -590,6 +590,40 @@ pub fn unshift_char(s: &mut ~str, ch: char) {
     result
 }
 
+/// Levenshtein Distance between two strings
+pub fn levdistance(s: &str, t: &str) -> uint {
+
+    let slen = str::len(s);
+    let tlen = str::len(t);
+
+    if slen == 0 { return tlen; }
+    if tlen == 0 { return slen; }
+
+    let mut dcol = vec::from_fn(tlen + 1, |x| x);
+
+    for str::each_chari(s) |i, sc| {
+
+        let mut current = i;
+        dcol[0] = current + 1;
+
+        for str::each_chari(t) |j, tc| {
+
+            let mut next = dcol[j + 1];
+
+            if sc == tc {
+                dcol[j + 1] = current;
+            } else {
+                dcol[j + 1] = ::cmp::min(current, next);
+                dcol[j + 1] = ::cmp::min(dcol[j + 1], dcol[j]) + 1;
+            }
+
+            current = next;
+        }
+    }
+
+    return dcol[tlen];
+}
+
 /**
  * Splits a string into a vector of the substrings separated by LF ('\n')
  */
index 3db328ceb916296d06ff689481708e7dab0ef85b..3f1e4dca3a19ac744a466c3b9bab490cff52b1ad 100644 (file)
@@ -4830,44 +4830,10 @@ fn find_best_match_for_name(@mut self, name: &str) -> Option<~str> {
             }
         }
 
-        // Levenshtein Distance between two strings
-        fn distance(s: &str, t: &str) -> uint {
-
-            let slen = str::len(s);
-            let tlen = str::len(t);
-
-            if slen == 0 { return tlen; }
-            if tlen == 0 { return slen; }
-
-            let mut dcol = vec::from_fn(tlen + 1, |x| x);
-
-            for str::each_chari(s) |i, sc| {
-
-                let mut current = i;
-                dcol[0] = current + 1;
-
-                for str::each_chari(t) |j, tc| {
-
-                    let mut next = dcol[j + 1];
-
-                    if sc == tc {
-                        dcol[j + 1] = current;
-                    } else {
-                        dcol[j + 1] = cmp::min(current, next);
-                        dcol[j + 1] = cmp::min(dcol[j + 1], dcol[j]) + 1;
-                    }
-
-                    current = next;
-                }
-            }
-
-            return dcol[tlen];
-        }
-
         let mut smallest = 0;
         for vec::eachi(maybes) |i, &other| {
 
-            values[i] = distance(name, other);
+            values[i] = str::levdistance(name, other);
 
             if values[i] <= values[smallest] {
                 smallest = i;