The Ada Program: vr.adb
1 procedure vr is
2 -- variant record for a mailing address (from N. Cohen, page 329)
3 type Mailing_Address_Type (US_Address: Boolean := true) is
4 record
5 Name, Street, City : String (1..30);
6 case US_Address is
7 when true =>
8 State : String (1..2);
9 Zip_Code : Integer range 10000 .. 99999;
10 when false =>
11 Country : String (1..20);
12 end case;
13 end record;
14
15 Address1: Mailing_Address_Type (US_Address => true); -- can't vary
16 Address2: Mailing_Address_Type (US_Address => false); -- can't vary
17 Address3: Mailing_Address_Type; -- can vary; tag as default value
18
19 begin
20 Address1.US_Address := false; -- not legal; cf. Ada Ref Man 3.7.1(9)
21 Address3.US_Address := true; -- can't assign directly to discriminant
22
23 -- legal, the compiler can determine that a run-time
24 -- Constraint_Error will always be raised; cf. RM 5.2(4)
25 Address1 := Address2;
26
27 -- legal, but at run time if value of the discriminant in Address3
28 -- is false, then must raise Constraint_Error
29 Address1 := Address3;
30
31 -- It is perfectly legal to copy any address into Address3. No
32 -- run-time error is possible, so no run-time check is necessary.
33 Address3 := Address2;
34
35 Address1.State := "NY"; -- legal, no run-time check is necessary
36 Address2.State := "IN"; -- will raise run-time error; cf. RM 4.1.3(8)
37 Address3.State := "FL"; -- run-time check is necessary in general
38
39 Address3 := Address1; -- another legal copy into Address3
40
41 -- Below is the type-safe way to access variant record Address3;
42 -- a good compiler can avoid issuing the run-time checks.
43 case Address3.US_Address is
44 when true => Address3.State := "IN"; Address3.Zip_Code := 76203;
45 when false => Address3.Country := "Canada ";
46 end case;
47 end vr;