DIRECTORY IPBasic USING [Any, Integer, maxInteger, nullAny, State, Vec, VecRep, Vector, VectorShape], IPConvert USING [AnyToInteger], IPErrors USING [MasterError], IPOps USING [EqN], IPStack USING [PopAny, PushAny], IPVector USING [], IPStorage USING [pzone]; IPPoolImpl: CEDAR PROGRAM IMPORTS IPConvert, IPErrors, IPOps, IPStack, IPStorage EXPORTS IPVector = BEGIN OPEN IPBasic; PoolRef: TYPE = REF PoolRep; PoolRep: TYPE = RECORD[ persistent: BOOL, level: NAT, link: PoolRef, vec: Vec ]; VectorToVec: PROC[Vector] RETURNS[Vec]; OperatorToPool: PROC[Operator] RETURNS[PoolRef]; VecToVector: PROC[Vec] RETURNS[Vector]; PoolToOperator: PROC[PoolRef] RETURNS[Operator]; VGet: PROC[v: Vec, n: Integer] RETURNS[Any] = { shape: VectorShape = v.shape; IF n IN[shape.l..shape.l+shape.n) THEN RETURN[v[n-shape.l]] ELSE ERROR IPErrors.MasterError[BoundsFault]; }; VSet: PROC[v: Vec, x: Any, n: Integer] = { shape: VectorShape = v.shape; IF n IN[shape.l..shape.l+shape.n) THEN v[n-shape.l] _ x ELSE ERROR IPErrors.MasterError[BoundsFault]; }; VCopy: PROC[v: Vec] RETURNS[Vec] = { }; Frame: PROC[self: State] RETURNS[Vec] = { context: Context = self.context; f: Vec = context.frame; RETURN[IF f=NIL THEN context.initialFrame ELSE VCopy[f]] }; FGet: PUBLIC PROC[self: State, n: Integer] RETURNS[Any] = { context: Context = self.context; f: Vec _ context.frame; IF f=NIL THEN f _ context.initialFrame; RETURN[VGet[f, n]]; }; FSet: PUBLIC PROC[self: State, x: Any, n: Integer] = { context: Context = self.context; f: Vec _ context.frame; IF f=NIL THEN f _ context.frame _ VCopy[context.initialFrame]; VSet[f, x, n]; }; MakePool: PROC[self: State, v: Vector, persistent: BOOL] RETURNS[Operator] = { }; NoPool: PROC[self: State] RETURNS[Operator] = { }; MakeCO: PUBLIC PROC[self: State, po: Operator, f: Vector] RETURNS[Operator] = { frame: Vec = IPVector.VectorToVec[f]; index: Index = SkipBody[self]; RETURN[IPStorage.qzone.NEW[OperatorRep[composed] _ [composed[start: index, initialFrame: frame]]]]; }; DoPoolOp: PROC[pool: PoolRef] RETURNS[Vector] = { RETURN[VecToVector[CopyVec[pool.vec]]]; }; PoolOp: PROC[self: State] RETURNS[Operator] = { RETURN[PoolRefToOperator[self.context.pool]]; }; Pool: PROC[self: State] RETURNS[Vector] = { RETURN[DoPoolOp[self.context.pool]]; }; PGet: PROC[self: State, n: Integer] RETURNS[Any] = { pool: PoolRef = self.context.pool; RETURN[VGet[pool.vec, n]]; }; PSet: PROC[self: State, n: Integer] RETURNS[Any] = { pool: PoolRef = self.context.pool; RETURN[VGet[pool.vec, n]]; }; END. `IPPoolImpl.mesa Last edited by: Doug Wyatt, April 29, 1983 2:17 pm Narrowing: Widening: Κ΅˜headšœ™šœ™Jšœ"™"—J˜šΟk ˜ JšœœN˜[Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœœ˜ Jšœ œ˜Jšœ œ ˜—J˜—šœ œ˜Jšœ/˜6Jšœ ˜Jšœœœ ˜J˜Jšœ œœ ˜šœ œœ˜Jšœ œ˜Jšœœ˜ J˜J˜J˜—J˜Jšœ ™ JšΟn œœ œ˜'Jšžœœ œ ˜0J˜Jšœ ™ Jšž œœœ ˜'Jšžœœ œ ˜0J™šžœœœ ˜/J˜Jšœœœœ˜;Jšœœ$˜.J˜—J˜šžœœ ˜*J˜Jšœœœ˜7Jšœœ$˜.J˜—J˜šžœœ œ ˜$J˜—J˜šžœœœ ˜)J˜ J˜Jš œœœœœ ˜8J˜—J˜šžœœœœ ˜;J˜ J˜Jšœœœ˜'Jšœ ˜J˜—J˜šžœœœ%˜6J˜ J˜Jšœœœ1˜>J˜J˜—J˜šžœœ%œœ˜NJ˜—J˜šžœœœ˜/J˜J˜—J˜šžœœœ'œ˜OJ˜%Jšœ˜šœœ˜2Jšœ0˜0—J˜—J˜šžœœœ ˜1Jšœ!˜'J˜—J˜šžœœœ˜/Jšœ'˜-J˜—J˜šžœœœ ˜+Jšœ˜$J˜—J˜šžœœœ ˜4J˜"Jšœ˜J˜—J˜šžœœœ ˜4J˜"J˜Jšœ˜J˜—J˜Jšœ˜——…— β χ