BEGIN CLASS ITEM;; CLASS ITEMARRAY(N); INTEGER N; BEGIN REF(ITEM) ARRAY DATA(1:N); OUTTEXT("NEW ITEMARRAY WITH "); OUTINT(N, 0); OUTTEXT(" ELEMENTS"); OUTIMAGE; END; CLASS ARRAYLIST; BEGIN PROCEDURE EXPAND(N); INTEGER N; BEGIN INTEGER I; REF(ITEMARRAY) TEMP; OUTTEXT("EXPAND TO CAPACITY "); OUTINT(N, 0); OUTIMAGE; TEMP :- NEW ITEMARRAY(N); FOR I := 1 STEP 1 UNTIL SIZE DO TEMP.DATA(I) :- ITEMS.DATA(I); ITEMS :- TEMP; END; PROCEDURE ADD(T); REF(ITEM) T; BEGIN IF SIZE + 1 > CAPACITY THEN BEGIN CAPACITY := 2 * CAPACITY; EXPAND(CAPACITY); END; SIZE := SIZE + 1; ITEMS.DATA(SIZE) :- T; OUTTEXT("SIZE IS "); OUTINT(SIZE, 0); OUTIMAGE; END; PROCEDURE REMOVE(I); INTEGER I; BEGIN INTEGER J; IF I < 1 OR I > SIZE THEN ERROR("REMOVE: INDEX OUT OF BOUNDS"); FOR J := I STEP 1 UNTIL SIZE - 1 DO ITEMS.DATA(J) :- ITEMS.DATA(J + 1); ITEMS.DATA(SIZE) :- NONE; SIZE := SIZE - 1; END; REF(ITEM) PROCEDURE GET(I); INTEGER I; BEGIN IF I < 1 OR I > SIZE THEN ERROR("GET: INDEX OUT OF BOUNDS"); GET :- ITEMS.DATA(I); END; INTEGER CAPACITY; INTEGER SIZE; REF(ITEMARRAY) ITEMS; CAPACITY := 20; SIZE := 0; EXPAND(CAPACITY); END; ITEM CLASS TEXTITEM(TXT); TEXT TXT;; ARRAYLIST CLASS TEXTARRAYLIST; BEGIN PROCEDURE ADD(T); TEXT T; THIS TEXTARRAYLIST QUA ARRAYLIST.ADD(NEW TEXTITEM(T)); TEXT PROCEDURE GET(I); INTEGER I; GET :- THIS TEXTARRAYLIST QUA ARRAYLIST.GET(I) QUA TEXTITEM.TXT; END; ITEM CLASS REALITEM(X); REAL X;; ARRAYLIST CLASS REALARRAYLIST; BEGIN PROCEDURE ADD(X); REAL X; THIS REALARRAYLIST QUA ARRAYLIST.ADD(NEW REALITEM(X)); REAL PROCEDURE GET(I); INTEGER I; GET := THIS REALARRAYLIST QUA ARRAYLIST.GET(I) QUA REALITEM.X; END; REF(TEXTARRAYLIST) LINES; REF(REALARRAYLIST) REALS; INTEGER I; LINES :- NEW TEXTARRAYLIST; LINES.ADD("WE"); LINES.ADD("HAVE"); LINES.ADD("SEEN"); LINES.ADD("THAT"); LINES.ADD("ARRAYS"); LINES.ADD("ARE"); LINES.ADD("A"); LINES.ADD("VERY"); LINES.ADD("CONVENIENT"); LINES.ADD("WAY"); LINES.ADD("OF"); LINES.ADD("STORING"); LINES.ADD("SIMPLE"); LINES.ADD("VALUES"); LINES.ADD("AND"); LINES.ADD("REFERENCES"); LINES.ADD("TO"); LINES.ADD("MORE"); LINES.ADD("COMPLEX"); LINES.ADD("CLASS"); LINES.ADD("OBJECTS"); LINES.ADD("IN"); LINES.ADD("AN"); LINES.ADD("ORDERED"); LINES.ADD("LIST"); LINES.ADD("."); FOR I := 1 STEP 1 UNTIL LINES.SIZE DO BEGIN OUTINT(I, 0); OUTTEXT(": "); OUTTEXT(LINES.GET(I)); OUTIMAGE; END; REALS :- NEW REALARRAYLIST; FOR I := 1 STEP 1 UNTIL 10 DO REALS.ADD(I * I); FOR I := 1 STEP 1 UNTIL REALS.SIZE DO BEGIN OUTINT(I, 4); OUTTEXT(": "); OUTFIX(REALS.GET(I),2,10); OUTIMAGE; END; FOR I := REALS.SIZE STEP - 2 UNTIL 1 DO REALS.REMOVE(I); FOR I := 1 STEP 1 UNTIL REALS.SIZE DO BEGIN OUTINT(I, 4); OUTTEXT(": "); OUTFIX(REALS.GET(I),2,10); OUTIMAGE; END; END;