-- Mapper.mesa -- Last changed by Doug Wyatt, September 4, 1980 9:11 AM DIRECTORY Vector USING [Vec, Matrix]; Mapper: DEFINITIONS = { Handle: TYPE = LONG POINTER TO Object; Vec: TYPE = Vector.Vec; Matrix: TYPE = Vector.Matrix; -- Client interface for a Mapper NewMapper: PROC[] RETURNS[Handle]; Map: PROC[self: Handle, v: Vec] RETURNS[Vec] = INLINE { self.procs.Map[self,@v,TRUE]; RETURN[v] }; MapDelta: PROC[self: Handle, v: Vec] RETURNS[Vec] = INLINE { self.procs.Map[self,@v,FALSE]; RETURN[v] }; InverseMap: PROC[self: Handle, v: Vec] RETURNS[Vec] = INLINE { self.procs.InverseMap[self,@v,TRUE]; RETURN[v] }; InverseMapDelta: PROC[self: Handle, v: Vec] RETURNS[Vec] = INLINE { self.procs.InverseMap[self,@v,FALSE]; RETURN[v] }; Translate: PROC[self: Handle, v: Vec] = INLINE { self.procs.Translate[self,@v] }; Concat: PROC[self: Handle, m: Matrix] = INLINE { self.procs.Concat[self,@m] }; Ortho: PROC[self: Handle] RETURNS[BOOLEAN] = INLINE { RETURN[self.procs.Ortho[self]] }; Read: PROC[self: Handle] RETURNS[m: Matrix, v: Vec] = INLINE { self.procs.Read[self,@m,@v]; RETURN[m,v] }; Copy: PROC[self: Handle] RETURNS[Handle] = INLINE { RETURN[self.procs.Copy[self]] }; Free: PROC[selfPtr: LONG POINTER TO Handle] = INLINE { IF selfPtr^#NIL THEN selfPtr^.procs.Free[selfPtr] }; -- Actual representation for a Mapper interface Object: PRIVATE TYPE = RECORD [ procs: LONG POINTER TO READONLY Procs, data: LONG POINTER TO Data ]; Procs: PRIVATE TYPE = RECORD [ Map: PROC[self: Handle, v: POINTER TO Vec, t: BOOLEAN], InverseMap: PROC[self: Handle, v: POINTER TO Vec, t: BOOLEAN], Translate: PROC[self: Handle, v: POINTER TO Vec], Concat: PROC[self: Handle, m: POINTER TO Matrix], Ortho: PROC[self: Handle] RETURNS[BOOLEAN], Read: PROC[self: Handle, m: POINTER TO Matrix, v: POINTER TO Vec], Copy: PROC[self: Handle] RETURNS[Handle], Free: PROC[selfPtr: LONG POINTER TO Handle] ]; Data: PRIVATE TYPE; MapperImpl: PROGRAM; }.(670)