OSDN Git Service

2005-11-14 Matthew Heaney <heaney@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-cohama.ads
index 72dd1c2..42b1cad 100644 (file)
@@ -2,11 +2,11 @@
 --                                                                          --
 --                         GNAT LIBRARY COMPONENTS                          --
 --                                                                          --
---                        ADA.CONTAINERS.HASHED_MAPS                        --
+--            A D A . C O N T A I N E R S . H A S H E D _ M A P S           --
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---             Copyright (C) 2004 Free Software Foundation, Inc.            --
+--          Copyright (C) 2004-2005, Free Software Foundation, Inc.         --
 --                                                                          --
 -- This specification is derived from the Ada Reference Manual for use with --
 -- GNAT. The copyright notice above, and the license provisions that follow --
@@ -20,8 +20,8 @@
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, USA.                                              --
 --                                                                          --
 -- As a special exception,  if other files  instantiate  generics from this --
 -- unit, or you link  this unit with other files  to produce an executable, --
 
 with Ada.Containers.Hash_Tables;
 with Ada.Streams;
+with Ada.Finalization;
 
 generic
    type Key_Type is private;
-
    type Element_Type is private;
 
    with function Hash (Key : Key_Type) return Hash_Type;
-
    with function Equivalent_Keys (Left, Right : Key_Type) return Boolean;
-
    with function "=" (Left, Right : Element_Type) return Boolean is <>;
 
 package Ada.Containers.Hashed_Maps is
-pragma Preelaborate (Hashed_Maps);
+   pragma Preelaborate;
 
    type Map is tagged private;
 
@@ -60,14 +58,25 @@ pragma Preelaborate (Hashed_Maps);
 
    function "=" (Left, Right : Map) return Boolean;
 
+   function Capacity (Container : Map) return Count_Type;
+
+   procedure Reserve_Capacity (Container : in out Map;
+                               Capacity  : Count_Type);
+
    function Length (Container : Map) return Count_Type;
 
    function Is_Empty (Container : Map) return Boolean;
 
    procedure Clear (Container : in out Map);
 
-   function Element (Position : Cursor)
-      return Element_Type;
+   function Key (Position : Cursor) return Key_Type;
+
+   function Element (Position : Cursor) return Element_Type;
+
+   procedure Replace_Element
+     (Container : in out Map;
+      Position  : Cursor;
+      New_Item  : Element_Type);
 
    procedure Query_Element
      (Position : Cursor;
@@ -75,12 +84,11 @@ pragma Preelaborate (Hashed_Maps);
                    procedure (Key : Key_Type; Element : Element_Type));
 
    procedure Update_Element
-     (Position : Cursor;
-      Process  : not null access
+     (Container : in out Map;
+      Position  : Cursor;
+      Process   : not null access
                    procedure (Key : Key_Type; Element : in out Element_Type));
 
-   procedure Replace_Element (Position : Cursor; By : Element_Type);
-
    procedure Move (Target : in out Map; Source : in out Map);
 
    procedure Insert
@@ -93,6 +101,12 @@ pragma Preelaborate (Hashed_Maps);
    procedure Insert
      (Container : in out Map;
       Key       : Key_Type;
+      Position  : out Cursor;
+      Inserted  : out Boolean);
+
+   procedure Insert
+     (Container : in out Map;
+      Key       : Key_Type;
       New_Item  : Element_Type);
 
    procedure Include
@@ -105,38 +119,25 @@ pragma Preelaborate (Hashed_Maps);
       Key       : Key_Type;
       New_Item  : Element_Type);
 
-   procedure Insert
-     (Container : in out Map;
-      Key       : Key_Type;
-      Position  : out Cursor;
-      Inserted  : out Boolean);
+   procedure Exclude (Container : in out Map; Key : Key_Type);
 
    procedure Delete (Container : in out Map; Key : Key_Type);
 
-   procedure Exclude (Container : in out Map; Key : Key_Type);
-
    procedure Delete (Container : in out Map; Position : in out Cursor);
 
-   function Contains (Container : Map; Key : Key_Type) return Boolean;
-
-   function Find (Container : Map; Key : Key_Type) return Cursor;
-
-   function Element (Container : Map; Key : Key_Type) return Element_Type;
-
-   function Capacity (Container : Map) return Count_Type;
-
-   procedure Reserve_Capacity (Container : in out Map;
-                               Capacity  : Count_Type);
-
    function First (Container : Map) return Cursor;
 
    function Next (Position : Cursor) return Cursor;
 
    procedure Next (Position : in out Cursor);
 
-   function Has_Element (Position : Cursor) return Boolean;
+   function Find (Container : Map; Key : Key_Type) return Cursor;
 
-   function Key (Position : Cursor) return Key_Type;
+   function Contains (Container : Map; Key : Key_Type) return Boolean;
+
+   function Element (Container : Map; Key : Key_Type) return Element_Type;
+
+   function Has_Element (Position : Cursor) return Boolean;
 
    function Equivalent_Keys (Left, Right : Cursor) return Boolean;
 
@@ -149,15 +150,38 @@ pragma Preelaborate (Hashed_Maps);
       Process   : not null access procedure (Position : Cursor));
 
 private
+   pragma Inline ("=");
+   pragma Inline (Length);
+   pragma Inline (Is_Empty);
+   pragma Inline (Clear);
+   pragma Inline (Key);
+   pragma Inline (Element);
+   pragma Inline (Move);
+   pragma Inline (Contains);
+   pragma Inline (Capacity);
+   pragma Inline (Reserve_Capacity);
+   pragma Inline (Has_Element);
+   pragma Inline (Equivalent_Keys);
 
    type Node_Type;
    type Node_Access is access Node_Type;
 
-   package HT_Types is new Hash_Tables.Generic_Hash_Table_Types (Node_Access);
+   type Node_Type is limited record
+      Key     : Key_Type;
+      Element : Element_Type;
+      Next    : Node_Access;
+   end record;
 
-   use HT_Types;
+   package HT_Types is new Hash_Tables.Generic_Hash_Table_Types
+     (Node_Type,
+      Node_Access);
+
+   type Map is new Ada.Finalization.Controlled with record
+      HT : HT_Types.Hash_Table_Type;
+   end record;
 
-   type Map is new Hash_Table_Type with null record;
+   use HT_Types;
+   use Ada.Finalization;
 
    procedure Adjust (Container : in out Map);
 
@@ -177,7 +201,7 @@ private
 
    for Map'Read use Read;
 
-   Empty_Map : constant Map := (Hash_Table_Type with null record);
+   Empty_Map : constant Map := (Controlled with HT => (null, 0, 0, 0));
 
    type Map_Access is access constant Map;
    for Map_Access'Storage_Size use 0;
@@ -188,6 +212,18 @@ private
          Node      : Node_Access;
       end record;
 
+   procedure Write
+     (Stream : access Root_Stream_Type'Class;
+      Item   : Cursor);
+
+   for Cursor'Write use Write;
+
+   procedure Read
+     (Stream : access Root_Stream_Type'Class;
+      Item   : out Cursor);
+
+   for Cursor'Read use Read;
+
    No_Element : constant Cursor := (Container => null, Node => null);
 
 end Ada.Containers.Hashed_Maps;