OSDN Git Service

2010-12-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-nudira.adb
index b8a3127..ca81ba5 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
-with System.Random_Numbers; use System.Random_Numbers;
-
 package body Ada.Numerics.Discrete_Random is
 
-   -------------------------
-   -- Implementation Note --
-   -------------------------
-
-   --  The design of this spec is very awkward, as a result of Ada 95 not
-   --  permitting in-out parameters for function formals (most naturally
-   --  Generator values would be passed this way). In pure Ada 95, the only
-   --  solution is to use the heap and pointers, and, to avoid memory leaks,
-   --  controlled types.
+   package SRN renames System.Random_Numbers;
+   use SRN;
 
-   --  This is awfully heavy, so what we do is to use Unrestricted_Access to
-   --  get a pointer to the state in the passed Generator. This works because
-   --  Generator is a limited type and will thus always be passed by reference.
+   -----------
+   -- Image --
+   -----------
 
-   subtype Rep_Generator is System.Random_Numbers.Generator;
-   subtype Rep_State is System.Random_Numbers.State;
+   function Image (Of_State : State) return String is
+   begin
+      return Image (SRN.State (Of_State));
+   end Image;
 
-   function Rep_Random is
-      new Random_Discrete (Result_Subtype, Result_Subtype'First);
+   ------------
+   -- Random --
+   ------------
 
    function Random (Gen : Generator) return Result_Subtype is
+      function Random is
+        new SRN.Random_Discrete (Result_Subtype, Result_Subtype'First);
    begin
-      return Rep_Random (Gen.Rep);
+      return Random (SRN.Generator (Gen));
    end Random;
 
-   procedure Reset
-     (Gen       : Generator;
-      Initiator : Integer)
-   is
-      G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
-   begin
-      Reset (G, Initiator);
-   end Reset;
+   -----------
+   -- Reset --
+   -----------
 
    procedure Reset (Gen : Generator) is
-      G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
    begin
-      Reset (G);
+      Reset (SRN.Generator (Gen));
    end Reset;
 
-   procedure Save
-     (Gen        : Generator;
-      To_State   : out State)
-   is
+   procedure Reset (Gen : Generator; Initiator : Integer) is
    begin
-      Save (Gen.Rep, State (To_State));
-   end Save;
+      Reset (SRN.Generator (Gen), Initiator);
+   end Reset;
 
-   procedure Reset
-     (Gen        : Generator;
-      From_State : State)
-   is
-      G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
+   procedure Reset (Gen : Generator; From_State : State) is
    begin
-      Reset (G, From_State);
+      Reset (SRN.Generator (Gen), SRN.State (From_State));
    end Reset;
 
-   function Image (Of_State : State)  return String is
+   ----------
+   -- Save --
+   ----------
+
+   procedure Save (Gen : Generator; To_State   : out State) is
    begin
-      return Image (Rep_State (Of_State));
-   end Image;
+      Save (SRN.Generator (Gen), SRN.State (To_State));
+   end Save;
+
+   -----------
+   -- Value --
+   -----------
 
    function Value (Coded_State : String) return State is
-      G : Generator;
-      S : Rep_State;
    begin
-      Reset (G.Rep, Coded_State);
-      System.Random_Numbers.Save (G.Rep, S);
-      return State (S);
+      return State (SRN.State'(Value (Coded_State)));
    end Value;
 
 end Ada.Numerics.Discrete_Random;