diff modules/sets.tp @ 126:a2d2d8e09291

Merge
author Mike Pavone <pavone@retrodev.com>
date Mon, 05 Aug 2013 23:37:17 -0700
parents 6f8d868e8da0 a905e13db753
children
line wrap: on
line diff
--- a/modules/sets.tp	Mon Aug 05 23:36:18 2013 -0700
+++ b/modules/sets.tp	Mon Aug 05 23:37:17 2013 -0700
@@ -3,6 +3,8 @@
 		empty <- #{
 			empty? <- { true }
 		}
+		size <- 0
+		hashdiffs <- #[0]
 		#{
 			buckets <- #[empty empty empty empty]
 			size <- 0
@@ -10,11 +12,12 @@
 				hv <- object hash
 				
 				notdone <- true
-				hashes <- #[hv (hv + 1) (hv - 1)]
+				
+				basehash <- hv
 				i <- 0
 				ret <- false
-				while: { if: notdone { i < 3 } } do: {
-					hv <- hashes get: i
+				while: { if: notdone { i < (hashdiffs length) } } do: {
+					hv <- basehash + (hashdiffs get: i)
 					trunc <- hv % (buckets length)
 					if: trunc < 0 { trunc <- 0 - trunc }
 					bucketval <- (buckets get: trunc)	
@@ -42,10 +45,10 @@
 					}
 				}
 				notdone <- true
-				hashes <- #[hv (hv + 1) (hv - 1)]
+				basehash <- hv
 				i <- 0
-				while: { if: notdone { i < 3 } } do: {
-					hv <- hashes get: i
+				while: { if: notdone { i < (hashdiffs length) } } do: {
+					hv <- basehash + (hashdiffs get: i)
 					trunc <- hv % (buckets length)
 					if: trunc < 0 { trunc <- 0 - trunc }
 					bucketval <- (buckets get: trunc)	
@@ -61,7 +64,13 @@
 					i <- i + 1
 				}
 				if: notdone {
-					newsize <- (buckets length) * 3
+					newsize <- (buckets length) * 3 + 1
+					lastdiff <- hashdiffs get: ((hashdiffs length) - 1)
+					if: lastdiff <= 0 {
+						hashdiffs append: ((0 - lastdiff) + 1)
+					} else: {
+						hashdiffs append: (0 - lastdiff)
+					}
 					newbucks <- #[]
 					newbucks resize: newsize
 					while: { (newbucks length) < newsize } do: {