OSDN Git Service

2010-10-05 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-coorma.ads
index c31a7f0..9d404c2 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2004-2005 Free Software Foundation, Inc.          --
+--          Copyright (C) 2004-2009, 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 --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
--- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
--- 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.                                                      --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
 --                                                                          --
--- As a special exception,  if other files  instantiate  generics from this --
--- unit, or you link  this unit with other files  to produce an executable, --
--- this  unit  does not  by itself cause  the resulting  executable  to  be --
--- covered  by the  GNU  General  Public  License.  This exception does not --
--- however invalidate  any other reasons why  the executable file  might be --
--- covered by the  GNU Public License.                                      --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
 --                                                                          --
 -- This unit was originally developed by Matthew J Heaney.                  --
 ------------------------------------------------------------------------------
 
-with Ada.Containers.Red_Black_Trees;
-with Ada.Finalization;
-with Ada.Streams;
+private with Ada.Containers.Red_Black_Trees;
+private with Ada.Finalization;
+private with Ada.Streams;
 
 generic
-
    type Key_Type is private;
-
    type Element_Type is private;
 
    with function "<" (Left, Right : Key_Type) return Boolean is <>;
    with function "=" (Left, Right : Element_Type) return Boolean is <>;
 
 package Ada.Containers.Ordered_Maps is
-pragma Preelaborate (Ordered_Maps);
+   pragma Preelaborate;
+   pragma Remote_Types;
+
+   function Equivalent_Keys (Left, Right : Key_Type) return Boolean;
 
    type Map is tagged private;
+   pragma Preelaborable_Initialization (Map);
 
    type Cursor is private;
+   pragma Preelaborable_Initialization (Cursor);
 
    Empty_Map : constant Map;
 
@@ -69,18 +70,22 @@ pragma Preelaborate (Ordered_Maps);
 
    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;
       Process  : not null access
                    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 : in Element_Type);
-
    procedure Move (Target : in out Map; Source : in out Map);
 
    procedure Insert
@@ -111,6 +116,8 @@ pragma Preelaborate (Ordered_Maps);
       Key       : Key_Type;
       New_Item  : Element_Type);
 
+   procedure Exclude (Container : in out Map; Key : Key_Type);
+
    procedure Delete (Container : in out Map; Key : Key_Type);
 
    procedure Delete (Container : in out Map; Position : in out Cursor);
@@ -119,30 +126,18 @@ pragma Preelaborate (Ordered_Maps);
 
    procedure Delete_Last (Container : in out Map);
 
-   procedure Exclude (Container : in out Map; Key : Key_Type);
-
-   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 Floor (Container : Map; Key : Key_Type) return Cursor;
-
-   function Ceiling (Container : Map; Key : Key_Type) return Cursor;
-
    function First (Container : Map) return Cursor;
 
-   function First_Key (Container : Map) return Key_Type;
-
    function First_Element (Container : Map) return Element_Type;
 
-   function Last (Container : Map) return Cursor;
+   function First_Key (Container : Map) return Key_Type;
 
-   function Last_Key (Container : Map) return Key_Type;
+   function Last (Container : Map) return Cursor;
 
    function Last_Element (Container : Map) return Element_Type;
 
+   function Last_Key (Container : Map) return Key_Type;
+
    function Next (Position : Cursor) return Cursor;
 
    procedure Next (Position : in out Cursor);
@@ -151,6 +146,16 @@ pragma Preelaborate (Ordered_Maps);
 
    procedure Previous (Position : in out Cursor);
 
+   function Find (Container : Map; Key : Key_Type) return Cursor;
+
+   function Element (Container : Map; Key : Key_Type) return Element_Type;
+
+   function Floor (Container : Map; Key : Key_Type) return Cursor;
+
+   function Ceiling (Container : Map; Key : Key_Type) return Cursor;
+
+   function Contains (Container : Map; Key : Key_Type) return Boolean;
+
    function Has_Element (Position : Cursor) return Boolean;
 
    function "<" (Left, Right : Cursor) return Boolean;
@@ -175,6 +180,9 @@ pragma Preelaborate (Ordered_Maps);
 
 private
 
+   pragma Inline (Next);
+   pragma Inline (Previous);
+
    type Node_Type;
    type Node_Access is access Node_Type;
 
@@ -187,23 +195,25 @@ private
       Element : Element_Type;
    end record;
 
-   package Tree_Types is new Red_Black_Trees.Generic_Tree_Types
-     (Node_Type,
-      Node_Access);
+   package Tree_Types is
+     new Red_Black_Trees.Generic_Tree_Types (Node_Type, Node_Access);
 
    type Map is new Ada.Finalization.Controlled with record
       Tree : Tree_Types.Tree_Type;
    end record;
 
+   overriding
    procedure Adjust (Container : in out Map);
 
+   overriding
    procedure Finalize (Container : in out Map) renames Clear;
 
    use Red_Black_Trees;
    use Tree_Types;
    use Ada.Finalization;
+   use Ada.Streams;
 
-   type Map_Access is access Map;
+   type Map_Access is access all Map;
    for Map_Access'Storage_Size use 0;
 
    type Cursor is record
@@ -211,18 +221,28 @@ private
       Node      : Node_Access;
    end record;
 
-   No_Element : constant Cursor := Cursor'(null, null);
+   procedure Write
+     (Stream : not null access Root_Stream_Type'Class;
+      Item   : Cursor);
 
-   use Ada.Streams;
+   for Cursor'Write use Write;
+
+   procedure Read
+     (Stream : not null access Root_Stream_Type'Class;
+      Item   : out Cursor);
+
+   for Cursor'Read use Read;
+
+   No_Element : constant Cursor := Cursor'(null, null);
 
    procedure Write
-     (Stream    : access Root_Stream_Type'Class;
+     (Stream    : not null access Root_Stream_Type'Class;
       Container : Map);
 
    for Map'Write use Write;
 
    procedure Read
-     (Stream    : access Root_Stream_Type'Class;
+     (Stream    : not null access Root_Stream_Type'Class;
       Container : out Map);
 
    for Map'Read use Read;