about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorRoy Frostig <rfrostig@mozilla.com>2010-08-03 18:57:44 -0700
committerRoy Frostig <rfrostig@mozilla.com>2010-08-03 18:57:54 -0700
commit299657550e2bd2dcdec4b06d592dadb7ede4bdf1 (patch)
tree990164b540c63cb10809406e649e9a8377319dd9 /src/lib
parentc014748c0191b711e2adf5a5db224474ea4e75d3 (diff)
downloadrust-299657550e2bd2dcdec4b06d592dadb7ede4bdf1.tar.gz
rust-299657550e2bd2dcdec4b06d592dadb7ede4bdf1.zip
Have hashmap's insert method overwrite on existing-key insertion and return true iff overwrite did not occur.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/map.rs12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/lib/map.rs b/src/lib/map.rs
index c00ee75de12..f95741761c0 100644
--- a/src/lib/map.rs
+++ b/src/lib/map.rs
@@ -13,7 +13,7 @@ type hashfn[K] = fn(&K) -> uint;
 type eqfn[K] = fn(&K, &K) -> bool;
 
 type hashmap[K, V] = obj {
-  fn insert(&K key, &V val);
+  fn insert(&K key, &V val) -> bool;
   fn contains_key(&K key) -> bool;
   fn get(&K key) -> V;
   fn find(&K key) -> util.option[V];
@@ -80,6 +80,7 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
       alt (bkts.(j)) {
         case (some[K, V](k, _)) {
           if (eqer(key, k)) {
+            bkts.(j) = some[K, V](k, val);
             ret false;
           }
           i += 1u;
@@ -143,7 +144,7 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
                     mutable uint nelts,
                     util.rational lf)
   {
-    fn insert(&K key, &V val) {
+    fn insert(&K key, &V val) -> bool {
       let util.rational load = rec(num=(nelts + 1u) as int, den=nbkts as int);
       if (!util.rational_leq(load, lf)) {
         let uint nnewbkts = _int.next_power_of_two(nbkts + 1u);
@@ -154,8 +155,11 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
         let vec[mutable bucket[K, V]] newbkts = make_buckets[K, V](nnewbkts);
         rehash[K, V](hasher, eqer, bkts, nbkts, newbkts, nnewbkts);
       }
-      insert_common[K, V](hasher, eqer, bkts, nbkts, key, val);
-      nelts += 1u;
+      if (insert_common[K, V](hasher, eqer, bkts, nbkts, key, val)) {
+        nelts += 1u;
+        ret true;
+      }
+      ret false;
     }
 
     fn contains_key(&K key) -> bool {