about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-04-22 01:06:20 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-04-22 01:06:20 -0700
commitd3eb3b42aa59c44c25c7f51cfa07a06d05b6a073 (patch)
tree83bd8dfb04f32dd94de64136a73fcc87355d24dc
parent117aff86884c2b6a6c8520b8bfbffdb5cadb930f (diff)
Minimize calls to hash function in map.rs
-rw-r--r--src/lib/map.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/lib/map.rs b/src/lib/map.rs
index 2c530f5bde4..6c7c0363254 100644
--- a/src/lib/map.rs
+++ b/src/lib/map.rs
@@ -46,18 +46,16 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
     // is always a power of 2), so that all buckets are probed for a
     // fixed key.
 
-    fn hashl[K](&hashfn[K] hasher, uint nbkts, &K key) -> uint {
-        ret (hasher(key) >>> (sys.rustrt.size_of[uint]() * 8u / 2u));
+    fn hashl(uint n, uint nbkts) -> uint {
+        ret (n >>> 16u);
     }
 
-    fn hashr[K](&hashfn[K] hasher, uint nbkts, &K key) -> uint {
-        ret ((((~ 0u) >>> (sys.rustrt.size_of[uint]() * 8u / 2u))
-              & hasher(key)) * 2u + 1u);
+    fn hashr(uint n, uint nbkts) -> uint {
+        ret ((((~ 0u) >>> 16u) & n) * 2u + 1u);
     }
 
-    fn hash[K](&hashfn[K] hasher, uint nbkts, &K key, uint i) -> uint {
-        ret (hashl[K](hasher, nbkts, key)
-             + i * hashr[K](hasher, nbkts, key)) % nbkts;
+    fn hash(uint h, uint nbkts, uint i) -> uint {
+        ret (hashl(h, nbkts) + i * hashr(h, nbkts)) % nbkts;
     }
 
     /**
@@ -73,8 +71,9 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
         -> bool
         {
             let uint i = 0u;
+            let uint h = hasher(key);
             while (i < nbkts) {
-                let uint j = hash[K](hasher, nbkts, key, i);
+                let uint j = hash(h, nbkts, i);
                 alt (bkts.(j)) {
                     case (some[K, V](?k, _)) {
                         if (eqer(key, k)) {
@@ -100,8 +99,9 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
         -> option.t[V]
         {
             let uint i = 0u;
+            let uint h = hasher(key);
             while (i < nbkts) {
-                let uint j = (hash[K](hasher, nbkts, key, i));
+                let uint j = (hash(h, nbkts, i));
                 alt (bkts.(j)) {
                     case (some[K, V](?k, ?v)) {
                         if (eqer(key, k)) {
@@ -189,8 +189,9 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
 
             fn remove(&K key) -> option.t[V] {
                 let uint i = 0u;
+                let uint h = hasher(key);
                 while (i < nbkts) {
-                    let uint j = (hash[K](hasher, nbkts, key, i));
+                    let uint j = (hash(h, nbkts, i));
                     alt (bkts.(j)) {
                         case (some[K, V](?k, ?v)) {
                             if (eqer(key, k)) {