c392008.a
来自「linux下编程用 编译软件」· A 代码 · 共 402 行
A
402 行
-- C392008.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 for the case where the root tagged-- type is defined in a package and the extended type is defined in a-- dependent package.---- TEST DESCRIPTION:-- Declare a root tagged type, and some associated primitive operations,-- in a visible library package.-- Extend the root type in another visible library package, and override -- one or more primitive operations, inheriting the other primitive -- operations from the root type.-- Derive from the extended type in yet another visible library package, -- again overriding some primitive operations and inheriting others -- (including some that the parent inherited).-- Define subprograms with class-wide parameters, inside of which is a -- call on a dispatching primitive operation. These primitive-- operations modify the objects of the specific class passed as actuals-- to the class-wide formal parameter (class-wide formal parameter has -- mode IN OUT).-- -- The following hierarchy of tagged types and primitive operations is -- utilized in this test:---- package Bank-- type Account (root)-- |-- | Operations-- | proc Deposit-- | proc Withdrawal-- | func Balance -- | proc Service_Charge -- | proc Add_Interest -- | proc Open-- |-- package Checking-- type Account (extended from Bank.Account)-- |-- | Operations-- | proc Deposit (inherited)-- | proc Withdrawal (inherited)-- | func Balance (inherited)-- | proc Service_Charge (inherited)-- | proc Add_Interest (inherited)-- | proc Open (overridden)-- |-- package Interest_Checking-- type Account (extended from Checking.Account)-- |-- | Operations-- | proc Deposit (inherited twice - Bank.Acct.)-- | proc Withdrawal (inherited twice - Bank.Acct.)-- | func Balance (inherited twice - Bank.Acct.)-- | proc Service_Charge (inherited twice - Bank.Acct.)-- | proc Add_Interest (overridden)-- | proc Open (overridden)-- | ---- In this test, we are concerned with the following selection of dispatching-- calls, accomplished with the use of a Bank.Account'Class IN OUT formal-- parameter :---- \ Type-- Prim. Op \ Bank.Account Checking.Account Interest_Checking.Account-- \----------------------------------------------------------- Service_Charge | X X X-- Add_Interest | X X X-- Open | X X X-------- The location of the declaration of the root and derivation of 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.------ TEST FILES:-- This test depends on the following foundation code:---- C392008_0.A------ CHANGE HISTORY:-- 06 Dec 94 SAIC ACVC 2.0-- 20 Nov 95 SAIC C392B04 became C392008 for ACVC 2.0.1----!----------------------------------------------------------------- C392008_0package C392008_0 is -- package Bank type Dollar_Amount is range -30_000..30_000; type Account is tagged record Current_Balance: Dollar_Amount; end record; -- Primitive operations. procedure Deposit (A : in out Account; X : in Dollar_Amount); procedure Withdrawal (A : in out Account; X : in Dollar_Amount); function Balance (A : in Account) return Dollar_Amount; procedure Service_Charge (A : in out Account); procedure Add_Interest (A : in out Account); procedure Open (A : in out Account);end C392008_0;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --package body C392008_0 is -- Primitive operations for type Account. procedure Deposit (A : in out Account; X : in Dollar_Amount) is begin A.Current_Balance := A.Current_Balance + X; end Deposit; procedure Withdrawal(A : in out Account; X : in Dollar_Amount) is begin A.Current_Balance := A.Current_Balance - X; end Withdrawal; function Balance (A : in Account) return Dollar_Amount is begin return (A.Current_Balance); end Balance; procedure Service_Charge (A : in out Account) is begin A.Current_Balance := A.Current_Balance - 5_00; end Service_Charge; procedure Add_Interest (A : in out Account) is Interest_On_Account : Dollar_Amount := 0_00; begin A.Current_Balance := A.Current_Balance + Interest_On_Account; end Add_Interest; procedure Open (A : in out Account) is Initial_Deposit : Dollar_Amount := 10_00; begin A.Current_Balance := Initial_Deposit; end Open;end C392008_0;----------------------------------------------------------------- C392008_1with C392008_0; -- package Bankpackage C392008_1 is -- package Checking package Bank renames C392008_0; type Account is new Bank.Account with record Overdraft_Fee : Bank.Dollar_Amount; end record; -- Overridden primitive operation. procedure Open (A : in out Account); -- Inherited primitive operations. -- procedure Deposit (A : in out Account; -- X : in Bank.Dollar_Amount); -- procedure Withdrawal (A : in out Account; -- X : in Bank.Dollar_Amount); -- function Balance (A : in Account) return Bank.Dollar_Amount; -- procedure Service_Charge (A : in out Account); -- procedure Add_Interest (A : in out Account);end C392008_1;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --package body C392008_1 is -- Overridden primitive operation. procedure Open (A : in out Account) is Check_Guarantee : Bank.Dollar_Amount := 10_00; Initial_Deposit : Bank.Dollar_Amount := 20_00; begin A.Current_Balance := Initial_Deposit; A.Overdraft_Fee := Check_Guarantee; end Open;end C392008_1;----------------------------------------------------------------- C392008_2with C392008_0; -- with Bank;with C392008_1; -- with Checking;package C392008_2 is -- package Interest_Checking package Bank renames C392008_0; package Checking renames C392008_1; subtype Interest_Rate is Bank.Dollar_Amount range 0..100; -- was digits 4; Current_Rate : Interest_Rate := 0_02; type Account is new Checking.Account with record Rate : Interest_Rate; end record; -- Overridden primitive operations. procedure Add_Interest (A : in out Account); procedure Open (A : in out Account); -- "Twice" inherited primitive operations (from Bank.Account) -- procedure Deposit (A : in out Account; -- X : in Bank.Dollar_Amount); -- procedure Withdrawal (A : in out Account; -- X : in Bank.Dollar_Amount); -- function Balance (A : in Account) return Bank.Dollar_Amount; -- procedure Service_Charge (A : in out Account);end C392008_2;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --package body C392008_2 is -- Overridden primitive operations. procedure Add_Interest (A : in out Account) is Interest_On_Account : Bank.Dollar_Amount := Bank.Dollar_Amount( Bank."*"( A.Current_Balance, A.Rate )); begin A.Current_Balance := Bank."+"( A.Current_Balance, Interest_On_Account); end Add_Interest; procedure Open (A : in out Account) is Initial_Deposit : Bank.Dollar_Amount := 30_00; begin Checking.Open (Checking.Account (A)); A.Current_Balance := Initial_Deposit; A.Rate := Current_Rate; end Open;end C392008_2;------------------------------------------------------------------- C392008with C392008_0; use C392008_0; -- package Bankwith C392008_1; use C392008_1; -- package Checking;with C392008_2; use C392008_2; -- package Interest_Checking;with Report;procedure C392008 is package Bank renames C392008_0; package Checking renames C392008_1; package Interest_Checking renames C392008_2; B_Acct : Bank.Account; C_Acct : Checking.Account; IC_Acct : Interest_Checking.Account; -- -- Define procedures with class-wide formal parameters of mode IN OUT. -- -- This procedure will perform a dispatching call on the -- overridden primitive operation Open. procedure New_Account (Acct : in out Bank.Account'Class) is begin Open (Acct); -- Dispatch according to tag of class-wide parameter. end New_Account; -- This procedure will perform a dispatching call on the inherited -- primitive operation (for all types derived from the root Bank.Account) -- Service_Charge. procedure Apply_Service_Charge (Acct: in out Bank.Account'Class) is begin Service_Charge (Acct); -- Dispatch according to tag of class-wide parm. end Apply_Service_Charge; -- This procedure will perform a dispatching call on the -- inherited/overridden primitive operation Add_Interest. procedure Annual_Interest (Acct: in out Bank.Account'Class) is begin Add_Interest (Acct); -- Dispatch according to tag of class-wide parm. end Annual_Interest;begin Report.Test ("C392008", "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 the dispatch to primitive operations overridden for each -- extended type. New_Account (B_Acct); New_Account (C_Acct); New_Account (IC_Acct); if (B_Acct.Current_Balance /= 10_00) or (C_Acct.Current_Balance /= 20_00) or (IC_Acct.Current_Balance /= 30_00) then Report.Failed ("Failed dispatch to multiply overridden prim. oper."); end if; Annual_Interest (B_Acct); Annual_Interest (C_Acct); Annual_Interest (IC_Acct); -- Check the dispatch to primitive operation -- overridden from a parent type which inherited -- the operation from the root type. if (B_Acct.Current_Balance /= 10_00) or (C_Acct.Current_Balance /= 20_00) or (IC_Acct.Current_Balance /= 90_00) then Report.Failed ("Failed dispatch to overridden primitive operation"); end if; Apply_Service_Charge (Acct => B_Acct); Apply_Service_Charge (Acct => C_Acct); Apply_Service_Charge (Acct => IC_Acct); -- Check the dispatch to a -- primitive operation twice -- inherited from the root -- tagged type. if (B_Acct.Current_Balance /= 5_00) or (C_Acct.Current_Balance /= 15_00) or (IC_Acct.Current_Balance /= 85_00) then Report.Failed ("Failed dispatch to Apply_Service_Charge"); end if; Report.Result;end C392008;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?