Contents Index Search Previous Next
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
- A discrete_choice
that is an expression covers a value
if the value equals the value of the expression
converted to the expected type.
11
- A discrete_choice
that is a discrete_range covers
all values (possibly none) that belong to the range.
12
- The discrete_choice
others covers all values of its expected type that are not covered
by previous discrete_choice_lists
of the same construct.
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
- If the discriminant is of a static
constrained scalar subtype, then each non-others discrete_choice
shall cover only values in that subtype, and each value of that subtype
shall be covered by some discrete_choice
(either explicitly or by others);
16
- If the type of the discriminant is
a descendant of a generic formal scalar type then the variant_part
shall have an others discrete_choice;
17
- Otherwise, each value of the base
range of the type of the discriminant shall be covered (either explicitly
or by others).
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;
Contents Index Search Previous Next Legal