Ada Programming/Attributes/'Pos

From Wikibooks, open books for an open world
< Ada Programming‎ | Attributes
Jump to: navigation, search

Ada Lovelace 1838.jpg


The 'Pos attribute is defined for all discrete types. It is a function returning the argument's position number as a universal_integer; the prefix S must be a subtype name. (Universal integers are implicitly converted to any specific integer type as required by the context.)

function S'Pos (Arg: S'Base) return universal_integer;

For enumeration types, position numbers start at 0; if the argument does not denote a valid value (perhaps because of an uninitialized variable), the exception Program_Error is raised. For integer types, the attribute returns the value converted to universal_integer. Note that the actual argument need not belong to the subtype S.

Note that representation clauses do not affect position numbering. Whatever underlying value the enumerated value has, the position number will remain the same.


I: Integer := -30;

pragma Assert (Integer'Pos(I) = -30);  -- of type universal_integer

type My_Enum is  (Enum1, Enum2, Enum3);
for  My_Enum use (Enum1 => 2, Enum2 => 4, Enum3 => 6);
pragma Assert (My_Enum'Pos(Enum1) = 2);  -- Wrong
pragma Assert (My_Enum'Pos(Enum1) = 0);  -- Right
pragma Assert (My_Enum'Pos(Enum3) = 2);

subtype My_Enum_Sub is My_Enum range Enum1 .. Enum2;

pragma Assert (My_Enum_Sub'Pos (Enum3) = 2);  -- Enum3 does not belong to My_Enum_Sub

Other example :

  type Color is (RED, BLUE, WHITE);
  OBJECT : Color := WHITE;
  Put (Color'Pos (OBJECT)); -- give 2

See also[edit]

The inverse of the 'Pos attribut is 'Val.

For a detailed explanation of universal_integer, see Type System: Elaborated Discussion of Types for Signed Integer Types.


Ada Reference Manual[edit]