pavone@80: #{ pavone@80: hash <- { pavone@80: empty <- #{ pavone@80: empty? <- { true } pavone@80: } pavone@81: size <- 0 pavone@81: hashdiffs <- #[0] pavone@80: #{ pavone@80: buckets <- #[empty empty empty empty] pavone@125: size <- 0 pavone@80: contains? <- :object { pavone@80: hv <- object hash pavone@80: pavone@80: notdone <- true pavone@81: pavone@81: basehash <- hv pavone@80: i <- 0 pavone@80: ret <- false pavone@81: while: { if: notdone { i < (hashdiffs length) } } do: { pavone@81: hv <- basehash + (hashdiffs get: i) pavone@80: trunc <- hv % (buckets length) pavone@80: if: trunc < 0 { trunc <- 0 - trunc } pavone@80: bucketval <- (buckets get: trunc) pavone@80: if: (bucketval empty?) { pavone@80: notdone <- false pavone@80: } else: { pavone@80: if: (bucketval eq: hv) { pavone@80: ret <- true pavone@80: notdone <- false pavone@80: } pavone@80: } pavone@80: i <- i + 1 pavone@80: } pavone@80: ret pavone@80: } pavone@80: add <- :object { pavone@80: addHash: (object hash) pavone@80: } pavone@80: addHash <- :hv { pavone@80: makeBucket <- :hv { pavone@80: #{ pavone@80: empty? <- { false } pavone@80: v <- hv pavone@80: eq <- :other { v = other } pavone@80: } pavone@80: } pavone@80: notdone <- true pavone@81: basehash <- hv pavone@80: i <- 0 pavone@81: while: { if: notdone { i < (hashdiffs length) } } do: { pavone@81: hv <- basehash + (hashdiffs get: i) pavone@80: trunc <- hv % (buckets length) pavone@80: if: trunc < 0 { trunc <- 0 - trunc } pavone@80: bucketval <- (buckets get: trunc) pavone@80: if: (bucketval empty?) { pavone@81: size <- size + 1 pavone@80: buckets set: trunc (makeBucket: hv) pavone@80: notdone <- false pavone@80: } else: { pavone@80: if: (bucketval eq: hv) { pavone@80: notdone <- false pavone@80: } pavone@80: } pavone@80: i <- i + 1 pavone@80: } pavone@80: if: notdone { pavone@81: newsize <- (buckets length) * 3 + 1 pavone@81: lastdiff <- hashdiffs get: ((hashdiffs length) - 1) pavone@81: if: lastdiff <= 0 { pavone@81: hashdiffs append: ((0 - lastdiff) + 1) pavone@81: } else: { pavone@81: hashdiffs append: (0 - lastdiff) pavone@81: } pavone@80: newbucks <- #[] pavone@125: newbucks resize: newsize pavone@80: while: { (newbucks length) < newsize } do: { pavone@80: newbucks append: empty pavone@80: } pavone@80: oldbucks <- buckets pavone@80: buckets <- newbucks pavone@125: size <- 0 pavone@80: foreach: oldbucks :idx el { pavone@80: if: (not: (el empty?)) { pavone@80: addHash: (el v) pavone@80: } pavone@80: } pavone@80: addHash: hv pavone@80: } pavone@80: self pavone@80: } pavone@80: } pavone@80: } pavone@80: }