comparison modules/sets.tp @ 125:6f8d868e8da0

Add size to set implementation
author Mike Pavone <pavone@retrodev.com>
date Mon, 05 Aug 2013 23:36:18 -0700
parents cbc92ee13f35
children a2d2d8e09291
comparison
equal deleted inserted replaced
80:cbc92ee13f35 125:6f8d868e8da0
3 empty <- #{ 3 empty <- #{
4 empty? <- { true } 4 empty? <- { true }
5 } 5 }
6 #{ 6 #{
7 buckets <- #[empty empty empty empty] 7 buckets <- #[empty empty empty empty]
8 size <- 0
8 contains? <- :object { 9 contains? <- :object {
9 hv <- object hash 10 hv <- object hash
10 11
11 notdone <- true 12 notdone <- true
12 hashes <- #[hv (hv + 1) (hv - 1)] 13 hashes <- #[hv (hv + 1) (hv - 1)]
47 hv <- hashes get: i 48 hv <- hashes get: i
48 trunc <- hv % (buckets length) 49 trunc <- hv % (buckets length)
49 if: trunc < 0 { trunc <- 0 - trunc } 50 if: trunc < 0 { trunc <- 0 - trunc }
50 bucketval <- (buckets get: trunc) 51 bucketval <- (buckets get: trunc)
51 if: (bucketval empty?) { 52 if: (bucketval empty?) {
53 size <- size + 1
52 buckets set: trunc (makeBucket: hv) 54 buckets set: trunc (makeBucket: hv)
53 notdone <- false 55 notdone <- false
54 } else: { 56 } else: {
55 if: (bucketval eq: hv) { 57 if: (bucketval eq: hv) {
56 notdone <- false 58 notdone <- false
59 i <- i + 1 61 i <- i + 1
60 } 62 }
61 if: notdone { 63 if: notdone {
62 newsize <- (buckets length) * 3 64 newsize <- (buckets length) * 3
63 newbucks <- #[] 65 newbucks <- #[]
66 newbucks resize: newsize
64 while: { (newbucks length) < newsize } do: { 67 while: { (newbucks length) < newsize } do: {
65 newbucks append: empty 68 newbucks append: empty
66 } 69 }
67 oldbucks <- buckets 70 oldbucks <- buckets
68 buckets <- newbucks 71 buckets <- newbucks
72 size <- 0
69 foreach: oldbucks :idx el { 73 foreach: oldbucks :idx el {
70 if: (not: (el empty?)) { 74 if: (not: (el empty?)) {
71 addHash: (el v) 75 addHash: (el v)
72 } 76 }
73 } 77 }