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;