| -- CC54002.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-to-variable type may be passed as an |
| -- actual to a generic formal general access-to-variable type. Check that |
| -- designated objects may be read and updated through the access value. |
| -- |
| -- TEST DESCRIPTION: |
| -- The generic implements a List of access objects as an array, which |
| -- is itself a component of a record. The designated type of the formal |
| -- access type is a formal private type declared in the same generic |
| -- formal part. |
| -- |
| -- The access objects to be placed in the List are created both |
| -- statically and dynamically, utilizing allocators and the 'Access |
| -- attribute. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- 10 Apr 96 SAIC ACVC 2.1: Added pragma Elaborate to context clause |
| -- preceding CC54002_1. |
| -- |
| --! |
| |
| generic |
| Size : in Positive; |
| type Element_Type (<>) is private; |
| type Element_Ptr is access all Element_Type; |
| package CC54002_0 is -- Generic list of pointers. |
| |
| subtype Index is Positive range 1 .. (Size + 1); |
| |
| type List_Array is array (Index) of Element_Ptr; |
| |
| type List_Type is record |
| Elements : List_Array; |
| Next : Index := 1; -- Next available "slot" in list. |
| end record; |
| |
| |
| procedure Put (List : in out List_Type; |
| Elem_Ptr : in Element_Ptr; |
| Location : in Index); |
| |
| procedure Get (List : in out List_Type; |
| Elem_Ptr : out Element_Ptr; |
| Location : in Index); |
| |
| -- ... Other operations. |
| |
| end CC54002_0; |
| |
| |
| --===================================================================-- |
| |
| |
| package body CC54002_0 is |
| |
| procedure Put (List : in out List_Type; |
| Elem_Ptr : in Element_Ptr; |
| Location : in Index) is |
| begin |
| List.Elements(Location) := Elem_Ptr; |
| end Put; |
| |
| |
| procedure Get (List : in out List_Type; |
| Elem_Ptr : out Element_Ptr; |
| Location : in Index) is |
| begin -- Artificial: no provision for getting "empty" element. |
| Elem_Ptr := List.Elements(Location); |
| end Get; |
| |
| end CC54002_0; |
| |
| |
| --===================================================================-- |
| |
| |
| with CC54002_0; -- Generic List of pointers. |
| pragma Elaborate (CC54002_0); |
| |
| package CC54002_1 is |
| |
| subtype Lengths is Natural range 0 .. 50; |
| |
| type Subscriber (NLen, ALen: Lengths := 50) is record |
| Name : String(1 .. NLen); |
| Address : String(1 .. ALen); |
| -- ... Other components. |
| end record; |
| |
| type Subscriber_Ptr is access all Subscriber; -- General access-to- |
| -- variable type. |
| |
| package District_Subscription_Lists is new CC54002_0 |
| (Element_Type => Subscriber, |
| Element_Ptr => Subscriber_Ptr, |
| Size => 100); |
| |
| District_01_Subscribers : District_Subscription_Lists.List_Type; |
| |
| |
| New_Subscriber_01 : aliased CC54002_1.Subscriber := |
| (12, 23, "Brown, Silas", "King's Pyland, Dartmoor"); |
| |
| New_Subscriber_02 : aliased CC54002_1.Subscriber := |
| (16, 23, "Hatherly, Victor", "16A Victoria St. London"); |
| |
| end CC54002_1; |
| |
| -- No body for CC54002_1. |
| |
| |
| --===================================================================-- |
| |
| |
| with CC54002_1; |
| |
| with Report; |
| procedure CC54002 is |
| |
| Mod_Subscriber_01 : constant CC54002_1.Subscriber := |
| (12, 23, "Brown, Silas", "Mapleton, Dartmoor "); |
| |
| TC_Actual_01, TC_Actual_02 : CC54002_1.Subscriber_Ptr; |
| |
| |
| use type CC54002_1.Subscriber; -- "/=" directly visible. |
| |
| begin |
| Report.Test ("CC54002", "Check that a general access-to-variable type " & |
| "may be passed as an actual to a generic formal " & |
| "access-to-variable type"); |
| |
| |
| -- Add elements to the list: |
| |
| CC54002_1.District_Subscription_Lists.Put -- Element created statically. |
| (List => CC54002_1.District_01_Subscribers, |
| Elem_Ptr => CC54002_1.New_Subscriber_01'Access, |
| Location => 1); |
| |
| CC54002_1.District_Subscription_Lists.Put -- Element created dynamically. |
| (List => CC54002_1.District_01_Subscribers, |
| Elem_Ptr => new CC54002_1.Subscriber'(CC54002_1.New_Subscriber_02), |
| Location => 2); |
| |
| |
| -- Manipulation of the objects on the list is performed below directly |
| -- through the access objects. Although such manipulation is artificial |
| -- from the perspective of this usage model, it is not artificial in |
| -- general and is necessary in order to test the objective. |
| |
| |
| -- Modify the first list element through the access object: |
| |
| CC54002_1.District_01_Subscribers.Elements(1).Address := -- Update |
| "Mapleton, Dartmoor "; -- Implicit dereference. -- through the |
| -- access |
| -- object. |
| -- Retrieve elements of the list: |
| |
| CC54002_1.District_Subscription_Lists.Get |
| (CC54002_1.District_01_Subscribers, |
| TC_Actual_01, |
| 1); |
| |
| CC54002_1.District_Subscription_Lists.Get |
| (CC54002_1.District_01_Subscribers, |
| TC_Actual_02, |
| 2); |
| |
| -- Verify list contents in two ways: 1st verify the directly-dereferenced |
| -- access objects against the dereferenced access objects returned by Get; |
| -- 2nd verify them against objects the expected values: |
| |
| -- Read |
| -- through the |
| -- access |
| -- objects. |
| |
| if CC54002_1.District_01_Subscribers.Elements(1).all /= TC_Actual_01.all |
| or else |
| CC54002_1.District_01_Subscribers.Elements(2).all /= TC_Actual_02.all |
| then |
| Report.Failed ("Wrong results returned by Get"); |
| |
| elsif CC54002_1.District_01_Subscribers.Elements(1).all /= |
| Mod_Subscriber_01 |
| or |
| CC54002_1.District_01_Subscribers.Elements(2).all /= |
| CC54002_1.New_Subscriber_02 |
| then |
| Report.Failed ("List elements do not have expected values"); |
| end if; |
| |
| Report.Result; |
| end CC54002; |