Copyright (C) А.Гавва V-0.4w май 2004

2. Атрибуты типов.

В данном приложении перечислены атрибуты типов Ады, и дано их краткое описание. Следует заметить, что при описании атрибутов типов, терминология несколько упрощена. В частности, вместо термина "подтип" используется термин "тип", что не всегда правильно (например, для вещественных типов с плавающей точкой).

2.1 Стандартно определенные атрибуты типов

Список стандартно определенных атрибутов типов Ады приводится в приложении K (Annex K) руководства по языку программирования Ада (RM-95).

P'Access  -  где P - любая подпрограмма.
Возвращает значение ссылочного типа, которое указывает на подпрограмму P.
     
X'Access  -  где X: любой объект с косвенным доступом.
Возвращает значение ссылочного типа, которое указывает на X.
     
X'Address  -  где X: любой объект или программный модуль.
Возвращает адрес первого распределенного для хранения X элемента памяти как значение типа System.Address.
     
S'Adjacent  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает смежное по отношению к первому параметру машинное число, в указанном вторым параметром направлении.
     
S'Aft  -  где S: любой вещественный тип с фиксированной точкой.
Возвращает значение типа Universal_Integer, которое показывает требуемое число десятичных цифр после десятичной точки для обеспечения величины delta при представлении S.
     
X'Alignment  -  где X: любой тип или объект.
Возвращает значение типа Universal_Integer, указывающее выравнивание X в памяти.
     
S'Base  -  где S: любой скалярный тип.
Возвращает неограниченный базовый тип для S.
     
S'Bit_Order  -  где S: любой тип записи.
Возвращает битовый порядок для S как значение типа System.Bit_Order.
     
P'Body_Version  -  где P: любой программный модуль.
Возвращает строку которая идентифицирует версию тела компилируемого модуля P.
     
T'Callable  -  где T: любая задача.
Возвращает значение True, если T может быть вызвана.
     
E'Caller  -  где E: имя любой точки входа.
Возвращает значение типа Task_ID, которое идентифицирует обрабатываемую в текущий момент задачу, обратившуюся к точке входа задачи E. Использование этого атрибута допустимо только внутри инструкции принятия (для задачи-сервера) или внутри тела входа (для защищенного модуля).
     
S'Ceiling  -  где S: любой вещественный тип с плавающей точкой.
Функция возвращающая наименьшее целочисленное значение, которое больше или равно ее параметру.
     
S'Class  -  где S: любой тэговый тип.
Возвращает надклассовый тип для класса корнем иерархии которого будет тип S.
     
X'Component_Size  -  где X: любой объект или тип массива.
Возвращает значение типа Universal_Integer которое представляет битовый размер компонентов X.
     
S'Compose  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает значение вещественного типа с плавающей точкой, комбинируя дробную часть, которая представлена первым параметром, и порядок, который представлен вторым параметром.
     
A'Constrained  -  где A: любой тип с дискриминантом.
Возвращает True когда A является ограниченным.
     
S'Copy_Sign  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает значение величина которого определяется первым параметром, а знак - вторым параметром.
     
E'Count  -  где E: имя любой точки входа.
Возвращает значение типа Universal_Integer, показывающее число обращений к точке входа E которые находятся в очереди.
     
S'Definite  -  где S: любой формально неопределенный тип.
Возвращает True если фактический тип S определен.
     
S'Delta  -  где S: любой вещественный тип с плавающей точкой.
Возвращает значение типа Universal_Real, показывающее величину значения delta для S
     
S'Denorm  -  где S: любой вещественный тип с плавающей точкой.
Возвращает True если ненормализованные значения S являются машинными числами.
     
S'Digits  -  где S: любой тип decimal или вещественный тип с плавающей точкой.
Возвращает значение типа Universal_Integer, показывающее число цифр для S.
     
S'Exponent  -  где S: любой вещественный тип с плавающей точкой.
Функция возвращающая значение типа Universal_Integer, которое представляет нормализованный порядок ее параметра.
     
S'External_Tag  -  где S: любой тэговый тип.
Возвращает представление S'Tag как значение типа String.
     
A'First(N)  -  где A: любой массив.
Возвращает нижнюю границу диапазона N-го индекса массива A.
     
A'First  -  где A: любой массив.
Возвращает нижнюю границу диапазона первого индекса массива A.
     
S'First  -  где S: любой скалярный тип.
Возвращает нижнюю границу диапазона значений типа S.
     
