<<--File: OrderedSymbolTableRefImpl.mesa>> <> <> DIRECTORY List, OrderedSymbolTableRef; OrderedSymbolTableRefImpl: CEDAR PROGRAM IMPORTS List EXPORTS OrderedSymbolTableRef = BEGIN OPEN OrderedSymbolTableRef; Table: TYPE = REF Rep; Rep: PUBLIC TYPE = RECORD [compare: CompareProc, items: LIST OF REF ANY]; CreateTable: PUBLIC PROC [compare: CompareProc] RETURNS [Table] ={ RETURN [NEW[Rep _ [compare: compare, items: NIL]]] }; --CreateTable Insert: PUBLIC PROC[tab: Table, item: REF ANY] ={ compare: CompareProc _ tab.compare; IF List.Memb[item, tab.items] THEN RETURN; IF tab.items = NIL OR compare[item, tab.items.first] = less THEN tab.items _ CONS[item, tab.items] ELSE { FOR l: LIST OF REF ANY _ tab.items, l.rest UNTIL l = NIL DO IF l.rest = NIL OR compare[item, l.rest.first] = less THEN {l.rest _ CONS[item, l.rest]; EXIT} ENDLOOP;} };-- Insert DestroyTable: PUBLIC PROC[tab: Table] = { tab.compare _ NIL; tab.items _ NIL; }; --DestroyTable DeleteAllItems: PUBLIC PROC[tab: Table] = { tab.items _ NIL;};--DeleteAllItems LookupSmallest: PUBLIC PROC [tab: Table] RETURNS [REF ANY] = { RETURN[tab.items.first] }; --LookupSmallest LookupNextLarger: PUBLIC PROC [tab: Table, item: REF ANY] RETURNS [REF ANY] = { nextLarger: REF ANY _ NIL; FOR l: LIST OF REF ANY _ tab.items, l.rest UNTIL l = NIL DO IF item = l.first AND l.rest # NIL THEN {nextLarger _ l.rest.first; EXIT}; ENDLOOP; RETURN [nextLarger] }; --LookupNextLarger EnumerateIncreasing: PUBLIC PROC[tab: Table, action: EachItemAction] = { FOR l: LIST OF REF ANY _ tab.items, l.rest UNTIL l = NIL DO IF action[l.first] THEN EXIT; ENDLOOP; }; --EnumerateIncreasing Size: PUBLIC PROC [tab: Table] RETURNS [INT] ={ RETURN [List.Length[tab.items]] }; --Size END.