DIRECTORY UnsafeStorage USING [GetSystemUZone, NewUObject], RelationDefs: FROM "RelationDefs"; Relations: PROGRAM IMPORTS UnsafeStorage EXPORTS RelationDefs = BEGIN OPEN RelationDefs; UCZone: UNCOUNTED ZONE _ UnsafeStorage.GetSystemUZone[]; Allocate: PROCEDURE[nwords: CARDINAL] RETURNS[LONG POINTER] = BEGIN RETURN[UnsafeStorage.NewUObject[nwords,UCZone]]; END; Free: PROCEDURE[ptr: LONG POINTER] ={ IF ptr#NIL THEN UCZone.FREE[@ptr]; }; CreateRelation: PUBLIC PROCEDURE RETURNS [relation: Relation] = BEGIN relation _ Allocate[SIZE[RelationHead]]; relation.first _ NIL; END; AddPair: PUBLIC PROCEDURE [relation: Relation, left, right: CARDINAL] = BEGIN pair: LONG POINTER TO Pair _ Allocate[SIZE[Pair]]; pair.left _ left; pair.right _ right; pair.link _ relation.first; relation.first _ pair; END; Left: PUBLIC PROCEDURE[relation: Relation, right: CARDINAL] RETURNS [left: CARDINAL] = BEGIN IsRight: PROCEDURE [leftPart, rightPart: CARDINAL] = BEGIN IF right=rightPart THEN left_leftPart; END; left_notFound; ForAllPairs[relation, IsRight]; END; Right: PUBLIC PROCEDURE[relation: Relation, left: CARDINAL] RETURNS [right: CARDINAL] = BEGIN IsLeft: PROCEDURE [leftPart, rightPart: CARDINAL] = BEGIN IF left=leftPart THEN right_rightPart; END; right_notFound; ForAllPairs[relation, IsLeft]; END; ForAllPairs: PUBLIC PROCEDURE[relation: Relation, do: PROCEDURE[leftPart, rightPart: CARDINAL]] = BEGIN pair: LONG POINTER TO Pair _ NIL; FOR pair _ relation.first, pair.link UNTIL pair=NIL DO do[pair.left, pair.right] ENDLOOP; END; DestroyRelation: PUBLIC PROCEDURE[relation: Relation] = BEGIN pair, next: LONG POINTER TO Pair _ NIL; FOR pair _ relation.first, next UNTIL pair=NIL DO next _ pair.link; Free[pair]; ENDLOOP; Free[relation]; END; END. žCompiler Relations/n Tiberi November 13, 1979 11:38 AM Ordered pairs; building and searching Last Edited by: Stone, September 19, 1985 12:23:31 pm PDT Ê4˜J˜Jšœ™Jšœ"™"Jšœ%™%Jšœ9™9J˜šÏk ˜ Jšœœ˜1Jšœœ˜"—J˜šœ ˜Jšœ˜Jšœ˜—Jšœœ˜J˜Jšœ œœ˜8J˜JšÏnœ œ œœœœ œ*œ˜yJ˜Jšžœ œœœœœœœ ˜LJ˜Jšžœœ œœ˜?Jš˜Jšœœ˜(Jšœœ˜Jšœ˜J˜šžœœ œ˜.Jšœ œ˜—Jš˜Jš œœœœœ˜2J˜%J˜J˜Jšœ˜J˜šžœœ œœ˜;Jšœœ˜—Jš˜šžœ œœ˜4Jš˜Jšœœ˜&Jšœ˜—J˜J˜Jšœ˜J˜šžœœ œœ˜;Jšœ œ˜—Jš˜šžœ œœ˜3Jš˜Jšœœ˜&Jšœ˜—J˜J˜Jšœ˜J˜šž œœ œ˜1Jšœ œœ˜/—Jš˜Jš œœœœœ˜!šœ"œ˜3Jšœœ˜%—Jšœ˜J˜Jšžœœ œ˜7Jš˜Jš œ œœœœ˜'šœœ˜.Jš˜J˜J˜ Jšœ˜—J˜Jšœ˜J˜Jšœ˜J˜J˜J˜J˜J˜—…—æ ¸