comparison gcc/testsuite/ada/acats/tests/cc/cc50a01.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 -- CC50A01.A
2 --
3 -- Grant of Unlimited Rights
4 --
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7 -- unlimited rights in the software and documentation contained herein.
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
9 -- this public release, the Government intends to confer upon all
10 -- recipients unlimited rights equal to those held by the Government.
11 -- These rights include rights to use, duplicate, release or disclose the
12 -- released technical data and computer software in whole or in part, in
13 -- any manner and for any purpose whatsoever, and to have or permit others
14 -- to do so.
15 --
16 -- DISCLAIMER
17 --
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
24 --*
25 --
26 -- OBJECTIVE:
27 -- Check that a formal parameter of a library-level generic unit may be
28 -- a formal tagged private type. Check that a nonlimited tagged type may
29 -- be passed as an actual. Check that if the formal type is indefinite,
30 -- both indefinite and definite types may be passed as actuals.
31 --
32 -- TEST DESCRIPTION:
33 -- The generic package declares a formal tagged private type (this can
34 -- be considered the parent "mixin" class). This type is extended in
35 -- the generic to provide support for stacks of items of any nonlimited
36 -- tagged type. Stacks are modeled as singly linked lists, with the list
37 -- nodes being objects of the extended type.
38 --
39 -- A generic testing procedure pushes items onto a stack, and pops them
40 -- back off, verifying the state of the stack at various points along the
41 -- way. The push and pop routines exercise functionality important to
42 -- tagged types, such as type conversion toward the root of the derivation
43 -- class and extension aggregates.
44 --
45 -- The formal tagged private type has an unknown discriminant part, and
46 -- is thus indefinite. This allows both definite and indefinite types
47 -- to be passed as actuals. For tagged types, definite implies
48 -- nondiscriminated, and indefinite implies discriminated (with known
49 -- or unknown discriminants).
50 --
51 -- TEST FILES:
52 -- This test consists of the following files:
53 --
54 -- FC50A00.A
55 -- -> CC50A01.A
56 --
57 --
58 -- CHANGE HISTORY:
59 -- 06 Dec 94 SAIC ACVC 2.0
60 -- 21 Nov 95 SAIC ACVC 2.0.1 fixes: Moved instantiations of
61 -- BC50A01_0 to library level.
62 -- 11 Aug 96 SAIC ACVC 2.1: Updated prologue. Added pragma
63 -- Elaborate to context clauses for CC50A01_2 & _3.
64 --
65 --!
66
67 with FC50A00; -- Tagged (actual) type declarations.
68 generic -- Generic stack abstraction.
69
70 type Item (<>) is tagged private; -- Formal tagged private type.
71 TC_Default_Value : Item; -- Needed in View_Top (see
72 -- below).
73 package CC50A01_0 is
74
75 type Stack is private;
76
77 -- Note that because the actual type corresponding to Item may be
78 -- unconstrained, the functions of removing the top item from the stack and
79 -- returning the value of the top item of the stack have been separated into
80 -- Pop and View_Top, respectively. This is necessary because otherwise the
81 -- returned value would have to be an out parameter of Pop, which would
82 -- require the user (in the unconstrained case) to create an uninitialized
83 -- unconstrained object to serve as the actual, which is illegal.
84
85 procedure Push (I : in Item; S : in out Stack);
86 procedure Pop (S : in out Stack);
87 function View_Top (S : Stack) return Item;
88
89 function Size_Of (S : Stack) return Natural;
90
91 private
92
93 type Stack_Item;
94 type Stack_Ptr is access Stack_Item;
95
96 type Stack_Item is new Item with record -- Extends formal type.
97 Next : Stack_Ptr := null;
98 end record;
99
100 type Stack is record
101 Top : Stack_Ptr := null;
102 Size : Natural := 0;
103 end record;
104
105 end CC50A01_0;
106
107
108 --==================================================================--
109
110
111 package body CC50A01_0 is
112
113 -- Link NewItem in at the top of the stack (the extension aggregate within
114 -- the allocator initializes the inherited portion of NewItem to equal I,
115 -- and NewItem.Next to point to what S.Top points to).
116
117 procedure Push (I : in Item; S : in out Stack) is
118 NewItem : Stack_Ptr;
119 begin
120 NewItem := new Stack_Item'(I with S.Top); -- Extension aggregate.
121 S.Top := NewItem;
122 S.Size := S.Size + 1;
123 end Push;
124
125
126 -- Remove item from top of stack. This procedure only updates the state of
127 -- the stack; it does not return the value of the popped item. Hence, in
128 -- order to accomplish a "true" pop, both View_Top and Pop must be called
129 -- consecutively.
130 --
131 -- If the stack is empty, the Pop is ignored (for simplicity; in a true
132 -- application this might be treated as an error condition).
133
134 procedure Pop (S : in out Stack) is
135 begin
136 if S.Top = null then -- Stack is empty.
137 null;
138 -- Raise exception.
139 else
140 S.Top := S.Top.Next;
141 S.Size := S.Size - 1;
142 -- Deallocate discarded node.
143 end if;
144 end Pop;
145
146
147 -- Return the value of the top item on the stack. This procedure only
148 -- returns the value; it does not remove the top item from the stack.
149 -- Hence, in order to accomplish a "true" pop, both View_Top and Pop must
150 -- be called consecutively.
151 --
152 -- Since items on the stack are of a type (Stack_Item) derived from Item,
153 -- which is a (tagged) private type, type conversion toward the root is the
154 -- only way to get a value of type Item for return to the caller.
155 --
156 -- If the stack is empty, View_Top returns a pre-specified default value.
157 -- (In a true application, an exception might be raised instead).
158
159 function View_Top (S : Stack) return Item is
160 begin
161 if S.Top = null then -- Stack is empty.
162 return TC_Default_Value; -- Testing artifice.
163 -- Raise exception.
164 else
165 return Item(S.Top.all); -- Type conversion.
166 end if;
167 end View_Top;
168
169
170 function Size_Of (S : Stack) return Natural is
171 begin
172 return (S.Size);
173 end Size_Of;
174
175
176 end CC50A01_0;
177
178
179 --==================================================================--
180
181
182 -- The formal package Stacker below is needed to gain access to the
183 -- appropriate version of the "generic" type Stack. It is provided with an
184 -- explicit actual part in order to restrict the packages that can be passed
185 -- as actuals to those which have been instantiated with the same actuals
186 -- which this generic procedure has been instantiated with.
187
188 with CC50A01_0; -- Generic stack abstraction.
189 generic
190 type Item_Type (<>) is tagged private; -- Formal tagged private type.
191 Default : Item_Type;
192 with package Stacker is new CC50A01_0 (Item_Type, Default);
193 procedure CC50A01_1 (S : in out Stacker.Stack; I : in Item_Type);
194
195
196 --==================================================================--
197
198 --
199 -- This generic procedure performs all of the testing of the
200 -- stack abstraction.
201 --
202
203 with Report;
204 procedure CC50A01_1 (S : in out Stacker.Stack; I : in Item_Type) is
205 begin
206 Stacker.Push (I, S); -- Push onto empty stack.
207 Stacker.Push (I, S); -- Push onto nonempty stack.
208
209 if Stacker.Size_Of (S) /= 2 then
210 Report.Failed (" Wrong stack size after 2 Pushes");
211 end if;
212
213 -- Calls to View_Top must initialize a declared object of type Item_Type
214 -- because the type may be unconstrained.
215
216 declare
217 Buffer1 : Item_Type := Stacker.View_Top (S);
218 begin
219 Stacker.Pop (S); -- Pop item off nonempty stack.
220 if Buffer1 /= I then
221 Report.Failed (" Wrong stack item value after 1st Pop");
222 end if;
223 end;
224
225 declare
226 Buffer2 : Item_Type := Stacker.View_Top (S);
227 begin
228 Stacker.Pop (S); -- Pop last item off stack.
229 if Buffer2 /= I then
230 Report.Failed (" Wrong stack item value after 2nd Pop");
231 end if;
232 end;
233
234 if Stacker.Size_Of (S) /= 0 then
235 Report.Failed (" Wrong stack size after 2 Pops");
236 end if;
237
238 declare
239 Buffer3 : Item_Type := Stacker.View_Top (S);
240 begin
241 if Buffer3 /= Default then
242 Report.Failed (" Wrong result after Pop of empty stack");
243 end if;
244 Stacker.Pop (S); -- Pop off empty stack.
245 end;
246
247 end CC50A01_1;
248
249
250 --==================================================================--
251
252
253 with FC50A00;
254
255 with CC50A01_0;
256 pragma Elaborate (CC50A01_0);
257
258 package CC50A01_2 is new CC50A01_0 (FC50A00.Count_Type,
259 FC50A00.TC_Default_Count);
260
261
262 --==================================================================--
263
264
265 with FC50A00;
266
267 with CC50A01_0;
268 pragma Elaborate (CC50A01_0);
269
270 package CC50A01_3 is new CC50A01_0 (FC50A00.Person_Type,
271 FC50A00.TC_Default_Person);
272
273
274 --==================================================================--
275
276
277 with FC50A00; -- Tagged (actual) type declarations.
278 with CC50A01_0; -- Generic stack abstraction.
279 with CC50A01_1; -- Generic stack testing procedure.
280 with CC50A01_2;
281 with CC50A01_3;
282
283 with Report;
284 procedure CC50A01 is
285
286 package Count_Stacks renames CC50A01_2;
287 package Person_Stacks renames CC50A01_3;
288
289
290 procedure TC_Count_Test is new CC50A01_1 (FC50A00.Count_Type,
291 FC50A00.TC_Default_Count,
292 Count_Stacks);
293 Count_Stack : Count_Stacks.Stack;
294
295
296 procedure TC_Person_Test is new CC50A01_1 (FC50A00.Person_Type,
297 FC50A00.TC_Default_Person,
298 Person_Stacks);
299 Person_Stack : Person_Stacks.Stack;
300
301 begin
302 Report.Test ("CC50A01", "Check that a formal parameter of a " &
303 "library-level generic unit may be a formal tagged " &
304 "private type");
305
306 Report.Comment ("Testing definite tagged type..");
307 TC_Count_Test (Count_Stack, FC50A00.TC_Count_Item);
308
309 Report.Comment ("Testing indefinite tagged type..");
310 TC_Person_Test (Person_Stack, FC50A00.TC_Person_Item);
311
312 Report.Result;
313 end CC50A01;