Справочник по Ada (Ada 2022)
13.4 Описания представления перечислений
Определение enumeration_representation_clause указывает внутренние коды для литералов перечислений.
Синтаксис
Правила разрешения имен
enumeration_aggregate должен быть записан в виде одномерного array_aggregate, для которого тип индекса является не ограниченным типом перечисления, а каждое выражение компонента ожидается как целого типа.
Правила легальности
first_subtype_local_name в enumeration_representation_clause должен обозначать тип перечисления.
Каждый компонент array_aggregate должен быть задан выражением expression, а не <>. Выражения в array_aggregate должны быть статическими и должны указывать различные целые коды для каждого значения типа перечисления; связанные целые коды должны удовлетворять предопределенному порядку отношения типа.
Статическая семантика
enumeration_representation_clause задаёт аспект кодирования представления. Кодирование состоит из внутреннего кода для каждого литерала перечисления, то есть целочисленного значения, используемого внутри для представления каждого литерала.
Требования к реализации
Для типов перечисления, отличных от булевых, если кодирование не задано для типа, то для каждого значения типа внутренний код должен быть равен его порядковому номеру.
Рекомендации по реализации
Рекомендуемый уровень поддержки enumeration_representation_clause:
- Реализация должна поддерживать по крайней мере внутренние коды в диапазоне System.Min_Int .. System.Max_Int. Реализация не обязана поддерживать enumeration_representation_clause для булевых типов.
Статическая семантика
Для каждого дискретного подтипа S определены следующие атрибуты:
S'Enum_Rep
S'Enum_Rep обозначает функцию со следующим описанием:
function S'Enum_Rep (Arg : S'Base) return universal_integer
Эта функция возвращает значение представления значения Arg как значения типа universal_integer. Значение представления — это внутренний код, указанный в описании представления перечисления, если таковое имеется, для типа, соответствующего значению Arg, в противном случае — порядковый номер значения.
S'Enum_Val
S'Enum_Val обозначает функцию со следующим описанием:
function S'Enum_Val (Arg : universal_integer) return S'Base
Эта функция возвращает значение типа S, значение представления которого равно значению Arg. При вычислении вызова S'Enum_Val, если нет значения в базовом диапазоне его типа с данным значением представления, генерируется Constraint_Error.
ПРИМЕЧАНИЕ. Атрибут Enum_Rep можно использовать для запроса внутренних кодов, используемых для типа перечисления; атрибут Enum_Val можно использовать для преобразования из внутреннего кода в значение перечисления. Другие атрибуты типа, такие как Succ, Pred и Pos, не затрагиваются enumeration_representation_clause. Например, Pos всегда возвращает порядковый номер, а не внутренний целочисленный код, указанный в enumeration_representation_clause.
Примеры
Примеры описаний представления перечисления:
type Mix_Code is (ADD, SUB, MUL, LDA, STA, STZ);
for Mix_Code use
(ADD => 1, SUB => 2, MUL => 3, LDA => 8, STA => 24, STZ =>33);
(ADD => 1, SUB => 2, MUL => 3, LDA => 8, STA => 24, STZ =>33);
-- См. 3.5.2.
for Roman_Digit use ('I' => 1,
'V' => 5,
'X' => 10,
'L' => 50,
'C' => 100,
'D' => 500,
'M' => 1000);
for Roman_Digit use ('I' => 1,
'V' => 5,
'X' => 10,
'L' => 50,
'C' => 100,
'D' => 500,
'M' => 1000);
-- Пример использования атрибута Enum_Rep см. 4.2.1.