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