<<>> <> <> <> <> <> <> <> DIRECTORY Rope USING [ROPE, RopeRep, StringBound, Text, TextBound, UncheckedFlat]; RopePrivate: CEDAR DEFINITIONS SHARES Rope = BEGIN OPEN Rope; Tsubstr: TYPE = substr node RopeRep; Tconcat: TYPE = concat node RopeRep; Treplace: TYPE = replace node RopeRep; Tobject: TYPE = object node RopeRep; MaxDepth: CARDINAL = 32; NonNeg: PROC [x: INT] RETURNS [NAT] = INLINE {RETURN [x]}; <> Short: PROC [x: INT] RETURNS [TextBound] = INLINE {RETURN [x]}; <> CheckLongAdd: PROC [x,y: INT] RETURNS [NAT] = INLINE {RETURN [x+y]}; <> NodeSize: PROC [base: REF RopeRep.node] RETURNS [INT] = INLINE { TRUSTED { <> RETURN [LOOPHOLE[base, REF Tobject].size]; }; }; SingleSize: PROC [base: ROPE] RETURNS [INT, Text] = INLINE { WITH base SELECT FROM text: Text => RETURN [text.length, text]; node: REF RopeRep.node => RETURN [NodeSize[node], NIL]; ENDCASE => RETURN [0, NIL]; }; DoubleSize: PROC [r1, r2: ROPE] RETURNS [s1: INT, s2: INT, both: BOOL] = INLINE { t1,t2: Text; [s1,t1] ¬ SingleSize[r1]; [s2,t2] ¬ SingleSize[r2]; both ¬ t1 # NIL AND t2 # NIL; }; <<>> InlineDepth: PROC [r: ROPE] RETURNS [INTEGER] = INLINE { IF r = NIL THEN RETURN [0]; WITH r SELECT FROM node: REF RopeRep.node => RETURN [node.depth]; ENDCASE => RETURN [1]; }; QStore: UNSAFE PROC [c: CHAR, base: Text, index: StringBound] = TRUSTED INLINE { <> LOOPHOLE[base, UncheckedFlat][index] ¬ c; }; <<>> QFetch: UNSAFE PROC [base: Text, index: StringBound] RETURNS [CHAR] = TRUSTED INLINE { <> RETURN [LOOPHOLE[base, UncheckedFlat][index]]; }; <<>> END.