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_Protected_Generic is 
  10.  
  11.    type Queue_Type is limited private; 
  12.  
  13.    protected type Protected_Queue is 
  14.  
  15.       entry Enqueue (Item :     Element); 
  16.       entry Dequeue (Item : out Element); 
  17.  
  18.       function Is_Empty return Boolean; 
  19.       function Is_Full  return Boolean; 
  20.  
  21.    private 
  22.       Queue : Queue_Type; 
  23.  
  24.    end Protected_Queue; 
  25.  
  26. private 
  27.    subtype Marker is Natural range 0 .. Queue_Size - 1; 
  28.    -- bounds chosen such that modulo arithmetic can be used 
  29.    type List is array (Marker'Range) of Element; 
  30.    type Queue_Type is record 
  31.       Top, Free : Marker  := Marker'First; 
  32.       Is_Empty  : Boolean := True; 
  33.       Elements  : List; 
  34.    end record; 
  35. end Queue_Pack_Protected_Generic;