| -- F393A00.A |
| -- |
| -- Grant of Unlimited Rights |
| -- |
| -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, |
| -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained |
| -- unlimited rights in the software and documentation contained herein. |
| -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making |
| -- this public release, the Government intends to confer upon all |
| -- recipients unlimited rights equal to those held by the Government. |
| -- These rights include rights to use, duplicate, release or disclose the |
| -- released technical data and computer software in whole or in part, in |
| -- any manner and for any purpose whatsoever, and to have or permit others |
| -- to do so. |
| -- |
| -- DISCLAIMER |
| -- |
| -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR |
| -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED |
| -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE |
| -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE |
| -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A |
| -- PARTICULAR PURPOSE OF SAID MATERIAL. |
| --* |
| -- |
| -- FOUNDATION DESCRIPTION: |
| -- This foundation provides a simple background for a class family |
| -- based on an abstract type. It is to be used to test the |
| -- dispatching of various forms of subprogram defined/inherited and |
| -- overridden with the abstract type. |
| -- |
| -- type procedures functions |
| -- ---- ---------- --------- |
| -- Object Initialize, Swap(abstract) Create(abstract) |
| -- Object'Class Initialized |
| -- Windmill is new Object Swap, Stop, Add_Spin Create, Spin |
| -- Pump is new Windmill Set_Rate Create, Rate |
| -- Mill is new Windmill Swap, Stop Create |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| package F393A00_0 is |
| procedure TC_Touch ( A_Tag : Character ); |
| procedure TC_Validate( Expected: String; Message: String ); |
| end F393A00_0; |
| |
| with Report; |
| package body F393A00_0 is |
| Expectation : String(1..20); |
| Finger : Natural := 0; |
| |
| procedure TC_Touch ( A_Tag : Character ) is |
| begin |
| Finger := Finger+1; |
| Expectation(Finger) := A_Tag; |
| end TC_Touch; |
| |
| procedure TC_Validate( Expected: String; Message: String ) is |
| begin |
| if Expectation(1..Finger) /= Expected then |
| Report.Failed( Message & " Expecting: " & Expected |
| & " Got: " & Expectation(1..Finger) ); |
| end if; |
| Finger := 0; |
| end TC_Validate; |
| end F393A00_0; |
| |
| ---------------------------------------------------------------------- |
| |
| package F393A00_1 is |
| type Object is abstract tagged private; |
| procedure Initialize( An_Object: in out Object ); |
| function Initialized( An_Object: Object'Class ) return Boolean; |
| procedure Swap( A,B: in out Object ) is abstract; |
| function Create return Object is abstract; |
| private |
| type Object is abstract tagged record |
| Initialized : Boolean := False; |
| end record; |
| end F393A00_1; |
| |
| with F393A00_0; |
| package body F393A00_1 is |
| procedure Initialize( An_Object: in out Object ) is |
| begin |
| An_Object.Initialized := True; |
| F393A00_0.TC_Touch('a'); |
| end Initialize; |
| |
| function Initialized( An_Object: Object'Class ) return Boolean is |
| begin |
| F393A00_0.TC_Touch('b'); |
| return An_Object.Initialized; |
| end Initialized; |
| end F393A00_1; |
| |
| ---------------------------------------------------------------------- |
| |
| with F393A00_1; |
| package F393A00_2 is |
| |
| type Rotational_Measurement is range -1_000 .. 1_000; |
| type Windmill is new F393A00_1.Object with private; |
| |
| procedure Swap( A,B: in out Windmill ); |
| |
| function Create return Windmill; |
| |
| procedure Add_Spin( To_Mill : in out Windmill; |
| RPMs : in Rotational_Measurement ); |
| |
| procedure Stop( Mill : in out Windmill ); |
| |
| function Spin( Mill : Windmill ) return Rotational_Measurement; |
| |
| private |
| type Windmill is new F393A00_1.Object with |
| record |
| Spin : Rotational_Measurement := 0; |
| end record; |
| end F393A00_2; |
| |
| with F393A00_0; |
| package body F393A00_2 is |
| |
| procedure Swap( A,B: in out Windmill ) is |
| T : constant Windmill := B; |
| begin |
| F393A00_0.TC_Touch('c'); |
| B := A; |
| A := T; |
| end Swap; |
| |
| function Create return Windmill is |
| A_Mill : Windmill; |
| begin |
| F393A00_0.TC_Touch('d'); |
| return A_Mill; |
| end Create; |
| |
| procedure Add_Spin( To_Mill : in out Windmill; |
| RPMs : in Rotational_Measurement ) is |
| begin |
| F393A00_0.TC_Touch('e'); |
| To_Mill.Spin := To_Mill.Spin + RPMs; |
| end Add_Spin; |
| |
| procedure Stop( Mill : in out Windmill ) is |
| begin |
| F393A00_0.TC_Touch('f'); |
| Mill.Spin := 0; |
| end Stop; |
| |
| function Spin( Mill : Windmill ) return Rotational_Measurement is |
| begin |
| F393A00_0.TC_Touch('g'); |
| return Mill.Spin; |
| end Spin; |
| |
| end F393A00_2; |
| |
| ---------------------------------------------------------------------- |
| |
| with F393A00_2; |
| package F393A00_3 is |
| type Pump is new F393A00_2.Windmill with private; |
| function Create return Pump; |
| |
| type Gallons_Per_Revolution is digits 3; |
| procedure Set_Rate( A_Pump: in out Pump; To_Rate: Gallons_Per_Revolution); |
| function Rate( Of_Pump: Pump ) return Gallons_Per_Revolution; |
| private |
| type Pump is new F393A00_2.Windmill with |
| record |
| GPRPM : Gallons_Per_Revolution := 0.0; -- Gallons/RPM |
| end record; |
| end F393A00_3; |
| |
| with F393A00_0; |
| package body F393A00_3 is |
| function Create return Pump is |
| Sump : Pump; |
| begin |
| F393A00_0.TC_Touch('h'); |
| return Sump; |
| end Create; |
| |
| procedure Set_Rate( A_Pump: in out Pump; To_Rate: Gallons_Per_Revolution) |
| is |
| begin |
| F393A00_0.TC_Touch('i'); |
| A_Pump.GPRPM := To_Rate; |
| end Set_Rate; |
| |
| function Rate( Of_Pump: Pump ) return Gallons_Per_Revolution is |
| begin |
| F393A00_0.TC_Touch('j'); |
| return Of_Pump.GPRPM; |
| end Rate; |
| end F393A00_3; |
| |
| ---------------------------------------------------------------------- |
| |
| with F393A00_2; |
| with F393A00_3; |
| package F393A00_4 is |
| type Mill is new F393A00_2.Windmill with private; |
| |
| procedure Swap( A,B: in out Mill ); |
| function Create return Mill; |
| procedure Stop( It: in out Mill ); |
| private |
| type Mill is new F393A00_2.Windmill with |
| record |
| Pump: F393A00_3.Pump := F393A00_3.Create; |
| end record; |
| end F393A00_4; |
| |
| with F393A00_0; |
| package body F393A00_4 is |
| procedure Swap( A,B: in out Mill ) is |
| T: constant Mill := A; |
| begin |
| F393A00_0.TC_Touch('k'); |
| A := B; |
| B := T; |
| end Swap; |
| |
| function Create return Mill is |
| A_Mill : Mill; |
| begin |
| F393A00_0.TC_Touch('l'); |
| return A_Mill; |
| end Create; |
| |
| procedure Stop( It: in out Mill ) is |
| begin |
| F393A00_0.TC_Touch('m'); |
| F393A00_3.Stop( It.Pump ); |
| F393A00_2.Stop( F393A00_2.Windmill( It ) ); |
| end Stop; |
| end F393A00_4; |