blob: 6cd9ce3ddf0c1a6a6f2e93e25a93b3226ab788b8 [file] [log] [blame]
-- C3A0008.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 subprogram references may be passed as parameters using
-- access-to-subprogram types. Check that the passed subprograms may
-- be invoked from within the called subprogram.
--
-- TEST DESCRIPTION:
-- Declare an access to function type in a package specification.
-- Declare three different trig functions that can be referred to by
-- the access to function type.
--
-- In the main program, call each function indirectly by passing the
-- access to subprogram value as parameter.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package Integrate_Lookup is
TC_Log_Call : Boolean := False;
TC_Cos_Call : Boolean := False;
TC_Sine_Call : Boolean := False;
-- Type accesses to functions Log, Sine, or Cos
type Integrand_Ptr is access function
(Angle : Float) return Float;
function Log (Angle : in Float) return Float;
function Sine (Angle : in Float) return Float;
function Cos (Angle : in Float) return Float;
function Integrate (Func : Integrand_Ptr; From, To: Float)
return Float;
end Integrate_Lookup;
-----------------------------------------------------------------------------
package body Integrate_Lookup is
function Log (Angle : in Float) return Float is
begin
TC_Log_Call := True;
return 0.1;
end Log;
function Sine (Angle : in Float) return Float is
begin
TC_Sine_Call := True;
return 0.0;
end Sine;
function Cos (Angle : in Float) return Float is
begin
TC_Cos_Call := True;
return 1.0;
end Cos;
function Integrate (Func : Integrand_Ptr; From, To: Float)
return Float is
Theta : Float;
begin
-- calls the actual subprogram passed as parameter
Theta := Func (From) + Func (To);
return Theta;
end Integrate;
end Integrate_Lookup;
-----------------------------------------------------------------------------
with Report;
with Integrate_Lookup;
procedure C3A0008 is
Area : Float := 0.0;
begin
Report.Test ("C3A0008", "Check that subprogram references may be passed "
& "as parameters using access-to-subprogram types. "
& "Check that the passed subprograms may be invoked "
& "from within the called subprogram");
Area := Integrate_Lookup.Integrate
(Integrate_Lookup.Log'Access, 1.0, 2.0);
If not Integrate_Lookup.TC_Log_Call or Area /= 0.2 then
Report.Failed ("Incorrect Log result");
end if;
Area := Integrate_Lookup.Integrate
(Integrate_Lookup.Sine'Access, 1.0, 2.0);
If not Integrate_Lookup.TC_Sine_Call or Area /= 0.0 then
Report.Failed ("Incorrect Sine result");
end if;
Area := Integrate_Lookup.Integrate
(Integrate_Lookup.Cos'Access, 1.0, 2.0);
If not Integrate_Lookup.TC_Cos_Call or Area /= 2.0 then
Report.Failed ("Incorrect Cos result");
end if;
Report.Result;
end C3A0008;