<<>> <> <> <> <> <<>> <> DIRECTORY Atom USING [ GetProp, PutProp ], CardTab USING [Create, Delete, Fetch, Insert, Ref], RefID; RefIDImpl: CEDAR PROGRAM IMPORTS Atom, CardTab EXPORTS RefID = BEGIN OPEN RefID; TableSize: NAT = 2039; <<2039 is a good candidate because it is prime and is large enough that collisions should be rare.>> refIDTable: CardTab.Ref; Seal: PUBLIC PROC[r: REF] RETURNS [ID] = TRUSTED { <> id: ID = LOOPHOLE[r]; IF r=NIL THEN RETURN[nullID]; [] ¬ CardTab.Insert[refIDTable, id, r]; RETURN[id]; }; <> <> <<>> Unseal: PUBLIC PROC[id: ID] RETURNS [REF] = { <> RETURN[CardTab.Fetch[refIDTable, id].val]; }; Release: PUBLIC PROC[id: ID] RETURNS[existed: BOOL] = { <> RETURN[CardTab.Delete[refIDTable, id]]; }; <> refIDTable ¬ NARROW[Atom.GetProp[$RefIDTable, $refIDTable]]; IF refIDTable = NIL THEN { refIDTable ¬ CardTab.Create[TableSize]; Atom.PutProp[$RefIDTable, $refIDTable, refIDTable]; }; END. <<>>