<> <> <<>> <> <<>> PCMaps: CEDAR DEFINITIONS ~ BEGIN Map: TYPE = LONG POINTER TO MapRep; BytePC: TYPE = LONG CARDINAL; -- SIM <> NewMap: PROC [maxPC: BytePC, nullVal: WORD] RETURNS [map: Map]; Lookup: PROC [map: Map, pc: BytePC] RETURNS [val: WORD]; Insert: PROC [map: Map, pc: BytePC, val: WORD]; <> MapRep: PRIVATE TYPE = MONITORED RECORD [ nEntries: CARD16, table: HighOrderTable, nullVal: WORD, ref: REF MapRep -- a self-reference to make it uncollectable ]; HighOrderTable: PRIVATE TYPE = LONG POINTER TO HighOrderTableRep; HighOrderTableRep: PRIVATE TYPE = RECORD [ s: SEQUENCE COMPUTED CARDINAL OF LowOrderTable ]; LowOrderTable: PRIVATE TYPE = LONG POINTER TO LowOrderTableRep; LowOrderTableRep: PRIVATE TYPE = RECORD [ maxEntries: CARD16, nEntries: CARD16, s: SEQUENCE COMPUTED CARDINAL OF MapEntry ]; MapEntry: TYPE = RECORD [ lowOrderPC: CARD16, value: WORD ]; END.