<> <> <<>> DIRECTORY Rope, ClientStateInfo; SimpleClientImpl: CEDAR PROGRAM IMPORTS Rope EXPORTS ClientStateInfo = BEGIN OPEN ClientStateInfo; PrivateState: TYPE = REF InclusionRelation; InclusionRelation: TYPE = { inside }; -- our model is that retained areas have state "inside", and unretained areas have state NIL defaultState: PUBLIC State _ NEW[InclusionRelation _ inside ]; BooleanFunction: TYPE = { Union, Difference }; stateCombiner: PUBLIC StateCombiner = { RETURN[ NIL ]; -- Difference function (default) }; StateEqual: PUBLIC PROC [state1, state2: State] RETURNS [BOOL] ~ { s1: PrivateState _ NARROW[state1]; s2: PrivateState _ NARROW[state2]; IF state1=NIL OR state2=NIL THEN RETURN[state1=NIL AND state2 = NIL]; RETURN[s1^ = s2^]; }; RopeFromState: PUBLIC PROC [state: State] RETURNS [Rope.ROPE] ~ { s: PrivateState _ NARROW[state]; IF state=NIL THEN RETURN["NIL"]; IF s^ = inside THEN RETURN["inside"] ELSE ERROR; }; StateFromRope: PUBLIC PROC [in: Rope.ROPE] RETURNS [s: State] ~ { IF Rope.Equal[in, "NIL"] THEN RETURN[NIL] ELSE IF Rope.Equal[in, "inside"] THEN RETURN[NEW[InclusionRelation _ inside]] ELSE ERROR; }; END.