From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- appl/lib/tables.b | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 appl/lib/tables.b (limited to 'appl/lib/tables.b') diff --git a/appl/lib/tables.b b/appl/lib/tables.b new file mode 100644 index 00000000..a3ea38d2 --- /dev/null +++ b/appl/lib/tables.b @@ -0,0 +1,105 @@ +implement Tables; +include "tables.m"; + +Table[T].new(nslots: int, nilval: T): ref Table[T] +{ + if(nslots == 0) + nslots = 13; + return ref Table[T](array[nslots] of list of (int, T), nilval); +} + +Table[T].add(t: self ref Table[T], id: int, x: T): int +{ + slot := id % len t.items; + for(q := t.items[slot]; q != nil; q = tl q) + if((hd q).t0 == id) + return 0; + t.items[slot] = (id, x) :: t.items[slot]; + return 1; +} + +Table[T].del(t: self ref Table[T], id: int): int +{ + slot := id % len t.items; + + p: list of (int, T); + r := 0; + for(q := t.items[slot]; q != nil; q = tl q){ + if((hd q).t0 == id){ + p = joinip(p, tl q); + r = 1; + break; + } + p = hd q :: p; + } + t.items[slot] = p; + return r; +} + +Table[T].find(t: self ref Table[T], id: int): T +{ + for(p := t.items[id % len t.items]; p != nil; p = tl p) + if((hd p).t0 == id) + return (hd p).t1; + return t.nilval; +} + +Strhash[T].new(nslots: int, nilval: T): ref Strhash[T] +{ + if(nslots == 0) + nslots = 13; + return ref Strhash[T](array[nslots] of list of (string, T), nilval); +} + +Strhash[T].add(t: self ref Strhash, id: string, x: T) +{ + slot := hash(id, len t.items); + t.items[slot] = (id, x) :: t.items[slot]; +} + +Strhash[T].del(t: self ref Strhash, id: string) +{ + slot := hash(id, len t.items); + + p: list of (string, T); + for(q := t.items[slot]; q != nil; q = tl q) + if((hd q).t0 != id) + p = hd q :: p; + t.items[slot] = p; +} + +Strhash[T].find(t: self ref Strhash, id: string): T +{ + for(p := t.items[hash(id, len t.items)]; p != nil; p = tl p) + if((hd p).t0 == id) + return (hd p).t1; + return t.nilval; +} + +hash(s: string, n: int): int +{ + h := 0; + m := len s; + for(i:=0; i len y) + (x, y) = (y, x); + for(; x != nil; x = tl x) + y = hd x :: y; + return y; +} -- cgit v1.2.3