|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: (* table.sml *)
3:
4: structure Table =
5: struct
6: datatype name = NIL | Name of string
7: datatype 'a table = Hashed of {table : (Symbol.symbol * 'a) list array ref,
8: elems : int ref, exn : exn, name : name}
9:
10: fun namednew(name, size, exn) =
11: Hashed {table=ref(array(size,nil)),elems=ref 0, exn = exn, name = Name name}
12:
13: fun new(size, exn) =
14: Hashed {table=ref(array(size,nil)),elems=ref 0, exn = exn, name = NIL}
15:
16: fun map (Hashed{table=ref a,exn,...}) (s: Symbol.symbol) =
17: let fun find ((s',x)::r) = if s' = s then x else find r
18: | find nil = raise exn
19: in find (a sub Bits.andb(Symbol.number s, (length a)-1))
20: end
21:
22: fun rem (Hashed{table=ref a,elems,...}) (s: Symbol.symbol) =
23: let fun f ((b as (s',_))::r) =
24: if s' = s then (dec elems; r) else b :: f r
25: | f nil = nil
26: val index = Bits.andb(Symbol.number s, (length a)-1)
27: in update(a, index, f(a sub index))
28: end
29:
30: fun app f (Hashed{table=ref a,...}) =
31: let fun zap 0 = ()
32: | zap n = let val m = n-1 in List.app f (a sub m); zap m end
33: in zap(length a)
34: end
35:
36: fun add (m as Hashed{table as ref a, elems, name, ...})
37: (v as (s: Symbol.symbol,j)) =
38: let val size = length a
39: val i = Symbol.number s
40: in if !elems <> size
41: then let val index = Bits.andb(i, size-1)
42: fun f nil = (inc elems; [v])
43: | f ((a as (s',j))::b) = if s=s' then v::b else a::f b
44: in update(a,index,f(a sub index))
45: end
46: else let val newsize = size+size
47: val newsize1 = newsize-1
48: val new = array(newsize,nil)
49: fun bucket n =
50: let fun add'(a,b,(v as (s,j))::rest) =
51: if Bits.andb(Symbol.number s, newsize1) = n
52: then add'(v::a,b,rest)
53: else add'(a,v::b,rest)
54: | add'(a,b,nil) =
55: (update(new,n,a);
56: update(new,n+size,b);
57: bucket(n+1))
58: in add'(nil,nil,a sub n)
59: end
60: in (case name
61: of NIL => ()
62: | Name name =>
63: (print("\nIncreasing size of table " ^ name ^ " to: ");
64: print newsize; print "\n"));
65: bucket 0 handle Subscript => ();
66: table := new;
67: add m v
68: end
69: end
70:
71: fun tableToList(Hashed{table,...})=
72: let val a = ! table;
73: val last = length a - 1
74: fun loop (0, [], acc) = acc
75: | loop (n, first::rest, acc) = loop(n, rest, first::acc)
76: | loop (n,[], acc) = loop(n-1, a sub (n-1), acc)
77: in loop(last,a sub last,[])
78: end
79:
80: end (* structure Table *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.