R.C'First_Bit  -  где R.C: любой компонент C записи типа R.
Возвращает значение типа Universal_Integer, которое представляет число битов до первого бита C внутри записи типа R.
     
S'Floor  -  где S: любой вещественный тип с плавающей точкой.
Функция возвращающая наибольшее целочисленное значение, которое больше или равно ее параметру.
     
S'Fore  -  где S: любой вещественный тип с плавающей точкой.
Возвращает значение типа Universal_Integer которое показывает минимально необходимое для представления значения S число символов до десятичной точки.
     
S'Fraction  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает дробную часть ее параметра.
     
E'Identity  -  где E: любое исключение.
Возвращает значение типа Exception_ID которое уникально идентифицирует E.
     
T'Identity  -  где T: любая задача.
Возвращает значение типа Task_ID которое уникально идентифицирует T.
     
S'Image  -  где S: любой скалярный тип.
Функция которая возвращает представление ее параметра как значение типа String.
     
S'Input  -  где S: любой тип.
Функция которая читает и возвращает значение типа S из потока, который указывается ее параметром.
     
S'Class'Input  -  где S'Class: любой надклассовый тип.
Функция которая читает из указанного как параметр потока тэг, затем, выполняет диспетчеризацию (перенаправление) вызова к подпрограмме указываемой атрибутом 'Input для типа, который идентифицируется значением прочитанного тэга, после чего, возвращает значение этого типа.
     
A'Last(N)  -  где A: любой массив.
Возвращает верхнюю границу диапазона N-го индекса массива A.
     
A'Last  -  где A: любой массив.
Возвращает верхнюю границу диапазона первого индекса массива A.
     
S'Last  -  где S: любой скалярный тип.
Возвращает верхнюю границу диапазона значений типа S.
     
R.C'Last_Bit  -  где R.C: любой компонент C записи типа R.
Возвращает значение типа Universal_Integer, которое представляет число битов до последнего бита C внутри записи типа R.
     
S'Leading_Part  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает главную часть ее первого параметра как число системы исчисления указанной как второй параметр.
     
A'Length(N)  -  где A: любой массив.
Возвращает длину N-го измерения массива A как значение типа Universal_Integer.
     
A'Length  -  где A: любой массив.
Возвращает длину первого измерения массива A как значение типа Universal_Integer.
     
S'Machine  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает ближайшее к ее параметру машинно-представляемое число.
     
S'Machine_Emax  -  где S: любой вещественный тип с плавающей точкой.
Возвращает наибольший порядок для S как значение типа Universal_Integer.
     
S'Machine_Emin  -  где S: любой вещественный тип с плавающей точкой.
Возвращает наименьший порядок для S как значение типа Universal_Integer.
     
S'Machine_Mantissa  -  где S: любой вещественный тип с плавающей точкой.
Возвращает для машинного представления S число цифр в мантиссе как значение типа Universal_Integer.
     
S'Machine_Overflows  -  где S: любой вещественный тип.
Возвращает True если было обнаружено переполнение или деление на ноль и возбуждено исключение Constraint_Error для каждой предопределенной операции возвращающей результат типа S.
     
S'Machine_Radix  -  где S: любой вещественный тип.
Возвращает основание системы счисления для машинного представления S как значение типа Universal_Integer.
     
S'Machine_Rounds  -  где S: любой вещественный тип.
Возвращает True если было выполнено округление неточного результата для каждой предопределенной операции возвращающей результат типа S.
     
S'Max  -  где S: любой скалярный тип.
Функция которая возвращает большее значение из двух переданных ей параметров.
     
S'Max_Size_In_Storage_Elements  -  где S: любой тип.
Возвращает значение типа Universal_Integer показывающее максимальное число элементов памяти занимаемых значением типа S, которое требуется при обращении к подпрограмме System.Storage_Pools.Allocate как параметр Size_In_Storage_Elements для получения значения ссылающегося на S типа.
     
S'Min  -  где S: любой скалярный тип.
Функция которая возвращает меньшее значение из двух переданных ей параметров.
     
S'Model  -  где S: любой вещественный тип с плавающей точкой.
Функция возвращающая образец числа значение которого будет смежным значением ее параметра.
     
S'Model_Emin  -  где S: любой вещественный тип с плавающей точкой.
Возвращает образец числа соответствующий S'Model_Emin.
     
