-- CellInstPQImpl.mesa -- A generic package to organize items -- in a priority queue, sorted by increasing order of -- Val. -- written by E. McCreight, February 8, 1982 2:04 PM -- last modified by E. McCreight, February 8, 1982 2:20 PM -- customized by E. McCreight, February 8, 1982 3:46 PM DIRECTORY CellInstPQ; CellInstPQImpl: PROGRAM IMPORTS CellInstPQ EXPORTS CellInstPQ SHARES CellInstPQ = BEGIN OPEN CellInstPQ; CellInstPQUnderflow: PUBLIC SIGNAL = CODE; NewCellInstPQ: PUBLIC PROCEDURE[zone: UNCOUNTED ZONE, max: CARDINAL _ 50] RETURNS[PQHandle] = {RETURN[zone.NEW[PQObject _ [zone: zone, size: 0, s: zone.NEW[PQSeq[max]]]]]}; DestroyCellInstPQ: PUBLIC PROCEDURE[p: PQHandle] RETURNS[PQHandle] = BEGIN zone: UNCOUNTED ZONE _ p.zone; zone.FREE[@p.s]; zone.FREE[@p]; RETURN[NIL]; END; -- of DestroyCellInstPQ InsertCellInstPQ: PUBLIC PROCEDURE[p: PQHandle, item: Item] = BEGIN i, j: CARDINAL; pqs: PQSeqPtr _ GrowingPQ[p]; p.size _ p.size+1; FOR j _ p.size-1, i WHILE j>0 DO i _ (j-1)/2; IF Val[item]>=Val[pqs.heap[i]] THEN EXIT ELSE pqs.heap[j] _ pqs.heap[i]; ENDLOOP; pqs.heap[j] _ item; END; ExtractCellInstPQ: PUBLIC PROCEDURE[p: PQHandle] RETURNS[item: Item] = BEGIN pqs: PQSeqPtr _ ShrinkingPQ[p]; result: Item _ pqs.heap[0]; IF (p.size _ p.size-1)>0 THEN BEGIN i, j: CARDINAL; r: CARDINAL _ p.size-1; -- max index item: Item _ pqs.heap[p.size]; FOR i _ 0, j DO j _ i+i+1; IF j>r THEN EXIT; IF j=p.s.max THEN BEGIN oldSeq: PQSeqPtr _ p.s; newSeq: PQSeqPtr _ p.zone.NEW[PQSeq[MAX[(15*p.size)/10, 50]]]; FOR i: CARDINAL IN [0..p.size) DO newSeq[i] _ oldSeq[i]; ENDLOOP; p.s _ newSeq; p.zone.FREE[@oldSeq]; END; RETURN[p.s]; END; ShrinkingPQ: PROCEDURE[p: PQHandle] RETURNS[PQSeqPtr] = BEGIN WHILE p.size<1 DO SIGNAL CellInstPQUnderflow ENDLOOP; IF MAX[p.size, 50]