Next: , Previous: 5.3, Up: 5


5.4 Case Statements

1
A case_statement selects for execution one of a number of alternative sequences_of_statements; the chosen alternative is defined by the value of an expression.

Syntax

2

case_statement::=
   case expression is
       case_statement_alternative
      {case_statement_alternative}
   end case;

3

case_statement_alternative::=
   when discrete_choice_list =>
      sequence_of_statements
Name Resolution Rules

4
The expression is expected to be of any discrete type. The expected type for each discrete_choice is the type of the expression.

Legality Rules

5
The expressions and discrete_ranges given as discrete_choices of a case_statement shall be static. A discrete_choice others, if present, shall appear alone and in the last discrete_choice_list.

6
The possible values of the expression shall be covered as follows:

7

8

9

10
Two distinct discrete_choices of a case_statement shall not cover the same value.

Dynamic Semantics

11
For the execution of a case_statement the expression is first evaluated.

12
If the value of the expression is covered by the discrete_choice_list (see 3.8.1) of some case_statement_alternative (see 5.4), then the sequence_of_statements (see 5.1) of the _alternative is executed.

13
Otherwise (the value is not covered by any discrete_choice_list, perhaps due to being outside the base range), Constraint_Error is raised.

     NOTES

14

 The execution of a case_statement chooses one and only one alternative. Qualification of the expression of a case_statement by a static subtype can often be used to limit the number of choices that need be given explicitly.
Examples

15
Examples of case statements:

16

     case Sensor is
        when Elevation   => Record_Elevation(Sensor_Value);
        when Azimuth   => Record_Azimuth  (Sensor_Value);
        when Distance   => Record_Distance (Sensor_Value);
        when others   => null;
     end case;

17

     case Today is
        when Mon   => Compute_Initial_Balance;
        when Fri   => Compute_Closing_Balance;
        when Tue .. Thu   => Generate_Report(Today);
        when Sat .. Sun   => null;
     end case;

18

     case Bin_Number(Count) is
        when 1   => Update_Bin(1);
        when 2   => Update_Bin(2);
        when 4   =>
           Empty_Bin(1);
           Empty_Bin(2);
        when others   => raise Error;
     end case;