about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-10-21 12:21:27 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-10-21 12:21:27 +0200
commit4ebbbe597e44dbed0da3027fbf4e564390e0daeb (patch)
tree688153be857cd96a9ea940b0d697b25f1f71d384 /src/lib
parent9bb4595c534ffcd0731ed778beb62bb80d7f9217 (diff)
downloadrust-4ebbbe597e44dbed0da3027fbf4e564390e0daeb.tar.gz
rust-4ebbbe597e44dbed0da3027fbf4e564390e0daeb.zip
Move hash table iteration over to block-taking functions
Issue #1056
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/map.rs25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/lib/map.rs b/src/lib/map.rs
index 3445f4b6c82..ef5e8acae46 100644
--- a/src/lib/map.rs
+++ b/src/lib/map.rs
@@ -14,8 +14,9 @@ type hashmap<K, V> =
         fn find(K) -> option::t<V>;
         fn remove(K) -> option::t<V>;
         fn rehash();
-        iter items() -> @{key: K, val: V};
-        iter keys() -> K;
+        fn items(block(K, V));
+        fn keys(block(K));
+        fn values(block(V));
     };
 type hashset<K> = hashmap<K, ()>;
 
@@ -111,8 +112,7 @@ fn mk_hashmap<@K, @V>(hasher: hashfn<K>, eqer: eqfn<K>) -> hashmap<K, V> {
             }
         }
     }
-    obj hashmap<@K,
-                @V>(hasher: hashfn<K>,
+    obj hashmap<@K, @V>(hasher: hashfn<K>,
                     eqer: eqfn<K>,
                     mutable bkts: [mutable bucket<K, V>],
                     mutable nbkts: uint,
@@ -177,14 +177,19 @@ fn mk_hashmap<@K, @V>(hasher: hashfn<K>, eqer: eqfn<K>) -> hashmap<K, V> {
             rehash(hasher, eqer, bkts, nbkts, newbkts, nbkts);
             bkts = newbkts;
         }
-        iter items() -> @{key: K, val: V} {
-            for b: bucket<K, V> in bkts {
-                alt b { some(k, v) { put @{key: k, val: v}; } _ { } }
+        fn items(it: block(K, V)) {
+            for b in bkts {
+                alt b { some(k, v) { it(copy k, copy v); } _ { } }
             }
         }
-        iter keys() -> K {
-            for b: bucket<K, V> in bkts {
-                alt b { some(k, _) { put k; } _ { } }
+        fn keys(it: block(K)) {
+            for b in bkts {
+                alt b { some(k, _) { it(copy k); } _ { } }
+            }
+        }
+        fn values(it: block(V)) {
+            for b in bkts {
+                alt b { some(_, v) { it(copy v); } _ { } }
             }
         }
     }