ca11019.a
来自「用于进行gcc测试」· A 代码 · 共 307 行
A
307 行
-- CA11019.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 body of the parent package may depend on one of its own-- private generic children.---- TEST DESCRIPTION:-- A scenario is created that demonstrates the potential of adding a-- generic private child during code maintenance without distubing a -- large subsystem. After child is added to the subsystem, a maintainer-- decides to take advantage of the new functionality and rewrites-- the parent's body.---- Declare a data collection abstraction in a package. Declare a private-- generic child of this package which provides parameterized code that-- have been written once and will be used three times to implement the-- services of the parent package. In the parent body, instantiate the -- private child. ---- In the main program, check that the operations in the parent, -- and instance of the private child package perform as expected. ------ CHANGE HISTORY:-- 06 Dec 94 SAIC ACVC 2.0-- 17 Nov 95 SAIC Update and repair for ACVC 2.0.1----! package CA11019_0 is -- parent type Data_Record is tagged private; type Data_Collection is private; --- --- subtype Data_1 is integer range 0 .. 100; procedure Add_1 (Data : Data_1; To : in out Data_Collection); function Statistical_Op_1 (Data : Data_Collection) return Data_1; --- subtype Data_2 is integer range -100 .. 1000; procedure Add_2 (Data : Data_2; To : in out Data_Collection); function Statistical_Op_2 (Data : Data_Collection) return Data_2; --- subtype Data_3 is integer range -10_000 .. 10_000; procedure Add_3 (Data : Data_3; To : in out Data_Collection); function Statistical_Op_3 (Data : Data_Collection) return Data_3; ---private type Data_Ptr is access Data_Record'class; subtype Sequence_Number is positive range 1 .. 512; type Data_Record is tagged record Next : Data_Ptr := null; Seq : Sequence_Number; end record; --- type Data_Collection is record First : Data_Ptr := null; Last : Data_Ptr := null; end record; end CA11019_0; -- parent --=================================================================---- This generic package provides parameterized code that has been-- written once and will be used three times to implement the services-- of the parent package.privategeneric type Data_Type is range <>;package CA11019_0.CA11019_1 is -- parent.child type Data_Elem is new Data_Record with record Value : Data_Type; end record; Next_Avail_Seq_No : Sequence_Number := 1; procedure Sequence (Ptr : Data_Ptr); -- the child must be private for this procedure to know details of -- the implementation of data collections procedure Add (Datum : Data_Type; To : in out Data_Collection); function Op (Data : Data_Collection) return Data_Type; -- op models a complicated operation that whose code can be -- used for various data typesend CA11019_0.CA11019_1; -- parent.child --=================================================================-- package body CA11019_0.CA11019_1 is -- parent.child procedure Sequence (Ptr : Data_Ptr) is begin Ptr.Seq := Next_Avail_Seq_No; Next_Avail_Seq_No := Next_Avail_Seq_No + 1; end Sequence; --------------------------------------------------------- procedure Add (Datum : Data_Type; To : in out Data_Collection) is Ptr : Data_Ptr; begin if To.First = null then -- assign new record with data value to -- to.next <- null; To.First := new Data_Elem'(Next => null, Value => Datum, Seq => 1); Sequence (To.First); To.Last := To.First; else -- chase to end of list Ptr := To.First; while Ptr.Next /= null loop Ptr := Ptr.Next; end loop; -- and add element there Ptr.Next := new Data_Elem'(Next => null, Value => Datum, Seq => 1); Sequence (Ptr.Next); To.Last := Ptr.Next; end if; end Add; --------------------------------------------------------- function Op (Data : Data_Collection) return Data_Type is -- for simplicity, just return the maximum of the data set Max : Data_Type := Data_Elem( Data.First.all ).Value; -- assuming non-empty collection Ptr : Data_Ptr := Data.First; begin -- no error checking while Ptr.Next /= null loop if Data_Elem( Ptr.Next.all ).Value > Max then Max := Data_Elem( Ptr.Next.all ).Value; end if; Ptr := Ptr.Next; end loop; return Max; end Op;end CA11019_0.CA11019_1; -- parent.child --=================================================================---- parent body depends on private generic childwith CA11019_0.CA11019_1; -- Private generic child.pragma Elaborate (CA11019_0.CA11019_1);package body CA11019_0 is -- instantiate the generic child with data types needed by the -- package interface services package Data_1_Ops is new CA11019_1 (Data_Type => Data_1); package Data_2_Ops is new CA11019_1 (Data_Type => Data_2); package Data_3_Ops is new CA11019_1 (Data_Type => Data_3); --------------------------------------------------------- procedure Add_1 (Data : Data_1; To : in out Data_Collection) is begin -- maybe do other stuff here Data_1_Ops.Add (Data, To); -- and here end; --------------------------------------------------------- function Statistical_Op_1 (Data : Data_Collection) return Data_1 is begin -- maybe use generic operation(s) in some complicated ways -- (but simplified out, for the sake of testing) return Data_1_Ops.Op (Data); end; --------------------------------------------------------- procedure Add_2 (Data : Data_2; To : in out Data_Collection) is begin Data_2_Ops.Add (Data, To); end; --------------------------------------------------------- function Statistical_Op_2 (Data : Data_Collection) return Data_2 is begin return Data_2_Ops.Op (Data); end; --------------------------------------------------------- procedure Add_3 (Data : Data_3; To : in out Data_Collection) is begin Data_3_Ops.Add (Data, To); end; --------------------------------------------------------- function Statistical_Op_3 (Data : Data_Collection) return Data_3 is begin return Data_3_Ops.Op (Data); end;end CA11019_0; --=================================================--with CA11019_0, -- Main, -- Main.Child is private Report;procedure CA11019 is package Main renames CA11019_0; Col_1, Col_2, Col_3 : Main.Data_Collection;begin Report.Test ("CA11019", "Check that body of a (non-generic) package " & "may depend on its private generic child"); -- build a data collection for I in 1 .. 10 loop Main.Add_1 ( Main.Data_1(I), Col_1); end loop; if Main.Statistical_Op_1 (Col_1) /= 10 then Report.Failed ("Wrong data_1 value returned"); end if; for I in reverse 10 .. 20 loop Main.Add_2 ( Main.Data_2(I * 10), Col_2); end loop; if Main.Statistical_Op_2 (Col_2) /= 200 then Report.Failed ("Wrong data_2 value returned"); end if; for I in 0 .. 10 loop Main.Add_3 ( Main.Data_3(I + 5), Col_3); end loop; if Main.Statistical_Op_3 (Col_3) /= 15 then Report.Failed ("Wrong data_3 value returned"); end if; Report.Result;end CA11019;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?