1. -- 
  2. -- Uwe R. Zimmer, Australia, 2013 
  3. -- 
  4.  
  5. generic 
  6.    type Element is (<>); 
  7.    type Queue_Enum is (<>); 
  8.    Queue_Size : Positive; 
  9.  
  10. package Queues_Pack_Protected_Ordered_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.    end Protected_Queue; 
  25.  
  26. private 
  27.    subtype Marker is Natural range 0 .. Queue_Size - 1; 
  28.    type Markers is array (Queue_Enum) of Marker; 
  29.  
  30.    type Readouts is array (Queue_Enum) of Boolean; 
  31.    All_Read  : constant Readouts := (others => True); 
  32.    None_Read : constant Readouts := (others => False); 
  33.  
  34.    type Element_and_Readouts is record 
  35.       Elem  : Element; -- Initialized to invalids 
  36.       Reads : Readouts := All_Read; 
  37.    end record; 
  38.    type List is array (Marker'Range) of Element_and_Readouts; 
  39.  
  40.    type Queue_Type is record 
  41.       Free     : Marker  := Marker'First; 
  42.       Readers  : Markers := (others => Marker'First); 
  43.       Elements : List; 
  44.    end record; 
  45. end Queues_Pack_Protected_Ordered_Generic;