DIRECTORY AbSets, Atom, Basics, Rope, RopeHash, SetBasics; SetBasicsImpl: CEDAR MONITOR LOCKS lp USING lp: LockPtr IMPORTS Basics, Rope, RopeHash, SetBasics EXPORTS SetBasics, AbSets = BEGIN OPEN SetBasics; LockPtr: TYPE ~ LONG POINTER TO MONITORLOCK; noRef: PUBLIC NoRef ~ NEW [NoReferent]; noValue: PUBLIC Value ~ [ra: noRef, i: 0]; noMaybe: PUBLIC MaybeValue ~ [found: FALSE, it: noValue]; fullInterval: PUBLIC Interval ~ ALL[noValue]; BasicContains: PROC [data: REF ANY, v: Value] RETURNS [BOOL] --TestProc-- ~ {RETURN[TRUE]}; refs: PUBLIC Space ~ NEW [SpacePrivate _ [Contains: BasicContains, Equal: RefsEqual, Hash: RefsHash, Compare: RefsCompare, name: "refs"]]; RefsEqual: PROC [data: REF ANY, v1, v2: Value] RETURNS [BOOL] --EqualProc-- ~ {RETURN [v1.ra=v2.ra]}; RefsHash: PROC [data: REF ANY, v: Value] RETURNS [CARDINAL] --HashProc-- ~ {RETURN HashRefI[v.ra]}; RefsCompare: PROC [data: REF ANY, v1, v2: Value] RETURNS [Comparison] --CompareProc-- ~ {RETURN CompareRefI[v1.ra, v2.ra]}; ints: PUBLIC Space ~ NEW [SpacePrivate _ [Contains: BasicContains, Equal: IntsEqual, Hash: IntsHash, Compare: IntsCompare, name: "ints"]]; IntsEqual: PROC [data: REF ANY, v1, v2: Value] RETURNS [BOOL] --EqualProc-- ~ {RETURN [v1.i=v2.i]}; IntsHash: PROC [data: REF ANY, v: Value] RETURNS [CARDINAL] --HashProc-- ~ {RETURN [HashIntI[v.i]]}; IntsCompare: PROC [data: REF ANY, v1, v2: Value] RETURNS [Comparison] --CompareProc-- ~ {RETURN CompareIntI[v1.i, v2.i]}; ropes: PUBLIC ARRAY --case matters--BOOL OF Space ~ [ FALSE: NEW [SpacePrivate _ [Contains: RopesContains, Equal: RopesEqual, Hash: RopesHash, Compare: RopesCompare, name: "ropes mod case", data: NEW [BOOL _ FALSE]]], TRUE: NEW [SpacePrivate _ [Contains: RopesContains, Equal: RopesEqual, Hash: RopesHash, Compare: RopesCompare, name: "ropes with case", data: NEW [BOOL _ TRUE]]]]; RopesContains: PROC [data: REF ANY, v: Value] RETURNS [BOOL] ~ { RETURN [WITH v.ra SELECT FROM x: ROPE => TRUE, ENDCASE => FALSE]}; RopesHash: PROC [data: REF ANY, v: Value] RETURNS [CARDINAL] ~ { r: ROPE ~ NARROW[v.VA]; case: REF BOOL ~ NARROW[data]; RETURN [RopeHash.FromRope[r, case^]]}; RopesEqual: PROC [data: REF ANY, v1, v2: Value] RETURNS [BOOL] ~ { r1: ROPE ~ NARROW[v1.VA]; r2: ROPE ~ NARROW[v2.VA]; case: REF BOOL ~ NARROW[data]; RETURN r1.Equal[r2, case^]}; RopesCompare: PROC [data: REF ANY, v1, v2: Value] RETURNS [Comparison] ~ { r1: ROPE ~ NARROW[v1.VA]; r2: ROPE ~ NARROW[v2.VA]; case: REF BOOL ~ NARROW[data]; RETURN r1.Compare[r2, case^]}; spaceSpace: PUBLIC Space ~ NEW [SpacePrivate _ [Contains: SpacesContains, Equal: RefsEqual, Hash: RefsHash, Compare: RefsCompare, name: "spaces"]]; SpacesContains: PROC [data: REF ANY, v: Value] RETURNS [BOOL] ~ { RETURN [WITH v.ra SELECT FROM x: Space => TRUE, ENDCASE => FALSE]}; UpdateSpaceOther: PUBLIC PROC [s: Space, Update: PROC [Atom.PropList] RETURNS [Atom.PropList]] ~ { WithLock: ENTRY PROC [lp: LockPtr] ~ { ENABLE UNWIND => NULL; s.other _ Update[s.other]; RETURN}; TRUSTED {WithLock[@s.LOCK]}; RETURN}; Lexer: TYPE ~ REF LexerPrivate; LexerPrivate: TYPE ~ RECORD [prefix, repeat: SpaceList]; CreateLORASpace: PUBLIC PROC [prefix, repeat: SpaceList] RETURNS [space: Space] ~ { Fmt: PROC [sl: SpaceList] RETURNS [rope: ROPE _ NIL] ~ { FOR sl _ sl, sl.rest WHILE sl#NIL DO rope _ IF rope=NIL THEN sl.first.name ELSE rope.Cat[", ", sl.first.name]; ENDLOOP; RETURN}; space _ NEW [SpacePrivate _ [ Contains: LORAContains, Equal: LORAEqual, Hash: LORAHash, Compare: LORACompare, name: Rope.Cat["LORA space [", Fmt[prefix], "] [", Fmt[repeat], "]"], data: NEW [LexerPrivate _ [prefix, repeat]] ]]; RETURN}; LORAContains: PROC [data: REF ANY, v: Value] RETURNS [BOOL] ~ { RETURN [WITH v.ra SELECT FROM x: LORA => TRUE, ENDCASE => FALSE]}; LORAHash: PROC [data: REF ANY, v: Value] RETURNS [hash: CARDINAL _ 0] ~ { lr: Lexer ~ NARROW[data]; sl: SpaceList _ lr.prefix; FOR l: LORA _ NARROW[v.ra], l.rest WHILE l # NIL DO IF sl=NIL THEN {sl _ lr.repeat; IF sl=NIL THEN ERROR}; hash _ hash*5 + sl.first.SHash[AV[l.first]]; sl _ sl.rest; ENDLOOP; RETURN}; LORAEqual: PROC [data: REF ANY, v1, v2: Value] RETURNS [BOOL] ~ { RETURN [LORACompare[data, v1, v2]=equal]}; LORACompare: PROC [data: REF ANY, v1, v2: Value] RETURNS [c: Basics.Comparison _ equal] ~ { lr: Lexer ~ NARROW[data]; l1: LORA _ NARROW[v1.VA]; l2: LORA _ NARROW[v2.VA]; sl: SpaceList _ lr.prefix; WHILE l1#NIL AND l2#NIL DO IF sl=NIL THEN {sl _ lr.repeat; IF sl=NIL THEN ERROR}; IF (c _ sl.first.SCompare[AV[l1.first], AV[l2.first]])#equal THEN RETURN; l1 _ l1.rest; l2 _ l2.rest; sl _ sl.rest; ENDLOOP; RETURN [SELECT TRUE FROM l1#NIL => greater, l2#NIL => less, ENDCASE => equal]; }; SpaceOrder: PUBLIC PROC [space: Space] RETURNS [Order] ~ { RETURN [[space.Compare, space.data]]}; END. \SetBasicsImpl.Mesa Last tweaked by Mike Spreitzer on December 21, 1987 3:45:57 pm PST Κα– "cedar" style˜code™K™B—K˜KšΟk œ1˜:K˜šΟn œœ˜Kšœœ ˜Kšœ"˜)Kšœ˜K˜—K˜Kšœœ ˜K˜Kš œ œœœœ œ˜,K˜Kšœœ œ˜'Kšœ œ˜*Kšœ œœ˜9Kšœœ œ ˜-K˜Kšž œœœœ œœΟc œœœ˜[K˜Kš œœ œžœžœ žœ žœ˜ŠK˜Kšž œœœœœœŸ œœ˜eKšžœœœœ œœŸ œœ˜cKšž œœœœœŸœœ˜{K˜Kš œœ œžœžœ žœ žœ˜ŠK˜Kšž œœœœœœŸ œœ˜cKšžœœœœ œœŸ œœ˜dKšž œœœœœŸœœ˜yK˜š œœœŸœœ ˜5Kšœœžœžœžœ žœ.œœœ˜£Kšœœžœžœžœ žœ/œœœ˜£—K˜š ž œœœœ œœ˜@šœœœ˜Kšœœœ˜Kšœœ˜——K˜š ž œœœœ œœ˜@Kšœœœœ˜Kšœœœœ˜Kšœ ˜&—K˜š ž œœœœœœ˜BKšœœœœ˜Kšœœœœ˜Kšœœœœ˜Kšœ˜—K˜š ž œœœœœ˜JKšœœœœ˜Kšœœœœ˜Kšœœœœ˜Kšœ˜—K˜Kš œ œ œžœžœ žœ žœ ˜“K˜š žœœœœ œœ˜Ašœœœ˜Kšœ œ˜Kšœœ˜——K˜š žœœœ žœœœ˜bšžœœœ˜&Kšœœœ˜Kšœ˜Kšœ˜—Kšœœ˜Kšœ˜—K˜Kšœœœ˜Kšœœœ˜8K˜šžœœœœ˜Sš žœœœœœ˜8šœœœ˜$Kš œœœœœ˜IKšœ˜—Kšœ˜—šœœ˜Kšžœ˜Kšžœ ˜Kšžœ ˜Kšžœ˜K˜EKšœœ"˜+K˜—Kšœ˜—K˜š ž œœœœ œœ˜?šœœœ˜Kšœœœ˜Kšœœ˜——K˜š žœœœœ œœ ˜IKšœ œ˜Kšœ˜š œœœœœ˜3Kšœœœœœœœ˜6Kšœœ ˜,K˜ Kšœ˜—Kšœ˜—K˜š ž œœœœœœ˜AKšœ$˜*—K˜š ž œœœœœ#˜[Kšœ œ˜Kšœœœœ˜Kšœœœœ˜Kšœ˜š œœœœ˜Kšœœœœœœœ˜6Kš œœ œœœ˜IK˜ K˜ K˜ Kšœ˜—šœœœ˜Kšœœ ˜Kšœœ ˜Kšœ ˜—K˜—K˜šž œœœœ ˜:Kšœ ˜&—K˜Kšœ˜—…—¬ι