Copyright (C) 1994, Digital Equipment Corp.
by Steve Glassman, Mark Manasse and Greg Nelson
<*PRAGMA LL*>
INTERFACE InstallQueue; (* = RingBuffer(Closure) *)
TYPE Closure = OBJECT METHODS apply() END;
TYPE T =
RECORD
lo, hi: CARDINAL := 0;
buff: REF ARRAY OF Closure := NIL
END;
(* buff[lo..hi-1] circularly are the active entries;
lo = hi => the queue is empty; lo # hi => buff # NIL. *)
CONST Empty = T{0, 0, NIL};
<*INLINE*> PROCEDURE IsEmpty(READONLY rb: T): BOOLEAN;
Return whether rb is empty.
PROCEDURE Insert(VAR rb: T; READONLY e: Closure);
Insert e into rb, extending rb if necessary.
EXCEPTION Exhausted;
PROCEDURE Remove(VAR rb: T): Closure RAISES {Exhausted};
Raise the exception if br is empty, else remove the
oldest element of rb and return it.
END InstallQueue.