S'Model_Epsilon  -  где S: любой вещественный тип с плавающей точкой.
Возвращает абсолютную разницу между 1.0 и следующим наибольшим образцом числа S как значение типа Universal_Real.
     
S'Model_Mantissa  -  где S: любой вещественный тип с плавающей точкой.
Возвращает образец числа соответствующий S'Machine_Mantissa.
     
S'Model_Small  -  где S: любой вещественный тип с плавающей точкой.
Возвращает наименьший положительный образец числа S как значение типа Universal_Real.
     
S'Modulus  -  где S: любой модульный тип.
Возвращает основание системы счисления S как значение типа Universal_Integer.
     
S'Output  -  где S: любой тип.
Процедура записывающая ее второй параметр в поток, который представлен ее первым параметром, включая любые границы или дискриминанты.
     
S'Class'Output  -  где S'Class: любой надклассовый тип.
Процедура записывающая тэг ее второго параметра в поток, который указан как первый параметр, затем, выполняет диспетчеризацию (перенаправление) вызова к подпрограмме указываемой атрибутом 'Output для типа, который идентифицируется значением тэга ее второго параметра.
     
D'Partition_ID  -  где D: любое описание уровня библиотеки.
Возвращает значение типа Universal_Integer которое идентифицирует раздел (partition) распределенной программы в которой выполнена элаборация D.
     
S'Pos  -  где S: любой дискретный тип.
Функция которая возвращает номер позиции ее параметра как значение типа Universal_Integer.
     
R.C'Position  -  где R.C: любой компонент C записи типа R.
То же самое, что и R.C'Address - R'Address.
     
S'Pred  -  где S: любой дискретный тип.
Функция возвращающая значение у которого величина номера позиции на единицу меньше чем номер позиции ее параметра.
     
A'Range(N)  -  где A: любой тип массива.
Эквивалентно A'First(N) .. A'Last(N), кроме случая когда вычисление A было выполнено один раз.
     
A'Range  -  где A: любой тип массива.
Эквивалентно A'First .. A'Last, кроме случая когда вычисление A было выполнено один раз.
     
S'Range  -  где S: любой скалярный тип.
Эквивалентно S'First .. S'Last.
     
S'Read  -  где S: любой тип.
Процедура читающая ее второй параметр из потока, который указан ее первым параметром.
     
S'Class'Read  -  где S'Class: любой надклассовый тип.
Процедура выполняющая диспетчеризацию (перенаправление) вызова к подпрограмме указываемой атрибутом Read для типа, который идентифицируется значением тэга ее второго параметра.
     
S'Remainder  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает остаток от деления ее первого параметра на ее второй параметр.
     
S'Round  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает округленное значение ее параметра.
     
S'Rounding  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает ближайшее к ее параметру целое значение.
     
S'Safe_First  -  где S: любой вещественный тип с плавающей точкой.
Возвращает нижнюю границу сохранного диапазона S как значение типа Universal_Real.
     
S'Safe_Last  -  где S: любой вещественный тип с плавающей точкой.
Возвращает верхнюю границу сохранного диапазона S как значение типа Universal_Real.
     
S'Scale  -  где S: любой вещественный тип с плавающей точкой.
Возвращает для значения S позицию точки относительно крайней правой значащей цифры как значение типа Universal_Integer.
     
S'Scaling  -  где S: любой вещественный тип с плавающей точкой.
Функция которая масштабирует ее первый параметр согласно основания машинной системы исчисления возведенной в степень ее второго параметра.
     
S'Signed_Zeros  -  где S: любой вещественный тип с плавающей точкой.
Возвращает True если аппаратное представление для S обладает возможностью представления и положительного, и отрицательного нуля.
     
X'Size  -  где X: любой тип или объект.
Возвращает размер X в битах как значение типа Universal_Integer.
     
S'Small  -  где S: любой вещественный тип с плавающей точкой.
Возвращает наименьшее используемое внутри типа значение для представления S как значение типа Universal_Real.
     
S'Storage_Pool  -  где S: любой ссылочный тип.
Возвращает пул пространства памяти который используется для S как значение типа Root_Storage_Pool'Class.
     
