87 lines
2.1 KiB
Text
87 lines
2.1 KiB
Text
CLASS ARRAYLISTS;
|
|
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;
|
|
|
|
END;
|