<> <> <> DIRECTORY TiogaNode, TiogaTreeOps; TreeSlice: CEDAR DEFINITIONS = BEGIN Ref: TYPE = TiogaNode.Ref; RefBranchNode: TYPE = TiogaNode.RefBranchNode; <<***** Declarations>> Slice: TYPE = REF SliceArray; SliceArray: TYPE = RECORD [ next: Slice, -- for free list kind: OfSlice, -- before/after length: NAT _ 0, nodes: SEQUENCE maxLength: NAT OF Ref <> <0 is always a RefBranchNode>> ]; OfSlice: TYPE = { before, after }; Order: TYPE = { same, before, after, disjoint }; <<***** Operations>> <<>> GetSlice: PROC [len: NAT] RETURNS [slice: Slice]; FreeSlice: PROC [slice: Slice]; MakeSlices: PROC [node: RefBranchNode] RETURNS [before, after: Slice]; InsertPrefix: PROC [first, last: Slice, firstLen: NAT] RETURNS [new: Slice]; <> <> <> DeletePrefix: PROC [slice: Slice, depth: NAT]; SliceLength: PROC [slice: Slice] RETURNS [length: NAT] = INLINE { RETURN [slice.length] }; SliceNode: PROC [slice: Slice, index: NAT] RETURNS [Ref] = INLINE { RETURN [slice[index]] }; LastOfSlice: PROC [slice: Slice] RETURNS [Ref] = INLINE { RETURN [slice[slice.length-1]] }; CompareSliceOrder: PROC [s1, s2: Slice] RETURNS [order: Order]; SliceOrder: PROC [alpha, beta: TiogaTreeOps.BranchSpan, aBefore, aBottom, bBefore, bBottom: Slice] RETURNS [overlap: BOOLEAN, head, tail: TiogaTreeOps.BranchSpan, startOrder, endOrder: Order]; END.