]> git.lizzy.rs Git - rust.git/commitdiff
smallintmap: add find_mut method
authorDaniel Micay <danielmicay@gmail.com>
Mon, 25 Mar 2013 00:35:23 +0000 (20:35 -0400)
committerDaniel Micay <danielmicay@gmail.com>
Mon, 25 Mar 2013 01:40:13 +0000 (21:40 -0400)
src/libstd/smallintmap.rs

index a559e7540d4146ce62cfcb39133f5d5b07143ab4..fffd6c9ee4fe34205e8203d8d4854101a7e79d1b 100644 (file)
@@ -86,7 +86,7 @@ fn each_value(&self, blk: &fn(value: &V) -> bool) {
         self.each(|&(_, v)| blk(v))
     }
 
-    /// Visit all key-value pairs in order
+    /// Iterate over the map and mutate the contained values
     fn mutate_values(&mut self, it: &fn(&uint, &'self mut V) -> bool) {
         for uint::range(0, self.v.len()) |i| {
             match self.v[i] {
@@ -96,7 +96,7 @@ fn mutate_values(&mut self, it: &fn(&uint, &'self mut V) -> bool) {
         }
     }
 
-    /// Iterate over the map and mutate the contained values
+    /// Return a reference to the value corresponding to the key
     fn find(&self, key: &uint) -> Option<&'self V> {
         if *key < self.v.len() {
             match self.v[*key] {
@@ -140,6 +140,18 @@ fn new() -> SmallIntMap<V> { SmallIntMap{v: ~[]} }
     fn get(&self, key: &uint) -> &'self V {
         self.find(key).expect("key not present")
     }
+
+    /// Return a mutable reference to the value corresponding to the key
+    fn find_mut(&mut self, key: &uint) -> Option<&'self mut V> {
+        if *key < self.v.len() {
+            match self.v[*key] {
+              Some(ref mut value) => Some(value),
+              None => None
+            }
+        } else {
+            None
+        }
+    }
 }
 
 pub impl<V:Copy> SmallIntMap<V> {
@@ -160,6 +172,20 @@ fn update(&mut self, key: uint, newval: V, ff: &fn(V, V) -> V) -> bool {
 #[cfg(test)]
 mod tests {
     use super::SmallIntMap;
+    use core::prelude::*;
+
+    #[test]
+    fn test_find_mut() {
+        let mut m = SmallIntMap::new();
+        fail_unless!(m.insert(1, 12));
+        fail_unless!(m.insert(2, 8));
+        fail_unless!(m.insert(5, 14));
+        let new = 100;
+        match m.find_mut(&5) {
+            None => fail!(), Some(x) => *x = new
+        }
+        assert_eq!(m.find(&5), Some(&new));
+    }
 
     #[test]
     fn test_len() {