1. -- 
  2. -- Uwe R. Zimmer, Australia, 2013 
  3. -- 
  4.  
  5. generic 
  6.    type Element is private; 
  7.    type Queue_Enum is (<>); 
  8.    Queue_Size : Positive; 
  9.  
  10. package Queues_Pack_Protected_Generic is 
  11.  
  12.    type Queue_Type is limited private; 
  13.  
  14.    protected type Protected_Queue is 
  15.  
  16.       entry Enqueue              (Item :     Element); 
  17.       entry Dequeue (Queue_Enum) (Item : out Element); 
  18.  
  19.       function Is_Empty (Q : Queue_Enum) return Boolean; 
  20.       function Is_Full                   return Boolean; 
  21.  
  22.    private 
  23.       Queue : Queue_Type; 
  24.  
  25.    end Protected_Queue; 
  26.  
  27. private 
  28.    subtype Marker is Natural range 0 .. Queue_Size - 1; 
  29.    type Markers is array (Queue_Enum) of Marker; 
  30.  
  31.    type Readouts is array (Queue_Enum) of Boolean; 
  32.    All_Read  : constant Readouts := (others => True); 
  33.    None_Read : constant Readouts := (others => False); 
  34.  
  35.    type Element_and_Readouts is record 
  36.       Elem  : Element; -- Initialized to invalids 
  37.       Reads : Readouts := All_Read; 
  38.    end record; 
  39.    type List is array (Marker'Range) of Element_and_Readouts; 
  40.  
  41.    type Queue_Type is record 
  42.       Free     : Marker  := Marker'First; 
  43.       Readers  : Markers := (others => Marker'First); 
  44.       Elements : List; 
  45.    end record; 
  46. end Queues_Pack_Protected_Generic;