Руководство по Ada (Ada 2022)
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 атрибуты всегда являются статическими выражениями. Любой явный предикат S может быть задан только с помощью аспекта Static_Predicate.
Рекомендации по реализации
При вычислении вызова S'Pos для подтипа перечисления, если значение операнда не соответствует внутреннему коду ни одного литерала перечисления его типа (возможно, из-за неинициализированной переменной), реализация должна сгенерировать исключение Program_Error. Это особенно важно для типов перечисления с несмежными внутренними кодами, заданными клаузой enumeration_representation_clause.
ПРИМЕЧАНИЕ 1 Индексация и итерация циклов используют значения дискретных типов.
ПРИМЕЧАНИЕ 2 Предопределенные операции дискретного типа включают операцию присваивания, квалификацию, проверки принадлежности и реляционные операторы; для логического типа — кратчайшие формы управления и логические операторы; для целочисленного типа — преобразование типов в и из других числовых типов, а также бинарные и унарные операторы сложения — и +, операторы умножения, унарный оператор abs и оператор возведения в степень. Операция присваивания описана в 5.2. Другие предопределенные операции описаны в разделе 4.
ПРИМЕЧАНИЕ 3 Как и для всех типов, объекты дискретного типа имеют атрибуты Size и Address (см. 13.3).
ПРИМЕЧАНИЕ 4 Для подтипа дискретного типа результат, возвращаемый атрибутом 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