c3a0013.a

来自「linux下编程用 编译软件」· A 代码 · 共 348 行

A
348
字号
-- C3A0013.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 a general access type object may reference allocated--      pool objects as well as aliased objects. (3,4)--      Check that formal parameters of tagged types are implicitly--      defined as aliased; check that the 'Access of these formal--      parameters designates the correct object with the correct--      tag. (5)--      Check that the current instance of a limited type is defined as--      aliased. (5)---- TEST DESCRIPTION:--      This test takes from the hierarchy defined in C390003; making--      the root type Vehicle limited private.  It also shifts the--      abstraction to include the notion of a transmission, an object--      which is contained within any vehicle.  Using an access--      discriminant, any subprogram which operates on a transmission--      may also reference the vehicle in which it is installed.----      Class Hierarchy:--              Vehicle         Transmission--               /   \--           Truck    Car----      Contains:--                Vehicle( Transmission )-------- CHANGE HISTORY:--      06 Dec 94   SAIC    ACVC 2.0--      16 Dec 94   SAIC    Fixed accessibility problems----!package C3A0013_1 is  type Vehicle is tagged limited private;  type Vehicle_ID is access all Vehicle'Class;  -- Constructors  procedure Create     ( It : in out Vehicle;                          Wheels : Natural := 4 );  -- Modifiers  procedure Accelerate ( It : in out Vehicle );  procedure Decelerate ( It : in out Vehicle );  procedure Up_Shift   ( It : in out Vehicle );  procedure Stop       ( It : in out Vehicle );  -- Selectors  function  Speed      ( It : Vehicle ) return Natural;  function  Wheels     ( It : Vehicle ) return Natural;  function  Gear_Factor( It : Vehicle ) return Natural;  -- TC_Ops  procedure TC_Validate( It : in out Vehicle; Speed_Trap : Natural );  -- dispatching procedure used to check tag correctness  procedure TC_Validate( It     : Vehicle;                         TC_ID  : Character);private  type Transmission(Within: access Vehicle'Class) is limited record    Engaged : Boolean := False;    Gear    : Integer range -1..5 := 0;  end record;  -- Current instance of a limited type is defined as aliased  type Vehicle is tagged limited record    Wheels: Natural;    Speed : Natural;    Power_Train: Transmission( Vehicle'Access );  end record;end C3A0013_1;with C3A0013_1;package C3A0013_2 is  type Car is new C3A0013_1.Vehicle with private;  procedure TC_Validate( It     : Car;                         TC_ID  : Character);  function  Gear_Factor( It : Car ) return Natural;private  type Car is new C3A0013_1.Vehicle with record    Displacement : Natural;  end record;end C3A0013_2;with C3A0013_1;package C3A0013_3 is  type Truck is new C3A0013_1.Vehicle with private;  procedure TC_Validate( It     : Truck;                         TC_ID  : Character);  function  Gear_Factor( It : Truck ) return Natural;private  type Truck is new C3A0013_1.Vehicle with record    Displacement : Natural;  end record;end C3A0013_3;with Report;package body C3A0013_1 is  procedure Create    ( It : in out Vehicle;                         Wheels : Natural := 4 ) is  begin    It.Wheels   := Wheels;    It.Speed    := 0;  end Create;  procedure Accelerate( It : in out Vehicle ) is  begin    It.Speed := It.Speed + Gear_Factor( It.Power_Train.Within.all );  end Accelerate;  procedure Decelerate( It : in out Vehicle ) is  begin    It.Speed := It.Speed - Gear_Factor( It.Power_Train.Within.all );  end Decelerate;  procedure Stop      ( It : in out Vehicle ) is  begin    It.Speed := 0;    It.Power_Train.Engaged := False;  end Stop;  function  Gear_Factor( It : Vehicle ) return Natural is  begin    return It.Power_Train.Gear;  end Gear_Factor;  function  Speed     ( It : Vehicle ) return Natural is  begin    return It.Speed;  end Speed;  function  Wheels     ( It : Vehicle ) return Natural is  begin    return It.Wheels;  end Wheels;  -- formal tagged parameters are implicitly aliased  procedure TC_Validate( It : in out Vehicle; Speed_Trap : Natural ) is    License: Vehicle_ID := It'Unchecked_Access;  begin    if Speed( License.all ) /= Speed_Trap then      Report.Failed("Speed Trap: expected: " & Natural'Image(Speed_Trap));    end if;  end TC_Validate;  procedure TC_Validate( It     : Vehicle;                         TC_ID  : Character) is  begin    if TC_ID /= 'V' then      Report.Failed("Dispatched to Vehicle");    end if;    if Wheels( It ) /= 1 then      Report.Failed("Not a Vehicle");    end if;  end TC_Validate;  procedure Up_Shift( It: in out Vehicle ) is  begin    It.Power_Train.Gear    := It.Power_Train.Gear +1;    It.Power_Train.Engaged := True;    Accelerate( It );  end Up_Shift;end C3A0013_1;with Report;package body C3A0013_2 is  procedure TC_Validate( It     : Car;                         TC_ID  : Character ) is  begin    if TC_ID /= 'C' then      Report.Failed("Dispatched to Car");    end if;    if Wheels( It ) /= 4 then      Report.Failed("Not a Car");    end if;  end TC_Validate;  function  Gear_Factor( It : Car ) return Natural is  begin    return C3A0013_1.Gear_Factor( C3A0013_1.Vehicle( It ) )*2;  end Gear_Factor;end C3A0013_2;with Report;package body C3A0013_3 is  procedure TC_Validate( It     : Truck;                         TC_ID  : Character) is  begin    if TC_ID /= 'T' then      Report.Failed("Dispatched to Truck");    end if;    if Wheels( It ) /= 3 then      Report.Failed("Not a Truck");    end if;  end TC_Validate;  function  Gear_Factor( It : Truck ) return Natural is  begin    return C3A0013_1.Gear_Factor( C3A0013_1.Vehicle( It ) )*3;  end Gear_Factor;end C3A0013_3;package C3A0013_4 is  procedure Perform_Tests;end C3A0013_4;with Report;with C3A0013_1;with C3A0013_2;with C3A0013_3;package body C3A0013_4 is  package Root   renames C3A0013_1;  package Cars   renames C3A0013_2;  package Trucks renames C3A0013_3;  type Car_Pool is array(1..4) of aliased Cars.Car;  Commuters : Car_Pool;  My_Car      : aliased Cars.Car;  Company_Car : Root.Vehicle_ID;  Repair_Shop : Root.Vehicle_ID;  The_Vehicle : Root.Vehicle;  The_Car     : Cars.Car;  The_Truck   : Trucks.Truck;  procedure TC_Dispatch( Ptr   : Root.Vehicle_ID;                         Char  : Character ) is  begin    Root.TC_Validate( Ptr.all, Char );  end TC_Dispatch;  procedure TC_Check_Formal_Access( Item: in out Root.Vehicle'Class;                                    Char: Character) is  begin    TC_Dispatch( Item'Unchecked_Access, Char );  end TC_Check_Formal_Access;  procedure Perform_Tests is  begin  -- Main test procedure.  for Lane in Commuters'Range loop    Cars.Create( Commuters(Lane) );    for Excitement in 1..Lane loop      Cars.Up_Shift( Commuters(Lane) );    end loop;  end loop;  Cars.Create( My_Car );  Cars.Up_Shift( My_Car );  Cars.TC_Validate( My_Car, 2 );  Root.Create( The_Vehicle, 1 );  Cars.Create( The_Car    , 4 );  Trucks.Create( The_Truck, 3 );  TC_Check_Formal_Access( The_Vehicle, 'V' );  TC_Check_Formal_Access( The_Car,     'C' );  TC_Check_Formal_Access( The_Truck,   'T' );  Root.Up_Shift( The_Vehicle );  Cars.Up_Shift( The_Car );  Trucks.Up_Shift( The_Truck );  Root.TC_Validate( The_Vehicle, 1 );   Cars.TC_Validate( The_Car, 2 );   Trucks.TC_Validate( The_Truck, 3 );   --  general access type may reference allocated objects  Company_Car := new Cars.Car;  Root.Create( Company_Car.all );  Root.Up_Shift( Company_Car.all );  Root.Up_Shift( Company_Car.all );  Root.TC_Validate( Company_Car.all, 6 );  --  general access type may reference aliased objects  Repair_Shop := My_Car'Access;  Root.TC_Validate( Repair_Shop.all, 2 );  --  general access type may reference aliased objects  Construction: declare    type Speed_List is array(Commuters'Range) of Natural;    Accelerations : constant Speed_List := (2, 6, 12, 20);  begin    for Rotation in Commuters'Range loop      Repair_Shop := Commuters(Rotation)'Access;      Root.TC_Validate( Repair_Shop.all, Accelerations(Rotation) );    end loop;  end Construction;end Perform_Tests;end C3A0013_4;with C3A0013_4;with Report;procedure C3A0013 isbegin  Report.Test ("C3A0013", "Check general access types.  Check aliased "                        & "nature of formal tagged type parameters.  "                        & "Check aliased nature of the current "                        & "instance of a limited type.  Check the "                        & "constraining of actual subtypes for "                        & "discriminated objects" );  C3A0013_4.Perform_Tests;  Report.Result;end C3A0013;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?