ui/src/vbt/RingBuffer.i3


Copyright (C) 1994, Digital Equipment Corp.
 by Steve Glassman, Mark Manasse and Greg Nelson           
<*PRAGMA LL*>

GENERIC INTERFACE RingBuffer(Elem);
Elem.T must not be an open array type; Elem.NormalSize must be a constant positive integer.
 A RingBuffer.T represents an unmonitored indefinitely expandible
   FIFO queue. 

TYPE T =
  RECORD
    lo, hi: CARDINAL := 0;
    buff: REF ARRAY OF Elem.T := 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: Elem.T);
Insert e into rb, extending rb if necessary.

EXCEPTION Exhausted;

PROCEDURE Remove(VAR rb: T): Elem.T RAISES {Exhausted};
Raise the exception if rb is empty, else remove the oldest element of rb and return it.

PROCEDURE Peek(VAR rb: T): Elem.T RAISES {Exhausted};
Like Remove, but leave the returned element at the head of the queue.

END RingBuffer.