diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/alphabet/extvalues.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/alphabet/extvalues.b')
| -rw-r--r-- | appl/alphabet/extvalues.b | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/appl/alphabet/extvalues.b b/appl/alphabet/extvalues.b new file mode 100644 index 00000000..67d4833f --- /dev/null +++ b/appl/alphabet/extvalues.b @@ -0,0 +1,49 @@ +implement Extvalues; +include "sys.m"; +include "draw.m"; +include "sh.m"; +include "alphabet/reports.m"; +include "alphabet.m"; + +Values[V].new(): ref Values[V] +{ + v: V; + return ref Values[V](chan[1] of int, array[4] of {* => (0, v)}, 0::1::2::3::nil); +} + +Values[V].add(vals: self ref Values, v: V): int +{ + vals.lock <-= 1; + if(vals.freeids == nil){ + n := len vals.v; + vals.v = (array[len vals.v * 3 / 2] of (int, V))[0:] = vals.v; + for(; n < len vals.v; n++) + vals.freeids = n :: vals.freeids; + } + id := hd vals.freeids; + vals.freeids = tl vals.freeids; + vals.v[id] = (1, v); +#(load Sys Sys->PATH)->print("add %d\n", id); + <-vals.lock; + return id; +} + +Values[V].inc(vals: self ref Values, id: int) +{ + vals.lock <-= 1; + vals.v[id].t0++; +#(load Sys Sys->PATH)->print("inc %d -> %d\n", id, vals.v[id].t0); + <-vals.lock; +} + +Values[V].del(vals: self ref Values, id: int) +{ + vals.lock <-= 1; + if(--vals.v[id].t0 == 0){ + vals.v[id].t1 = nil; + vals.freeids = id :: vals.freeids; + } +#(load Sys Sys->PATH)->print("del %d -> %d\n", id, vals.v[id].t0); + <-vals.lock; +} + |
