1

For every discrete
subtype S, the following attributes are defined:

2

- S'Pos
- S'Pos denotes a function with the following specification:

3

4

- This function returns the position number of the
value of
*Arg*, as a value of type*universal_integer*.

5

- S'Val
- S'Val denotes a function with the following specification:

6

7

- {
*evaluation (Val)*[partial]} {*Constraint_Error (raised by failure of run-time check)*} This function returns a value of the type of S whose position number equals the value of*Arg*. {*Range_Check*[partial]} {*check, language-defined (Range_Check)*} For the evaluation of a call on S'Val, if there is no value in the base range of its type with the given position number, Constraint_Error is raised.

7.a

7.b

8

For the evaluation of a call on S'Pos for an enumeration
subtype, if the value of the operand does not correspond to the internal
code for any enumeration literal of its type [(perhaps due to an uninitialized
variable)], then the implementation should raise Program_Error. {*Program_Error
(raised by failure of run-time check)*} This
is particularly important for enumeration types with noncontiguous internal
codes specified by an enumeration_representation_clause.

8.a

NOTES

9

28 Indexing and loop iteration
use values of discrete types.

10

29 {*predefined operations
(of a discrete type)* [partial]} The predefined
operations of a discrete type include the assignment operation, qualification,
the membership tests, and the relational operators; for a boolean type they
include the short-circuit control forms and the logical operators; for an integer
type they include type conversion to and from other numeric types, as well as
the binary and unary adding operators - and +, the multiplying operators, the
unary operator **abs**, and the exponentiation operator. The assignment operation
is described in 5.2. The other predefined operations
are described in Section 4.

11

30 As for all types, objects of a
discrete type have Size and Address attributes (see 13.3).

12

31 For
a subtype of a discrete type, the result delivered by the attribute Val
might not belong to the subtype; similarly, the actual parameter of the
attribute Pos need not belong to the subtype. The following relations
are satisfied (in the absence of an exception) by these attributes:

13

S'Pos(S'Val(N)) = N

14

15

16

-- Rainbow'First = Red, Rainbow'Last = Blue

17

-- Color'Pos(Blue) = Rainbow'Pos(Blue) = 4

-- Color'Val(0) = Rainbow'Val(0) = White

17.a

{*extensions to Ada 83*} The
attributes S'Succ, S'Pred, S'Width, S'Image, and S'Value have been generalized
to apply to real types as well (see 3.5, ``Scalar
Types'').