(* ==================================================================== *)
(* === Queue ========================================================== *)
(* ==================================================================== *)
(*

  :Program.       Queue.MOD
  :Contents.      queue ADT based on linear lists
  :Author.        Peter Fröhlich [phf]
  :Copyright.     Public Domain
  :Language.      Oberon (revised)
  :Translator.    Amiga Oberon V2.01
  :History.       V0.0 [phf] 02-Sep-1991 [created]
  :History.       V1.0 [phf] 03-Sep-1991 seems to work
  :History.       V1.0 [phf] 08-Sep-1991 [last edit]

  :Support.       B. Meyer, Object-oriented Software Construction
  :Imports.       -
  :Bugs.          none known

  :Address.       Ebenböckstraße 19, D-8000 München 60
  :Address.       Z-NET:P.FROEHLICH@NEXT-BOX.ZER
  :Phone.         (089) 820 31 72

*)
(* ==================================================================== *)

MODULE Queue;

(* ==================================================================== *)
(* === Imports ======================================================== *)
(* ==================================================================== *)

IMPORT
  l : Lists;

(* ==================================================================== *)
(* === Types ========================================================== *)
(* ==================================================================== *)

TYPE
  Element* = POINTER TO ElementObject;
  ElementObject* = l.Node; (* exported to allow type-extension *)
          
  Queue* = POINTER TO l.List;

(* ==================================================================== *)
(* === Procedures ===================================================== *)
(* ==================================================================== *)

(*==== Queue creation/destruction ======================================*)

(* --- Create --------------------------------------------------------- *)
PROCEDURE Create*(VAR (*OUT*) queue: Queue);
BEGIN
  NEW(queue);
  IF (queue # NIL) THEN
    l.Init(queue^);
  END;
END Create;
(* -------------------------------------------------------------------- *)

(* --- Discard -------------------------------------------------------- *)
PROCEDURE Discard*(VAR (*INOUT*) queue: Queue);
BEGIN
  DISPOSE(queue);
  queue := NIL;
END Discard;
(* -------------------------------------------------------------------- *)

(*==== Accessing a queue ===============================================*)

(* --- Put ------------------------------------------------------------ *)
PROCEDURE Put*(VAR (*INOUT*) queue: Queue; element: Element);
BEGIN
  l.AddTail(queue^,element);
END Put;
(* -------------------------------------------------------------------- *)

(* --- Get ------------------------------------------------------------ *)
PROCEDURE Get*(VAR (*INOUT*) queue: Queue): Element;
BEGIN
  RETURN l.RemHead(queue^);
END Get;
(* -------------------------------------------------------------------- *)

(* --- Head ----------------------------------------------------------- *)
PROCEDURE Head*(VAR (*IN*) queue: Queue): Element;
BEGIN
  RETURN l.Head(queue^);
END Head;
(* -------------------------------------------------------------------- *)

(*==== Status of a queue ===============================================*)

(* --- Empty ---------------------------------------------------------- *)
PROCEDURE Empty*(VAR (*IN*) queue: Queue): BOOLEAN;
BEGIN
  RETURN l.Empty(queue^);
END Empty;
(* -------------------------------------------------------------------- *)

(* --- Full ----------------------------------------------------------- *)
PROCEDURE Full*(VAR (*IN*) queue: Queue): BOOLEAN;
BEGIN
  RETURN FALSE; (* this implementation can never be full *)
END Full;
(* -------------------------------------------------------------------- *)

(* --- Elements ------------------------------------------------------- *)
PROCEDURE Elements*(VAR (*IN*) queue: Queue): LONGINT;
BEGIN
  RETURN l.CountElements(queue^);
END Elements;
(* -------------------------------------------------------------------- *)

(* ==================================================================== *)
END Queue.
(* ==================================================================== *)
