with Monitor;
generic
    type Item is private;
    type Priority is limited private;
    with function Priority_Of (The_Item : in Item) return Priority;
    with function "<=" (Left : in Priority; Right : in Priority) return Boolean;
package Queue_Priority_Nonbalking_Multiple_Bounded_Managed_Noniterator is

    type Queue (The_Size : Positive) is limited private;

    procedure Copy (From_The_Queue : in Queue; To_The_Queue : in out Queue);
    procedure Clear (The_Queue : in out Queue);
    procedure Add (The_Item : in Item; To_The_Queue : in out Queue);
    procedure Pop (The_Queue : in out Queue);

    function Is_Equal (Left : in Queue; Right : in Queue) return Boolean;
    function Length_Of (The_Queue : in Queue) return Natural;
    function Is_Empty (The_Queue : in Queue) return Boolean;
    function Front_Of (The_Queue : in Queue) return Item;

    Overflow : exception;
    Underflow : exception;

private
    type Items is array (Positive range <>) of Item;
    type Queue (The_Size : Positive) is
        record
            Guard : Monitor.Kind;
            The_Back : Natural := 0;
            The_Items : Items (1 .. The_Size);
        end record;
end Queue_Priority_Nonbalking_Multiple_Bounded_Managed_Noniterator;