S'Storage_Size  -  где S: любой ссылочный тип.
Возвращает результат вызова Storage_Size(S'Storage_Pool).
     
T'Storage_Size  -  где T: любая задача.
Возвращает число элементов памяти зарезервированных для T как значение типа Universal_Integer.
     
S'Succ  -  где S: любой скалярный тип.
Функция возвращающая значение у которого величина номера позиции на единицу больше чем номер позиции ее параметра.
     
X'Tag  -  где X: любой тэговый тип или объект надклассового типа.
Возвращает тэг X как значение типа Ada.Tags.Tag.
     
T'Terminated  -  где T: любая задача.
Возвращает True если выполнение T завершено.
     
S'Truncation  -  где S: любой вещественный тип с плавающей точкой.
Функция которая округляет ее параметр в направлении нуля.
     
S'Unbiased_Rounding  -  где S: любой вещественный тип с плавающей точкой.
Функция которая возвращает ближайшее к ее параметру целочисленное значение, выполняя округление в направлении четного целого если значение параметра располагается точно между двумя целыми.
     
X'Unchecked_Access  -  где X: любой объект с косвенным доступом.
Возвращает то же самое значение, что и X'Access, однако при этом не осуществляется проверка правильности обращения.
     
S'Val  -  где S: любой дискретный тип.
Функция возвращающая значение типа S номера позиции которого равен величине ее параметра.
     
X'Valid  -  где X: любой скалярный объект.
Возвращает True если X - это нормальный стандартный объект имеющий допустимое представление.
     
S'Value  -  где S: любой скалярный тип.
Функция возвращающая значение типа S представление которого задано в виде значения типа String, игнорируя ведущие и завершающие пробелы.
     
P'Version  -  где P: любой программный модуль.
Возвращает строку (значение типа String) идентифицирующую версию компилируемого модуля который содержит описание P.
     
S'Wide_Image  -  где S: любой скалярный тип.
Функция которая возвращает представление ее параметра как значение типа Wide_String.
     
S'Wide_Value  -  где S: любой скалярный тип.
Функция возвращающая значение типа S представление которого задано в виде значения типа Wide_String, игнорируя ведущие и завершающие пробелы.
     
S'Wide_Width  -  где S: любой скалярный тип.
Возвращает максимальную длину значения типа Wide_String, возвращенного при обращении к S'Wide_Image, как значение типа Universal_Integer.
     
S'Width  -  где S: любой скалярный тип.
Возвращает максимальную длину значения типа String, возвращенного при обращении к S'Image, как значение типа Universal_Integer.
     
S'Write  -  где S: любой тип.
Процедура записывающая значение ее второго параметра в поток, который указан ее первым параметром.
     
S'Class'Write  -  где S'Class: любой надклассовый тип.
Процедура выполняющая диспетчеризацию (перенаправление) вызова к подпрограмме указываемой атрибутом 'Write для типа, который идентифицируется значением тэга ее второго параметра.

2.2 Атрибуты типов определенные в реализации компилятора GNAT

Список атрибутов типов определенных .

Standard'Abort_Signal  -  где Standard - единственно возможный префикс.
Предусматривает сущность для специального исключения, которая используется при принудительном завершении задачи или асинхронной передаче управления. Обычно, этот атрибут должен использоваться только в окружении задачи (атрибут достаточно специфичен и выходит за пределы нормальной семантики Ады; он предназначен для пользовательских программ перехватывающих исключение принудительного завершения).
     
Standard'Address_Size  -  где Standard - единственно возможный префикс.
Статическая константа представляющая количество битов в представлении адреса ('Address). Ее первичное предназначение - построение описания Memory_Size в пакете Standard, однако она может быть свободно использована в программах пользователя.
     
'Asm_Input  -  Определяет функцию которая принимает два параметра. Первый параметр - это строка, а второй параметр - это выражение типа определяемое префиксом. Первый параметр (строка) должен быть статическим выражением и является ограничением для параметра (например, указывает требуемый регистр процессора). Второй аргумент это значение которое будет использоваться как аргумент ввода. Допустимые значения для констант будут такими же как и используемые в RTL, и они зависят от файла конфигурации который был использован для построения генератора кода GCC (GCC back end).
     
'Asm_Output  -  Определяет функцию которая принимает два параметра. Первый параметр - это строка, а второй параметр - это имя переменной определяемое префиксом. Первый параметр (строка) должен быть статическим выражением и является ограничением для параметра (например, указывает требуемый тип регистра процессора). Второй аргумент это переменная в которой будет сохранен результат. Допустимые значения для констант будут такими же как и используемые в RTL, и они зависят от файла конфигурации который был использован для построения генератора кода GCC (GCC back end). Если операнды вывода отсутствуют, то аргумент может быть опущен или явно указан как No_Output_Operands.
     
'AST_Entry  -  Этот атрибут реализован только для работы с OpenVMS версией GNAT.
     
obj'Bit  -  где obj: любой объект.
Возвращает битовое смещение в элементе памяти (как правило байте) в котором находится первый бит пространства размещенного для объекта obj. Возвращаемое этим атрибутом значение имеет тип Universal_Integer, величина которого всегда не отрицательна и не достигает величины System.Storage_Unit. Для объектов, которые являются переменными или константами размещаемыми в регистре возвращаемое значение - нуль (использование этого атрибута не обязывает размещать переменные в памяти). Для объектов, которые являются формальными параметрами, этот атрибут применяется как для совпадающего фактического параметра, так и для копии совпадающего фактического параметра. Для ссылочных объектов, возвращаемое значение - нуль. Примечательно, что obj.all'Bit является объектом проверки Access_Check для обозначенного объекта. Подобным образом, этот атрибут для компонента записи X.C'Bit является объектом проверки дискриминанта, а в случае массива X(I)'Bit или X(I1..I2)'Bit - объектом проверки индекса. Этот атрибут был разработан для совместимости с описанием и реализацией атрибута 'Bit в DEC Ada 83.
     
'Bit_Position  -  R.C'Bit где R - это запись, а C - это одно из полей типа записи, возвращает битовое смещение внутри записи, которое содержит первый бит пространства размещенного для объекта. Возвращаемое этим атрибутом значение имеет тип Universal_Integer. Величина значения зависит только от указанного поля типа записи C и не зависит от выравнивания.
     
'Code_Address  -  Атрибут 'Address может быть применен для подпрограмм Ады, но предполагаемый эффект, согласно руководства по языку (RM-95), должен предусматривать адресное значение, которое может быть использовано для вызова подпрограммы подразумевая использование адресного выражения как в данном примере:
    
    
    procedure K is ...
    
    procedure L;
    for L'Address use K'Address;
    pragma Import (Ada, L);
    
После чего вызов L ожидается как результат вызова K. В Ada 83, где не предусматривалось ссылочных типов для подпрограмм, это был широко используемый прием для получения эффекта косвенного вызова. GNAT реализует показанное в примере выше использование атрибута 'Address, и подобные приемы работают правильно. Однако, в некоторых случаях, полезно иметь возможность получить значение адреса начала сгенерированного для подпрограммы кода. На некоторых архитектурах в этом нет необходимости, также как и в использовании приема показанного в примере выше. Например, значение 'Address может быть ссылкой на дескриптор подпрограммы, а не на саму подпрограмму. Атрибут 'Code_Address, который может быть использован только для подпрограмм, всегда возвращает адрес начала сгенерированного для указанной подпрограммы кода, который может соответствовать или не соответствовать значению которое возвращает атрибут 'Address.
     
Standard'Default_Bit_Order  -  где Standard - единственно возможный префикс.
Предусматривает значение System.Default_Bit_Order как значение 'Pos (0 для High_Order_First, и 1 для Low_Order_First). Это используется для построения описания Default_Bit_Order в пакете System.
     
U'Elaborated  -  где U: имя модуля.
Возвращаемое значение имеет тип Boolean и индицирует была ли выполнена элаборация указанного модуля. Этот атрибут первоначально был предназначен для внутреннего использования генерируемым кодом для проверки динамической элаборации, но он также может быть использован в программах пользователя. Возвращаемое значение всегда будет True, как только выполнена элаборация всех модулей.
     
P'Elab_Body  -  где P: имя программного модуля.
Возвращает объекты для соответствующей процедуры элаборации для выполнения элаборации тела указанного модуля. Атрибут используется в главной процедуре элаборации редактора связей (binder) и, обычно, не должен использоваться в любом другом контексте. Однако, могут возникнуть какие-либо особенные ситуации в которых использование этого атрибута может оказаться полезным для получения возможности вызвать процедуру элаборации из кода Ады (например, в случае необходимости выполнения выборочной переэлаборации для исправления какой-либо ошибки).
     
P'Elab_Spec  -  где P: имя программного модуля.
Возвращает объекты для соответствующей процедуры элаборации для выполнения элаборации спецификации указанного модуля. Атрибут используется в главной процедуре элаборации редактора связей (binder) и, обычно, не должен использоваться в любом другом контексте. Однако, могут возникнуть какие-либо особенные ситуации в которых использование этого атрибута может оказаться полезным для получения возможности вызвать процедуру элаборации из кода Ады (например, в случае необходимости выполнения выборочной переэлаборации для исправления какой-либо ошибки).
     
'Emax  -  Этот атрибут предусмотрен для совместимости с Ada 83.
     
S'Enum_Rep  -  где S: перечислимый тип, объект перечислимого типа или несовмещенный перечислимый литерал.
Для перечислимого типа обозначает функцию, которая имеет следующую спецификацию:
    
    function S'Enum_Rep (Arg : S'Base)
      return Universal_Integer;
    
Для объекта перечислимого типа или несовмещенного перечислимого литерала S'Enum_Rep эквивалентен T'Enum_Rep(S) где T - это тип перечислимого литерала или объекта S.

Функция возвращает значение внутреннего представления для указанного перечислимого значения, которое будет равно значению возвращаемому атрибутом 'Pos если отсутствует спецификация представления. Этот атрибут статический (то есть, результат статический, если аргумент статический). Атрибут S'Enum_Rep также может быть использован для целочисленных типов и объектов. В таких случаях, он просто возвращает целочисленное значение. Смысл этого в том, чтобы разрешить его использование для дискретных формальных аргументов (<>) в настраиваемых модулях, которые могут быть конкретизированы как с перечислимыми типами, так и с целочисленными типами.

     
'Epsilon  -  Предусмотрен для обеспечения совместимости с Ada 83.
     
S'Fixed_Value  -  где S: вещественный тип с фиксированной точкой.
Обозначает функцию, которая имеет следующую спецификацию:
    
    function S'Fixed_Value
        (Arg : Universal_Integer)
                        return S;
    
Возвращаемое значение V - это вещественное значение с фиксированной точкой, подобное:
    
    V = Arg * S'Small
    
Таким образом, это эквивалентно: сначала, преобразованию аргумента в значение целочисленного типа, используемого для представления S, а затем, выполнению непроверяемого преобразования в вещественный тип с фиксированной точкой. Первоначально, этот атрибут был предназначен для реализации функций ввода/вывода для значений вещественного типа с фиксированной точкой.
     
T'Has_Discriminants  -  где T: тип.
Возвращенное значение типа Boolean будет True в случае когда тип T имеет дискриминант, и False - в обратном случае. Предполагается использование этого атрибута совместно с описаниями настраиваемых модулей. Если атрибут используется с приватным настраиваемым типом, то он индицирует имеет ли фактический тип дискриминант.
     
'Img  -  Этот атрибут отличается от стандартного атрибута 'Image тем, что он может быть использован как с объектами, так и с типами. В обоих случаях он возвращает 'Image для подтипа объекта. Это удобно для отладки:
    
    Put_Line ("X = " & X'Img);
    
будет иметь такой же смысл, что и более "многословная" запись:
    
    Put_Line ("X = " & type'Image (X));
    
где type - это подтип объекта X.
     
S'Integer_Value  -  где S: целочисленный тип.
Обозначает функцию, которая имеет следующую спецификацию:
    
    function S'Integer_Value
        (Arg : Universal_Fixed)
                    return S;
    
Возвращаемое значение V подобно:
    
    Arg = V * type'Small
    
Таким образом, это эквивалентно: сначала, выполнению непроверяемого преобразования из вещественного типа с фиксированной точкой в соответствующий ему тип реализации, а затем, преобразование результата в целочисленный тип назначения. Первоначально этот атрибут был предназначен для использования в функциях стандартного ввода/вывода для вещественных типов с фиксированной точкой.
     
'Large  -  Предусмотрен для обеспечения совместимости с Ada 83.
     
'Machine_Size  -  Этот атрибут идентичен атрибуту 'Object_Size и предусмотрен для совместимости с одноименным атрибутом компилятора DEC Ada 83.
     
'Mantissa  -  Предусмотрен для обеспечения совместимости с Ada 83.
     
Standard'Max_Interrupt_Priority  -  где Standard - единственно возможный префикс.
Предоставляет значение System.Max_Interrupt_Priority и первоначально предназначен для построения этого описания в пакете System.
     
Standard'Max_Priority  -  где Standard - единственно возможный префикс.
Предоставляет значение System.Max_Priority и первоначально предназначен для построения этого описания в пакете System.
     
Standard'Maximum_Alignment  -  где Standard - единственно возможный префикс.
Предоставляет максимальное пригодное значение выравнивания для целевой платформы. Это статическое значение которое может быть использовано для указания требуемого выравнивания объектов. При этом во всех случаях будет гарантироваться правильность выравнивания объектов Это может быть полезно при импортировании внешних объектов, когда требования для их выравнивания не известны.
     
'Mechanism_Code  -  function'Mechanism_Code возвращает целочисленный код, который определяет используемый механизм для передачи результата вызова функции function, а subprogram'Mechanism_Code(n) возвращает целочисленный код, который определяет используемый механизм для передачи формального параметра с порядковым номером n (статическое целочисленное значение, 1 - подразумевает первый параметр) подпрограммы subprogram.

Смысл возвращаемых кодов следующий:

1  -  по значению (by copy / value)
2  -  по ссылке (by reference)
3  -  по дескриптору (by descriptor / default descriptor class)
4  -  по дескриптору (by descriptor / UBS: unaligned bit string)
5  -  по дескриптору (by descriptor / UBSB: aligned bit string with arbitrary bounds)
6  -  по дескриптору (by descriptor / UBA: unaligned bit array)
7  -  по дескриптору (by descriptor / S: string, also scalar access type parameter)
8  -  по дескриптору (by descriptor / SB: string with arbitrary bounds)
9  -  по дескриптору (by descriptor / A: contiguous array)
10  -  по дескриптору (by descriptor / NCA: non-contiguous array)

Значения 3-10 справедливы только для Digital OpenVMS реализации GNAT.

     
'Null_Parameter  -  Ссылка T'Null_Parameter обозначает воображаемый объект типа T который размещается по нулевому машинному адресу. Этот атрибут допустим только для выражений в формальных параметрах по умолчанию или как фактическое выражение вызова подпрограммы. В обоих случаях подпрограмма должна быть импортированной. Идентичность объекта представляется нулевым адресом в списке аргументов, вне зависимости от механизма передачи (явного или используемого по умолчанию). Такая возможность необходима для спецификации того, что нулевой адрес должен быть передан для записи или другого составного объекта передаваемого по ссылке. Другого способа такой индикации, без использования атрибута 'Null_Parameter, не существует.
     
'Object_Size  -  Размер какого-либо объекта не обязан быть таким же самым как размер типа объекта, поскольку размер объекта по умолчанию увеличен в соответствии с выравниванием объекта. Например, Natural'Object_Size равен 31 бит, а размер объекта типа Natural по умолчанию будет иметь размер 32 бита. Подобным образом, запись которая содержит Integer и Character:
    
    type Rec is record
       I : Integer;
       C : Character;
    end record;
    
будет иметь размер 40 бит (Rec'Size будет 40 бит; выравнивание будет 4, из-за поля типа Integer; таким образом размер записи этого типа по умолчанию будет 64 бита или 8 байт).

Атрибут T'Object_Size был добавлен к реализации GNAT, чтобы обеспечить легкое определение размера объекта типа T по умолчанию. Например Natural'Object_Size равен 32 бита, а Rec'Object_Size (для записи из примера) будет 64. Примечательно также то, что в отличие от ситуации с атрибутом 'Size который описан в руководстве по языку, атрибут 'Object_Size может быть определен индивидуально для различных подтипов. Например:

    
    type R is new Integer;
    subtype R1 is R range 1 .. 10;
    subtype R2 is R range 1 .. 10;
    for R2'Object_Size use 8;
    
В этом примере R'Object_Size и R1'Object_Size, оба равны 32, поскольку размер объекта по умолчанию для подтипа такой же как и размер для подтипа-предка. Это подразумевает, что размер по умолчанию для объектов с типами R и R1 будет 32 бита (4 байта). Но объекты типа R2 будут иметь только 8 бит (1 байт), поскольку R2'Object_Size был установлен в 8.
     
T'Passed_By_Reference  -  где T: тип.
Возвращает значение типа Boolean которое равно True если тип T может быть нормально передан по ссылке и False если тип T может быть нормально передан по значению при вызове. Для скалярных типов результат всегда будет False и является статическим. Для не скалярных типов, результат - не статический.
     
T'Range_Length  -  где T: любой дискретный тип.
Возвращает число значений представляемых типом (нуль, в случае пустого диапазона значений). Результат статический для статических типов. Этот атрибут применяется для типов индекса одномерных массивов и дает те же результаты, что и атрибут 'Range для того же массива.
     
'Safe_Emax  -  Предусмотрен для обеспечения совместимости с Ada 83.
     
'Safe_Large  -  Предусмотрен для обеспечения совместимости с Ada 83.
     
'Small  -  Этот атрибут предусмотрен в ada только для вещественных типов с фиксированной точкой. GNAT, для обеспечения совместимости с Ada 83, допускает использование этого атрибута для вещественных типов с плавающей точкой.
     
Standard'Storage_Unit  -  где Standard - единственно возможный префикс.
Предоставляет значение System.Storage_Unit и первоначально предназначен для построения этого описания в пакете System.
     
Standard'Tick  -  где Standard - единственно возможный префикс.
Предоставляет значение System.Tick и первоначально предназначен для построения этого описания в пакете System.
     
System'To_Address  -  где System - единственно возможный префикс.
Обозначает функцию которая идентична System.Storage_Elements.To_Address с тем исключением, что это статический атрибут. Это подразумевает, что подобное выражение может быть использовано в контексте (например, при преэлаборации пакета) который требует использования статических выражений и где не может быть использован вызов функции (поскольку вызов функции всегда является не статическим, даже при статических аргументах).
     
T'Type_Class  -  где T: любой тип.
Возвращает значение класса типа для типа T. Если тип T является настраиваемым типом, то возвращаемое значение будет значением соответствующего фактического типа. Значение этого атрибута имеет тип System.Aux_DEC.Type_Class, который имеет следующее описание:
    
      type Type_Class is
        (Type_Class_Enumeration,
         Type_Class_Integer,
         Type_Class_Fixed_Point,
         Type_Class_Floating_Point,
         Type_Class_Array,
         Type_Class_Record,
         Type_Class_Access,
         Type_Class_Task,
         Type_Class_Address);
    
Защищенные типы возвращают значение Type_Class_Task, которое, таким образом, подходит для всех многозадачных типов. Этот атрибут был разработан для обеспечения совместимости с одноименным атрибутом компилятора DEC Ada 83.
     
P'UET_Address  -  где P: библиотечный пакет.
Возвращает адрес таблицы исключений модуля при использовании обработки исключений без потерь производительности. Этот атрибут предназначен для использования только с реализацией GNAT. См. модуль Ada.Exceptions в файлах "a-except.ads" и "a-except.adb" для получения более полной информации о том как эти атрибуты используются в реализации.
     
N'Universal_Literal_String  -  где N: именованное число.
Возвращает статический результат, которым является строка символов представляющая число так, как оно было описано в оригинальном исходном тексте. Это позволяет пользователю программы получить доступ к фактическому тексту описания именованных чисел без промежуточного преобразования и без необходимости заключения строк в кавычки (которые препятствуют использование строк как чисел). Это имеет внутреннее использование для построения значений вещественных атрибутов с плавающей точкой из файла "ttypef.ads", но может быть также использовано в программах пользователя.
     
'Unrestricted_Access  -  Этот атрибут подобен атрибуту 'Access, за исключением того, что отсутствуют проверка на доступность и проверка представления косвенного доступа. Ответственность за правильность использования полностью возлагается на пользователя. Это подобно атрибуту 'Addess, для которого необходима замена в тех случаях, когда требуемое значение должно иметь ссылочный тип. Другими словами, эффект действия этого атрибута идентичен первоначальному получению атрибута 'Addess с последующим непроверяемым преобразованием в требуемое значение ссылочного типа. В GNAT, но не обязательно в других реализациях, использование статической цепочки для подпрограмм внутреннего уровня подразумевает, что 'Unrestricted_Access, примененный для подпрограммы, возвращает значение, которое может быть вызвано пока подпрограмма находится в области действия (видимости). Нормальные правила доступа/видимости в Ada 95 ограничивают такое использование.
     
'VADS_Size  -  Для обеспечения совместимости с компилятором VADS Ada 83.
     
T'Value_Size  -  где T: тип.
Возвращает число бит, которое требуется для представления значений указанного типа T. Это то же самое, что и T'Size, но в отличие от 'Size, может быть установлено для не первого подтипа.
     
Standard'Wchar_T_Size  -  где Standard - единственно возможный префикс.
Предоставляет битовый размер типа wchar_t языка C и первоначально предназначен для построения этого типа в пакете Interfaces.C.

Примечание: отсутствует в реализации GNAT V 3.13p.

     
Standard'Word_Size  -  где Standard - единственно возможный префикс.
Предоставляет значение System.Word_Size и первоначально предназначен для построения этого описания в пакете System.


Copyright (C) А.Гавва V-0.4w май 2004