<> <<>> <> <> <<>> DIRECTORY Imager USING [Context, DoSave, DoSaveAll], IP USING [Array, ArrayFromVector, Integer, MasterError, NullVector, Operator, OperatorRep, Pool, PoolRep, PopBool, PopVector, PushOperator, PushVector, SaveEffect, State, Vector, VectorFromArray], IPBase USING []; IPPoolImpl: CEDAR PROGRAM IMPORTS Imager, IP EXPORTS IP, IPBase ~ BEGIN OPEN IP; MakePool: PUBLIC PROC[v: Vector, persistent: BOOL] RETURNS[Pool] ~ { RETURN[NEW[PoolRep _ [persistent: persistent, array: ArrayFromVector[v]]]]; }; emptyVector: Vector ~ NullVector[shape: [l: 0, n: 0]]; noPool: Pool ~ MakePool[v: emptyVector, persistent: FALSE]; NoPool: PUBLIC PROC RETURNS[Pool] ~ { RETURN[noPool] }; CurrentPool: PUBLIC PROC[pool: Pool] RETURNS[Vector] ~ { RETURN[VectorFromArray[pool.array]]; }; PoolDo: PROC[self: State, data: REF] ~ { pool: Pool ~ NARROW[data]; PushVector[self, CurrentPool[pool]]; }; OperatorFromPool: PUBLIC PROC[pool: Pool] RETURNS[Operator] ~ { RETURN[NEW[OperatorRep _ [class: $Pool, do: PoolDo, data: pool]]]; }; PoolFromOperator: PUBLIC PROC[op: Operator] RETURNS[Pool] ~ { IF op.class#$Pool THEN MasterError[$wrongType, "Operator is not a Pool."]; WITH op.data SELECT FROM pool: Pool => RETURN[pool]; ENDCASE; MasterError[$bug, "Pool operator data is wrong type or NIL."]; RETURN[NIL]; }; DoWithSaveEffect: PUBLIC PROC[self: State, action: PROC, saveEffect: SaveEffect] ~ { imager: Imager.Context ~ self.imager; <> SELECT saveEffect FROM $nil => action[]; $save => imager.DoSave[action]; $saveAll => imager.DoSaveAll[action]; ENDCASE => ERROR; }; ApplyMAKEPOOL: PUBLIC PROC[self: State] ~ { persistent: BOOL ~ PopBool[self]; v: Vector ~ PopVector[self]; pool: Pool ~ MakePool[v, persistent]; PushOperator[self, OperatorFromPool[pool]]; }; ApplyNOPOOL: PUBLIC PROC[self: State] ~ { PushOperator[self, OperatorFromPool[noPool]]; }; END.