____ | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


3.8.1 Variant Parts and Discrete Choices

(1)
A record type with a variant_part specifies alternative lists of components. Each variant defines the components for the value or values of the discriminant covered by its discrete_choice_list.
Syntax
(2)
       variant_part ::=
          case discriminant_direct_name is
              variant
             {variant}
          end case;
(3)
       variant ::=
          when discrete_choice_list =>
             component_list
(4)
       discrete_choice_list ::= discrete_choice {| discrete_choice}
(5)
       discrete_choice ::= expression | discrete_range | others
Name Resolution Rules
(6)
The discriminant_direct_name shall resolve to denote a discriminant (called the discriminant of the variant_part) specified in the known_discriminant_part of the full_type_declaration that contains the variant_part. The expected type for each discrete_choice in a variant is the type of the discriminant of the variant_part.
Legality Rules
(7)
The discriminant of the variant_part shall be of a discrete type.
(8)
The expressions and discrete_ranges given as discrete_choices in a variant_part shall be static. The discrete_choice others shall appear alone in a discrete_choice_list, and such a discrete_choice_list, if it appears, shall be the last one in the enclosing construct.
(9)
A discrete_choice is defined to cover a value in the following cases:
(10)
(11)
(12)
(13)
A discrete_choice_list covers a value if one of its discrete_choices covers the value.
(14)
The possible values of the discriminant of a variant_part shall be covered as follows:
(15)
(16)
(17)
(18)
Two distinct discrete_choices of a variant_part shall not cover the same value.
Static Semantics
(19)
If the component_list of a variant is specified by null, the variant has no components.
(20)
The discriminant of a variant_part is said to govern the variant_part and its variants. In addition, the discriminant of a derived type governs a variant_part and its variants if it corresponds (see 3.7) to the discriminant of the variant_part.
Dynamic Semantics
(21)
A record value contains the values of the components of a particular variant only if the value of the discriminant governing the variant is covered by the discrete_choice_list of the variant. This rule applies in turn to any further variant that is, itself, included in the component_list of the given variant.
(22)
The elaboration of a variant_part consists of the elaboration of the component_list of each variant in the order in which they appear.
Examples
(23)
Example of record type with a variant part:
(24)
       type Device is (Printer, Disk, Drum);
       type State  is (Open, Closed);
(25)
       type Peripheral(Unit : Device := Disk) is
          record
             Status : State;
             case Unit is
                when Printer =>
                   Line_Count : Integer range 1 .. Page_Size;
                when others =>
                   Cylinder   : Cylinder_Index;
                   Track      : Track_Number;
                end case;
             end record;
(26)
Examples of record subtypes:
(27)
       subtype Drum_Unit is Peripheral(Drum);
       subtype Disk_Unit is Peripheral(Disk);
(28)
Examples of constrained record variables:
(29)
       Writer   : Peripheral(Unit  => Printer);
       Archive  : Disk_Unit;

____ | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12