OSDN Git Service

2010-06-22 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-nudira.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT RUN-TIME COMPONENTS                         --
4 --                                                                          --
5 --         A D A . N U M E R I C S . D I S C R E T E _ R A N D O M          --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
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 with System.Random_Numbers; use System.Random_Numbers;
33
34 package body Ada.Numerics.Discrete_Random is
35
36    -------------------------
37    -- Implementation Note --
38    -------------------------
39
40    --  The design of this spec is a bit awkward, as a result of Ada 95 not
41    --  permitting in-out parameters for function formals (most naturally
42    --  Generator values would be passed this way). In pure Ada 95, the only
43    --  solution would be to add a self-referential component to the generator
44    --  allowing access to the generator object from inside the function. This
45    --  would work because the generator is limited, which prevents any copy.
46
47    --  This is a bit heavy, so what we do is to use Unrestricted_Access to
48    --  get a pointer to the state in the passed Generator. This works because
49    --  Generator is a limited type and will thus always be passed by reference.
50
51    subtype Rep_Generator is System.Random_Numbers.Generator;
52    subtype Rep_State is System.Random_Numbers.State;
53
54    function Rep_Random is
55       new Random_Discrete (Result_Subtype, Result_Subtype'First);
56
57    function Random (Gen : Generator) return Result_Subtype is
58    begin
59       return Rep_Random (Gen.Rep);
60    end Random;
61
62    procedure Reset
63      (Gen       : Generator;
64       Initiator : Integer)
65    is
66       G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
67    begin
68       Reset (G, Initiator);
69    end Reset;
70
71    procedure Reset (Gen : Generator) is
72       G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
73    begin
74       Reset (G);
75    end Reset;
76
77    procedure Save
78      (Gen        : Generator;
79       To_State   : out State)
80    is
81    begin
82       Save (Gen.Rep, State (To_State));
83    end Save;
84
85    procedure Reset
86      (Gen        : Generator;
87       From_State : State)
88    is
89       G : Rep_Generator renames Gen.Rep'Unrestricted_Access.all;
90    begin
91       Reset (G, From_State);
92    end Reset;
93
94    function Image (Of_State : State)  return String is
95    begin
96       return Image (Rep_State (Of_State));
97    end Image;
98
99    function Value (Coded_State : String) return State is
100       G : Generator;
101       S : Rep_State;
102    begin
103       Reset (G.Rep, Coded_State);
104       System.Random_Numbers.Save (G.Rep, S);
105       return State (S);
106    end Value;
107
108 end Ada.Numerics.Discrete_Random;