<> <> <> <> <> <> <> < in the range [0..IMax) and [0..JMax), where IMax and JMax are automatically maintained. IMax*JMax cells are actually allocated, so keep IMax*JMax within reason.>> <> DIRECTORY IO, Rope; Histograms: CEDAR DEFINITIONS = { Error: ERROR [msg: ROPE]; ROPE: TYPE = Rope.ROPE; Dim: TYPE ~ {X, Y}; BoolPair: TYPE ~ ARRAY Dim OF BOOL; RealRange1: TYPE ~ RECORD [min, max: REAL]; RealRange2: TYPE ~ ARRAY Dim OF RealRange1; Range1: TYPE = RECORD [min, max: INT]; Range2: TYPE = ARRAY Dim OF Range1; nullRange1: Range1 = [INT.LAST, INT.FIRST]; fullRange1: Range1 = [INT.FIRST, INT.LAST]; nullRange2: Range2 = ALL[nullRange1]; fullRange2: Range2 = ALL[fullRange1]; Histogram: TYPE = REF HistogramRep; HistogramRep: TYPE; Create1D: PROC --makes a 1D histogram [ factor: REAL _ 1.0, offset: REAL _ 0.0, logarithmic: BOOL _ FALSE, BinNamer: BinNameProc _ NIL, clientData: REF ANY _ NIL] RETURNS [Histogram]; <> Create2D: PROC [ iFactor, jFactor: REAL _ 1.0, iOffset, jOffset: REAL _ 0.0, logI, logJ: BOOL _ FALSE, BinNamer: BinNameProc _ NIL, clientData: REF ANY _ NIL] RETURNS [Histogram]; BinNameProc: TYPE ~ PROC [clientData: REF ANY, i, j: NATURAL] RETURNS [ROPE]; <> Increment: PROC [h: Histogram, i: NATURAL] = INLINE {Change[h, i, 1]}; <> Decrement: PROC [h: Histogram, i: NATURAL] = INLINE {Change[h, i, -1]}; <> Change: PROC [h: Histogram, i: NATURAL, howMuch: INTEGER]; <> IncrementTransformed: PROC [h: Histogram, xmin, xmax, x: REAL]; <> ChangeTransformed: PROC [h: Histogram, x: REAL, y: REAL _ 0.0, delta: INTEGER _ 1]; <> Change1DTransformed: PROC [h: Histogram, x: REAL, delta: INTEGER _ 1]; <> ClearAll: PROC [h: Histogram]; <> AddFrom: PROC [h: Histogram, from: IO.STREAM]; }.