blob: c4a6789ab8edd7df5b13f859082ed6945b157855 [file] [log] [blame]
-- CA11007.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 private part of a grandchild library unit can
-- utilize its grandparent unit's private definition.
--
-- TEST DESCRIPTION:
-- Declare a package, child package, and grandchild package, all
-- with private parts in their specifications.
--
-- The private part of the grandchild package will make use of components
-- that have been declared in the private part of the grandparent
-- specification.
--
-- The child package demonstrates the extension of a parent file type
-- into an abstraction of an analog file structure. The grandchild package
-- extends the grandparent file type into an abstraction of a digital
-- file structure, and provides conversion capability to/from the parent
-- analog file structure.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package CA11007_0 is -- Package File_Package
type File_Descriptor is private;
type File_Type is tagged private;
function Next_Available_File return File_Descriptor;
private
type File_Measure_Type is range 0 .. 1000;
type File_Descriptor is new Integer;
Null_Measure : constant File_Measure_Type := File_Measure_Type'First;
Null_File : constant File_Descriptor := 0;
type File_Type is tagged
record
Descriptor : File_Descriptor := Null_File;
end record;
end CA11007_0; -- Package File_Package
--=================================================================--
package body CA11007_0 is -- Package body File_Package
File_Count : Integer := 0;
function Next_Available_File return File_Descriptor is
begin
File_Count := File_Count + 1;
return File_Descriptor (File_Count);
end Next_Available_File;
end CA11007_0; -- Package body File_Package
--=================================================================--
package CA11007_0.CA11007_1 is -- Child package Analog
type Analog_File_Type is new File_Type with private;
private
type Wavelength_Type is new File_Measure_Type;
Min_Wavelength : constant Wavelength_Type := Wavelength_Type'First;
type Analog_File_Type is new File_Type with -- Parent type.
record
Wavelength : Wavelength_Type := Min_Wavelength;
end record;
end CA11007_0.CA11007_1; -- Child package Analog
--=================================================================--
package CA11007_0.CA11007_1.CA11007_2 is -- Grandchild package Digital
type Digital_File_Type is new File_Type with private;
procedure Recording (File : out Digital_File_Type);
procedure Convert (From : in Analog_File_Type;
To : out Digital_File_Type);
function Validate (File : in Digital_File_Type) return Boolean;
function Valid_Conversion (To : Digital_File_Type) return Boolean;
function Valid_Initial (From : Analog_File_Type) return Boolean;
private
type Track_Type is new File_Measure_Type; -- Grandparent type.
Min_Tracks : constant Track_Type :=
Track_Type (Null_Measure) + Track_Type'First; -- Grandparent private
Max_Tracks : constant Track_Type := -- constant.
Track_Type (Null_Measure) + Track_Type'Last;
type Digital_File_Type is new File_Type with -- Grandparent type.
record
Tracks : Track_Type := Min_Tracks;
end record;
end CA11007_0.CA11007_1.CA11007_2; -- Grandchild package Digital
--=================================================================--
-- Grandchild package body Digital
package body CA11007_0.CA11007_1.CA11007_2 is
procedure Recording (File : out Digital_File_Type) is
begin
File.Descriptor := Next_Available_File; -- Assign new file descriptor.
File.Tracks := Max_Tracks; -- Change initial value.
end Recording;
--------------------------------------------------------------------------
procedure Convert (From : in Analog_File_Type;
To : out Digital_File_Type) is
begin
To.Descriptor := From.Descriptor + 100; -- Dummy conversion.
To.Tracks := Track_Type (From.Wavelength) / 2;
end Convert;
--------------------------------------------------------------------------
function Validate (File : in Digital_File_Type) return Boolean is
Result : Boolean := False;
begin
if not (File.Tracks /= Max_Tracks) then
Result := True;
end if;
return Result;
end Validate;
--------------------------------------------------------------------------
function Valid_Conversion (To : Digital_File_Type) return Boolean is
begin
return (To.Descriptor = 100) and (To.Tracks = (Min_Tracks / 2));
end Valid_Conversion;
--------------------------------------------------------------------------
function Valid_Initial (From : Analog_File_Type) return Boolean is
begin
return (From.Wavelength = Min_Wavelength); -- Validate initial
end Valid_Initial; -- conditions.
end CA11007_0.CA11007_1.CA11007_2; -- Grandchild package body Digital
--=================================================================--
with CA11007_0.CA11007_1.CA11007_2; -- with Grandchild package Digital
with Report;
procedure CA11007 is
package Analog renames CA11007_0.CA11007_1;
package Digital renames CA11007_0.CA11007_1.CA11007_2;
Original_Digital_File,
Converted_Digital_File : Digital.Digital_File_Type;
Original_Analog_File : Analog.Analog_File_Type;
begin
-- This code demonstrates how private extensions could be utilized
-- in child packages to allow for recording on different media.
-- The processing contained in the procedures and functions is
-- "dummy" processing, not intended to perform actual recording,
-- conversion, or validation operations, but simply to demonstrate
-- this type of structural decomposition as a possible solution to
-- a user's design problem.
Report.Test ("CA11007", "Check that the private part of a grandchild " &
"library unit can utilize its grandparent " &
"unit's private definition");
if not Digital.Valid_Initial (Original_Analog_File)
then
Report.Failed ("Incorrect initialization of Analog File");
end if;
---
Digital.Convert (From => Original_Analog_File, -- Convert file to
To => Converted_Digital_File); -- digital format.
if not Digital.Valid_Conversion (To => Converted_Digital_File) then
Report.Failed ("Incorrect conversion of analog file");
end if;
---
Digital.Recording (Original_Digital_File); -- Create file in
-- digital format.
if not Digital.Validate (Original_Digital_File) then
Report.Failed ("Incorrect recording of digital file");
end if;
Report.Result;
end CA11007;