File : a-cbprqu.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT LIBRARY COMPONENTS                          --
   4 --                                                                          --
   5 --                  ADA.CONTAINERS.BOUNDED_PRIORITY_QUEUES                  --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 2011-2015, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- This specification is derived from the Ada Reference Manual for use with --
  12 -- GNAT. The copyright notice above, and the license provisions that follow --
  13 -- apply solely to the  contents of the part following the private keyword. --
  14 --                                                                          --
  15 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  16 -- terms of the  GNU General Public License as published  by the Free Soft- --
  17 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  18 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  19 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  20 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  21 --                                                                          --
  22 --                                                                          --
  23 --                                                                          --
  24 --                                                                          --
  25 --                                                                          --
  26 -- You should have received a copy of the GNU General Public License and    --
  27 -- a copy of the GCC Runtime Library Exception along with this program;     --
  28 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  29 -- <http://www.gnu.org/licenses/>.                                          --
  30 --                                                                          --
  31 -- This unit was originally developed by Matthew J Heaney.                  --
  32 ------------------------------------------------------------------------------
  33 
  34 with System;
  35 
  36 with Ada.Containers.Synchronized_Queue_Interfaces;
  37 with Ada.Containers.Bounded_Doubly_Linked_Lists;
  38 
  39 generic
  40    with package Queue_Interfaces is
  41      new Ada.Containers.Synchronized_Queue_Interfaces (<>);
  42 
  43    type Queue_Priority is private;
  44 
  45    with function Get_Priority
  46      (Element : Queue_Interfaces.Element_Type) return Queue_Priority is <>;
  47 
  48    with function Before
  49      (Left, Right : Queue_Priority) return Boolean is <>;
  50 
  51    Default_Capacity : Count_Type;
  52    Default_Ceiling  : System.Any_Priority := System.Priority'Last;
  53 
  54 package Ada.Containers.Bounded_Priority_Queues is
  55    pragma Annotate (CodePeer, Skip_Analysis);
  56    pragma Preelaborate;
  57 
  58    package Implementation is
  59 
  60       --  All identifiers in this unit are implementation defined
  61 
  62       pragma Implementation_Defined;
  63 
  64       type List_Type (Capacity : Count_Type) is tagged limited private;
  65 
  66       procedure Enqueue
  67         (List     : in out List_Type;
  68          New_Item : Queue_Interfaces.Element_Type);
  69 
  70       procedure Dequeue
  71         (List    : in out List_Type;
  72          Element : out Queue_Interfaces.Element_Type);
  73 
  74       procedure Dequeue
  75         (List     : in out List_Type;
  76          At_Least : Queue_Priority;
  77          Element  : in out Queue_Interfaces.Element_Type;
  78          Success  : out Boolean);
  79 
  80       function First_Element
  81         (List : List_Type) return Queue_Interfaces.Element_Type;
  82 
  83       function Length (List : List_Type) return Count_Type;
  84 
  85       function Max_Length (List : List_Type) return Count_Type;
  86 
  87    private
  88 
  89       --  We need a better data structure here, such as a proper heap.  ???
  90 
  91       package List_Types is new Bounded_Doubly_Linked_Lists
  92         (Element_Type => Queue_Interfaces.Element_Type,
  93          "="          => Queue_Interfaces."=");
  94 
  95       type List_Type (Capacity : Count_Type) is tagged limited record
  96          Container  : List_Types.List (Capacity);
  97          Max_Length : Count_Type := 0;
  98       end record;
  99 
 100    end Implementation;
 101 
 102    protected type Queue
 103      (Capacity : Count_Type := Default_Capacity;
 104       Ceiling  : System.Any_Priority := Default_Ceiling)
 105    with
 106      Priority => Ceiling
 107    is new Queue_Interfaces.Queue with
 108 
 109       overriding entry Enqueue (New_Item : Queue_Interfaces.Element_Type);
 110 
 111       overriding entry Dequeue (Element : out Queue_Interfaces.Element_Type);
 112 
 113       --  The priority queue operation Dequeue_Only_High_Priority had been a
 114       --  protected entry in early drafts of AI05-0159, but it was discovered
 115       --  that that operation as specified was not in fact implementable. The
 116       --  operation was changed from an entry to a protected procedure per the
 117       --  ARG meeting in Edinburgh (June 2011), with a different signature and
 118       --  semantics.
 119 
 120       procedure Dequeue_Only_High_Priority
 121         (At_Least : Queue_Priority;
 122          Element  : in out Queue_Interfaces.Element_Type;
 123          Success  : out Boolean);
 124 
 125       overriding function Current_Use return Count_Type;
 126 
 127       overriding function Peak_Use return Count_Type;
 128 
 129    private
 130       List : Implementation.List_Type (Capacity);
 131    end Queue;
 132 
 133 end Ada.Containers.Bounded_Priority_Queues;