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
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.