Справочник по Ada 2012
3.5.5 Операции дискретных типов
Статическая семантика
Для каждого дискретного подтипа S определены следующие атрибуты:
S'Pos
S'Pos обозначает функцию со следующим спецификацией:
function S'Pos(Arg : S'Base)
return universal_integer
return universal_integer
Эта функция возвращает номер позиции значения Arg, как значение типа universal_integer.
S'Val
S'Val обозначает функцию со следующим спецификацией:
function S'Val(Arg : universal_integer)
return S'Base
return S'Base
Эта функция возвращает значение типа S, номер позиции которого равен значению Arg. При вычислении вызова S'Val, если нет значения в базовом диапазоне его типа с заданным номером позиции, то возникает исключение Constraint_Error.
Для каждого статического дискретного подтипа S, для которого существует хотя бы одно значение, принадлежащее S и удовлетворяющее предикатам S, определены следующие атрибуты:
S'First_Valid
S'First_Valid обозначает наименьшее значение, которое принадлежит S и удовлетворяет предикатам S. Значение этого атрибута имеет тип S.
S'Last_Valid
S'Last_Valid обозначает наибольшее значение, которое принадлежит S и удовлетворяет предикатам S. Значение этого атрибута имеет тип S.
Атрибуты First_Valid и Last_Valid attribute_reference всегда являются статическими выражениями. Любой явный предикат S может быть задан только аспектом Static_Predicate.
Рекомендации по реализации
При вычислении вызова S'Pos для подтипа перечисления, если значение операнда не соответствует внутреннему коду ни одной перечислительной константы его типа (возможно, из-за неинициализированной переменной), то реализация должна сгенерировать исключение Program_Error. Это особенно важно для типов перечисления с несмежными внутренними кодами, заданными enumeration_representation_clause.
ПРИМЕЧАНИЯ
36 Индексирование и итерация циклов используют значения дискретных типов.
37 Предопределенные операции дискретного типа включают операцию присваивания, квалификацию, тесты на принадлежность и реляционные операторы; для булевого типа они включают краткие управляющие формы и логические операторы; для целочисленного типа они включают преобразование типов к другим числовым типам и обратно, а также бинарные и унарные операторы сложения - и +, операторы умножения, унарный оператор abs и оператор возведения в степень. Операция присваивания описана в 5.2. Другие предопределенные операции описаны в разделе 4.
38 Как и для всех типов, объекты дискретного типа имеют атрибуты Size и Address (см. 13.3).
39 Для подтипа дискретного типа результат, возвращаемый атрибутом Val, может не принадлежать подтипу; аналогично, фактический параметр атрибута Pos не обязательно должен принадлежать подтипу. Следующие соотношения выполняются (при отсутствии исключения) для этих атрибутов:
S'Val(S'Pos(X)) = X
S'Pos(S'Val(N)) = N
S'Pos(S'Val(N)) = N
Примеры
Примеры атрибутов дискретных подтипов:
-- Для типов и подтипов, объявленных в подпункте 3.5.1, выполняются следующие соотношения:
-- Color'First = White, Color'Last = Black
-- Rainbow'First = Red, Rainbow'Last = Blue
-- Rainbow'First = Red, Rainbow'Last = Blue
-- Color'Succ(Blue) = Rainbow'Succ(Blue) = Brown
-- Color'Pos(Blue) = Rainbow'Pos(Blue) = 4
-- Color'Val(0) = Rainbow'Val(0) = White
-- Color'Pos(Blue) = Rainbow'Pos(Blue) = 4
-- Color'Val(0) = Rainbow'Val(0) = White