PairListImpl.Mesa
Stone 26-Jun-81 15:28:54
Cedar version:18-Jun-81 14:24:37
Ordered pairs; building and searching
Last Edited by: Beach, May 1, 1984 2:09:02 pm PDT
PairListImpl:
CEDAR PROGRAM
EXPORTS PairList =
BEGIN OPEN PairList;
NotFound: PUBLIC SIGNAL = CODE;
CreateRelation: PUBLIC PROCEDURE RETURNS [relation: Relation] =
BEGIN
relation ← NEW[RelationHead];
END;
AddPair:
PUBLIC
PROCEDURE [relation: Relation,
left, right: REF ANY] =
BEGIN
pair: REF Pair ← NEW[Pair];
pair.left ← left; pair.right ← right;
pair.link ← relation.first;
relation.first ← pair;
END;
Left:
PUBLIC
PROCEDURE[relation: Relation, equals: EqualProc, right:
REF
ANY]
RETURNS [left: REF ANY] =
BEGIN
notFound: BOOLEAN ← TRUE;
IsRight:
PROCEDURE [leftPart, rightPart:
REF
ANY] =
BEGIN
IF equals[right,rightPart] THEN {left←leftPart; notFound← FALSE};
END;
ForAllPairs[relation, IsRight];
IF notFound THEN SIGNAL NotFound;
END;
Right:
PUBLIC
PROCEDURE[relation: Relation, equals: EqualProc, left:
REF
ANY]
RETURNS [right: REF ANY] =
BEGIN
notFound: BOOLEAN ← TRUE;
IsLeft:
PROCEDURE [leftPart, rightPart:
REF
ANY] =
BEGIN
IF equals[left,leftPart] THEN {right←rightPart; notFound← FALSE};
END;
ForAllPairs[relation, IsLeft];
IF notFound THEN SIGNAL NotFound;
END;
ForAllPairs:
PUBLIC
PROCEDURE[relation: Relation,
do: PROCEDURE[leftPart, rightPart: REF ANY]] =
BEGIN
pair: REF Pair ← NIL;
IF relation=NIL THEN RETURN;
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: REF Pair ← NIL;
IF relation=NIL THEN RETURN;
FOR pair ← relation.first, next
UNTIL pair=
NIL
DO
next ← pair.link;
ENDLOOP;
END;
END.