| -- C392002.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. |
| --* |
| -- |
| -- OBJECTIVE: |
| -- Check that the use of a class-wide formal parameter allows for the |
| -- proper dispatching of objects to the appropriate implementation of |
| -- a primitive operation. Check this in the case where the root tagged |
| -- type is defined in a generic package, and the type derived from it is |
| -- defined in that same generic package. |
| -- |
| -- TEST DESCRIPTION: |
| -- Declare a root tagged type, and some associated primitive operations. |
| -- Extend the root type, and override one or more primitive operations, |
| -- inheriting the other primitive operations from the root type. |
| -- Derive from the extended type, again overriding some primitive |
| -- operations and inheriting others (including some that the parent |
| -- inherited). |
| -- Define a subprogram with a class-wide parameter, inside of which is a |
| -- call on a dispatching primitive operation. These primitive operations |
| -- modify global variables (the class-wide parameter has mode IN). |
| -- |
| -- The following hierarchy of tagged types and primitive operations is |
| -- utilized in this test: |
| -- |
| -- |
| -- type Vehicle (root) |
| -- | |
| -- type Motorcycle |
| -- | |
| -- | Operations |
| -- | Engine_Size |
| -- | Catalytic_Converter |
| -- | Emissions_Produced |
| -- | |
| -- type Automobile (extended from Motorcycle) |
| -- | |
| -- | Operations |
| -- | (Engine_Size) (inherited) |
| -- | Catalytic_Converter (overridden) |
| -- | Emissions_Produced (overridden) |
| -- | |
| -- type Truck (extended from Automobile) |
| -- | |
| -- | Operations |
| -- | (Engine_Size) (inherited twice - Motorcycle) |
| -- | (Catalytic_Converter) (inherited - Automobile) |
| -- | Emissions_Produced (overridden) |
| -- |
| -- |
| -- In this test, we are concerned with the following selection of dispatching |
| -- calls, accomplished with the use of a Vehicle'Class IN procedure |
| -- parameter : |
| -- |
| -- \ Type |
| -- Prim. Op \ Motorcycle Automobile Truck |
| -- \------------------------------------------------ |
| -- Engine_Size | X X X |
| -- Catalytic_Converter | X X X |
| -- Emissions_Produced | X X X |
| -- |
| -- |
| -- |
| -- The location of the declaration and derivation of the root and extended |
| -- types will be varied over a series of tests. Locations of declaration |
| -- and derivation for a particular test are marked with an asterisk (*). |
| -- |
| -- Root type: |
| -- |
| -- Declared in package. |
| -- * Declared in generic package. |
| -- |
| -- Extended types: |
| -- |
| -- * Derived in parent location. |
| -- Derived in a nested package. |
| -- Derived in a nested subprogram. |
| -- Derived in a nested generic package. |
| -- Derived in a separate package. |
| -- Derived in a separate visible child package. |
| -- Derived in a separate private child package. |
| -- |
| -- Primitive Operations: |
| -- |
| -- * Procedures with same parameter profile. |
| -- Procedures with different parameter profile. |
| -- * Functions with same parameter profile. |
| -- Functions with different parameter profile. |
| -- * Mixture of Procedures and Functions. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- 09 May 96 SAIC Made single-file for 2.1 |
| -- |
| --! |
| |
| ------------------------------------------------------------------- C392002_0 |
| |
| -- Declare the root and extended types, along with their primitive |
| -- operations in a generic package. |
| |
| generic |
| |
| type Cubic_Inches is range <>; |
| type Emission_Measure is digits <>; |
| Emissions_per_Engine_Cubic_Inch : Emission_Measure; |
| |
| package C392002_0 is -- package Vehicle_Simulation |
| |
| -- |
| -- Equipment types and their primitive operations. |
| -- |
| |
| -- Root type. |
| |
| type Vehicle is abstract tagged |
| record |
| Weight : Integer; |
| Wheels : Positive; |
| end record; |
| |
| -- Abstract operations of type Vehicle. |
| function Engine_Size (V : in Vehicle) return Cubic_Inches |
| is abstract; |
| function Catalytic_Converter (V : in Vehicle) return Boolean |
| is abstract; |
| function Emissions_Produced (V : in Vehicle) return Emission_Measure |
| is abstract; |
| |
| -- |
| |
| type Motorcycle is new Vehicle with |
| record |
| Size_Of_Engine : Cubic_Inches; |
| end record; |
| |
| -- Primitive operations of type Motorcycle. |
| function Engine_Size (V : in Motorcycle) return Cubic_Inches; |
| function Catalytic_Converter (V : in Motorcycle) return Boolean; |
| function Emissions_Produced (V : in Motorcycle) return Emission_Measure; |
| |
| -- |
| |
| type Automobile is new Motorcycle with |
| record |
| Passenger_Capacity : Integer; |
| end record; |
| |
| -- Function Engine_Size inherited from parent (Motorcycle). |
| -- Primitive operations (Overridden). |
| function Catalytic_Converter (V : in Automobile) return Boolean; |
| function Emissions_Produced (V : in Automobile) return Emission_Measure; |
| |
| -- |
| |
| type Truck is new Automobile with |
| record |
| Hauling_Capacity : Natural; |
| end record; |
| |
| -- Function Engine_Size inherited twice. |
| -- Function Catalytic_Converter inherited from parent (Automobile). |
| -- Primitive operation (Overridden). |
| function Emissions_Produced (V : in Truck) return Emission_Measure; |
| |
| end C392002_0; |
| |
| -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- |
| |
| package body c392002_0 is |
| |
| -- |
| -- Primitive operations for Motorcycle. |
| -- |
| |
| function Engine_Size (V : in Motorcycle) return Cubic_Inches is |
| begin |
| return (V.Size_Of_Engine); |
| end Engine_Size; |
| |
| |
| function Catalytic_Converter (V : in Motorcycle) return Boolean is |
| begin |
| return (False); |
| end Catalytic_Converter; |
| |
| |
| function Emissions_Produced (V : in Motorcycle) return Emission_Measure is |
| begin |
| return 100.00; |
| end Emissions_Produced; |
| |
| -- |
| -- Overridden operations for Automobile type. |
| -- |
| |
| function Catalytic_Converter (V : in Automobile) return Boolean is |
| begin |
| return (True); |
| end Catalytic_Converter; |
| |
| |
| function Emissions_Produced (V : in Automobile) return Emission_Measure is |
| begin |
| return 200.00; |
| end Emissions_Produced; |
| |
| -- |
| -- Overridden operation for Truck type. |
| -- |
| |
| function Emissions_Produced (V : in Truck) return Emission_Measure is |
| begin |
| return 300.00; |
| end Emissions_Produced; |
| |
| end C392002_0; |
| |
| --------------------------------------------------------------------- C392002 |
| |
| with C392002_0; -- with Vehicle_Simulation; |
| with Report; |
| |
| procedure C392002 is |
| |
| type Decade is (c1970, c1980, c1990); |
| type Vehicle_Emissions is digits 6; |
| type Engine_Emissions_by_Decade is array (Decade) of Vehicle_Emissions; |
| subtype Engine_Size is Integer range 100 .. 1000; |
| |
| Five_Tons : constant Natural := 10000; |
| Catalytic_Converter_Offset : constant Vehicle_Emissions := 0.8; |
| Truck_Adjustment_Factor : constant Vehicle_Emissions := 1.2; |
| |
| |
| Engine_Emission_Factor : Engine_Emissions_by_Decade := (c1970 => 10.00, |
| c1980 => 8.00, |
| c1990 => 5.00); |
| |
| -- Instantiate generic package for 1970 simulation. |
| |
| package Sim_1970 is new C392002_0 |
| (Cubic_Inches => Engine_Size, |
| Emission_Measure => Vehicle_Emissions, |
| Emissions_Per_Engine_Cubic_Inch => Engine_Emission_Factor (c1970)); |
| |
| |
| -- Declare and initialize vehicle objects. |
| |
| Cycle_1970 : Sim_1970.Motorcycle := (Weight => 400, |
| Wheels => 2, |
| Size_Of_Engine => 100); |
| |
| Auto_1970 : Sim_1970.Automobile := (2000, 4, 500, 5); |
| |
| Truck_1970 : Sim_1970.Truck := (Weight => 5000, |
| Wheels => 18, |
| Size_Of_Engine => 1000, |
| Passenger_Capacity => 2, |
| Hauling_Capacity => Five_Tons); |
| |
| -- Function Get_Engine_Size performs a dispatching call on a |
| -- primitive operation that has been defined for an ancestor type and |
| -- inherited by each type derived from the ancestor. |
| |
| function Get_Engine_Size (V : in Sim_1970.Vehicle'Class) |
| return Engine_Size is |
| begin |
| return (Sim_1970.Engine_Size (V)); -- Dispatch according to tag. |
| end Get_Engine_Size; |
| |
| |
| -- Function Catalytic_Converter_Present performs a dispatching call on |
| -- a primitive operation that has been defined for an ancestor type, |
| -- overridden in the parent extended type, and inherited by the subsequent |
| -- extended type. |
| |
| function Catalytic_Converter_Present (V : in Sim_1970.Vehicle'Class) |
| return Boolean is |
| begin |
| return (Sim_1970.Catalytic_Converter (V)); -- Dispatch according to tag. |
| end Catalytic_Converter_Present; |
| |
| |
| -- Function Air_Quality_Measure performs a dispatching call on |
| -- a primitive operation that has been defined for an ancestor type, and |
| -- overridden in each subsequent extended type. |
| |
| function Air_Quality_Measure (V : in Sim_1970.Vehicle'Class) |
| return Vehicle_Emissions is |
| begin |
| return (Sim_1970.Emissions_Produced (V)); -- Dispatch according to tag. |
| end Air_Quality_Measure; |
| |
| -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- |
| |
| begin -- Main test procedure. |
| |
| Report.Test ("C392002", "Check that the use of a class-wide parameter " |
| & "allows for proper dispatching where root type " |
| & "and extended types are declared in the same " |
| & "generic package" ); |
| |
| if (Get_Engine_Size (Cycle_1970) /= 100) or |
| (Get_Engine_Size (Auto_1970) /= 500) or |
| (Get_Engine_Size (Truck_1970) /= 1000) |
| then |
| Report.Failed ("Failed dispatch to Get_Engine_Size"); |
| end if; |
| |
| if Catalytic_Converter_Present (Cycle_1970) or |
| not Catalytic_Converter_Present (Auto_1970) or |
| not Catalytic_Converter_Present (Truck_1970) |
| then |
| Report.Failed ("Failed dispatch to Catalytic_Converter_Present"); |
| end if; |
| |
| if ((Air_Quality_Measure (Cycle_1970) /= 100.00) or |
| (Air_Quality_Measure (Auto_1970) /= 200.00) or |
| (Air_Quality_Measure (Truck_1970) /= 300.00)) |
| then |
| Report.Failed ("Failed dispatch to Air_Quality_Measure"); |
| end if; |
| |
| Report.Result; |
| |
| end C392002; |