1. -- 
  2. -- Uwe R. Zimmer, Australia, 2013 
  3. -- 
  4.  
  5. generic 
  6.    type Element is private; 
  7.    Queue_Size : Positive := 10; 
  8.  
  9. package Queue_Pack_Generic is 
  10.  
  11.    type Queue_Type is limited private; 
  12.  
  13.    procedure Enqueue (Item :     Element; Queue : in out Queue_Type); 
  14.    procedure Dequeue (Item : out Element; Queue : in out Queue_Type); 
  15.  
  16.    function Is_Empty (Queue : Queue_Type) return Boolean; 
  17.    function Is_Full  (Queue : Queue_Type) return Boolean; 
  18.  
  19.    Queue_overflow, Queue_underflow : exception; 
  20.  
  21. private 
  22.    subtype Marker is Natural range 0 .. Queue_Size - 1; 
  23.    -- bounds chosen such that modulo arithmetic can be used 
  24.    type List is array (Marker) of Element; 
  25.    type Queue_Type is record 
  26.       Top, Free : Marker  := Marker'First; 
  27.       Is_Empty  : Boolean := True; 
  28.       Elements  : List; 
  29.    end record; 
  30. end Queue_Pack_Generic;