-- 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;