1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--                            G N A T . T A B L E                           --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--                     Copyright (C) 1998-2021, AdaCore                     --
10--                                                                          --
11-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
17--                                                                          --
18-- As a special exception under Section 7 of GPL version 3, you are granted --
19-- additional permissions described in the GCC Runtime Library Exception,   --
20-- version 3.1, as published by the Free Software Foundation.               --
21--                                                                          --
22-- You should have received a copy of the GNU General Public License and    --
23-- a copy of the GCC Runtime Library Exception along with this program;     --
24-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25-- <http://www.gnu.org/licenses/>.                                          --
26--                                                                          --
27-- GNAT was originally developed  by the GNAT team at  New York University. --
28-- Extensive contributions were provided by Ada Core Technologies Inc.      --
29--                                                                          --
30------------------------------------------------------------------------------
31
32--  This package provides a singleton version of GNAT.Dynamic_Tables
33--  (g-dyntab.ads). See that package for documentation. This package just
34--  declares a single instance of GNAT.Dynamic_Tables.Instance, and provides
35--  wrappers for all the subprograms, passing that single instance.
36
37--  Note that these three interfaces should remain synchronized to keep as much
38--  coherency as possible among these related units:
39--
40--     GNAT.Dynamic_Tables
41--     GNAT.Table
42--     Table (the compiler unit)
43
44pragma Compiler_Unit_Warning;
45
46with GNAT.Dynamic_Tables;
47
48generic
49   type Table_Component_Type is private;
50   type Table_Index_Type     is range <>;
51
52   Table_Low_Bound   : Table_Index_Type := Table_Index_Type'First;
53   Table_Initial     : Positive := 8;
54   Table_Increment   : Natural := 100;
55   Table_Name        : String := ""; -- for debugging printouts
56   pragma Unreferenced (Table_Name);
57   Release_Threshold : Natural := 0;
58
59package GNAT.Table is
60   pragma Elaborate_Body;
61
62   package Tab is new GNAT.Dynamic_Tables
63     (Table_Component_Type,
64      Table_Index_Type,
65      Table_Low_Bound,
66      Table_Initial,
67      Table_Increment,
68      Release_Threshold);
69
70   subtype Valid_Table_Index_Type is Tab.Valid_Table_Index_Type;
71   subtype Table_Last_Type is Tab.Table_Last_Type;
72   subtype Table_Type is Tab.Table_Type;
73   function "=" (X, Y : Table_Type) return Boolean renames Tab."=";
74
75   subtype Table_Ptr is Tab.Table_Ptr;
76
77   The_Instance : Tab.Instance;
78   Table : Table_Ptr renames The_Instance.Table;
79   Locked : Boolean renames The_Instance.Locked;
80
81   function Is_Empty return Boolean;
82
83   procedure Init;
84   pragma Inline (Init);
85   procedure Free;
86   pragma Inline (Free);
87
88   function First return Table_Index_Type;
89   pragma Inline (First);
90
91   function Last return Table_Last_Type;
92   pragma Inline (Last);
93
94   procedure Release;
95   pragma Inline (Release);
96
97   procedure Set_Last (New_Val : Table_Last_Type);
98   pragma Inline (Set_Last);
99
100   procedure Increment_Last;
101   pragma Inline (Increment_Last);
102
103   procedure Decrement_Last;
104   pragma Inline (Decrement_Last);
105
106   procedure Append (New_Val : Table_Component_Type);
107   pragma Inline (Append);
108
109   procedure Append_All (New_Vals : Table_Type);
110   pragma Inline (Append_All);
111
112   procedure Set_Item
113     (Index : Valid_Table_Index_Type;
114      Item  : Table_Component_Type);
115   pragma Inline (Set_Item);
116
117   subtype Saved_Table is Tab.Instance;
118   --  Type used for Save/Restore subprograms
119
120   function Save return Saved_Table;
121   pragma Inline (Save);
122   --  Resets table to empty, but saves old contents of table in returned
123   --  value, for possible later restoration by a call to Restore.
124
125   procedure Restore (T : in out Saved_Table);
126   pragma Inline (Restore);
127   --  Given a Saved_Table value returned by a prior call to Save, restores
128   --  the table to the state it was in at the time of the Save call.
129
130   procedure Allocate (Num : Integer := 1);
131   function Allocate (Num : Integer := 1) return Valid_Table_Index_Type;
132   pragma Inline (Allocate);
133   --  Adds Num to Last. The function version also returns the old value of
134   --  Last + 1. Note that this function has the possible side effect of
135   --  reallocating the table. This means that a reference X.Table (X.Allocate)
136   --  is incorrect, since the call to X.Allocate may modify the results of
137   --  calling X.Table.
138
139   generic
140     with procedure Action
141       (Index : Valid_Table_Index_Type;
142        Item  : Table_Component_Type;
143        Quit  : in out Boolean) is <>;
144   procedure For_Each;
145   pragma Inline (For_Each);
146
147   generic
148     with function Lt (Comp1, Comp2 : Table_Component_Type) return Boolean;
149   procedure Sort_Table;
150   pragma Inline (Sort_Table);
151
152end GNAT.Table;
153