-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaatable.m
77 lines (68 loc) · 1.62 KB
/
aatable.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const VectorOfAny <- Vector.of[Any]
const AATable <- class AATable [size : Integer]
var currentsize : Integer <- size
var keys : VectorOfAny <- VectorOfAny.create[currentsize]
var values : VectorOfAny <- VectorOfAny.create[currentsize]
var count : Integer <- 0
export operation Insert [key : Any, value : Any]
var h : Integer <- 0
if count == currentsize then self.grow end if
loop
exit when h = count
if keys[h] == key then
values[h] <- value
return
end if
h <- h + 1
end loop
count <- count + 1
keys[h] <- key
values[h] <- value
end Insert
operation grow
const oldvalues <- values
const oldkeys <- keys
const oldsize <- currentsize
currentsize <- currentsize * 2
values <- VectorOfAny.create[currentsize]
keys <- VectorOfAny.create[currentsize]
var h : Integer <- 0
loop
exit when h = count
keys[h] <- oldkeys[h]
values[h] <- oldvalues[h]
h <- h + 1
end loop
end grow
export function Lookup [key : Any] -> [value : Any]
var h : Integer <- 0
loop
exit when h = count
if keys[h] == key then
value <- values[h]
return
end if
h <- h + 1
end loop
end Lookup
export operation Forget[key : Any]
var h : Integer <- 0
loop
exit when h = count
exit when keys[h] == key
h <- h + 1
end loop
if h < count then
count <- count - 1
loop
exit when h = count
keys[h] <- keys[h + 1]
values[h] <- values[h + 1]
h <- h + 1
end loop
keys[h] <- nil
values[h] <- nil
end if
end Forget
end AATable
export AATable