1. -- 
  2. -- Uwe R. Zimmer, Australia, 2014 
  3. -- 
  4.  
  5. pragma Initialize_Scalars; 
  6.  
  7. generic 
  8.    type Element is private; 
  9.    type Index   is mod <>;  -- Modulo defines size of the queue. 
  10.  
  11. package Queue_Pack_Protected_Generic is 
  12.  
  13.    type Queue_Type is limited private; 
  14.  
  15.    protected type Protected_Queue is 
  16.  
  17.       entry Enqueue (Item :     Element); 
  18.       entry Dequeue (Item : out Element); 
  19.  
  20.       procedure Empty_Queue; 
  21.  
  22.       function Is_Empty return Boolean; 
  23.       function Is_Full  return Boolean; 
  24.  
  25.    private 
  26.       Queue : Queue_Type; 
  27.  
  28.    end Protected_Queue; 
  29.  
  30. private 
  31.    type List is array (Index) of Element; 
  32.    type Queue_Type is record 
  33.       Top, Free : Index   := Index'First; 
  34.       Is_Empty  : Boolean := True; 
  35.       Elements  : List; 
  36.    end record; 
  37. end Queue_Pack_Protected_Generic;