Справочник Ada 2012
E.2.2 Библиотечные единицы удалённых типов
Библиотечная единица удалённых типов поддерживает определение типов, предназначенных для использования в обмене данными между активными разделами.
Синтаксис
Форма директивы Remote_Types выглядит следующим образом:
pragma Remote_Types[(имя_библиотечной_единицыимя)];
Правила допустимости
Директива Remote_Types используется для указания того, что библиотечная единица является библиотечной единицей удалённых типов, то есть что аспект Remote_Types библиотечной единицы имеет значение True. При объявлении такой библиотечной единицы применяются следующие ограничения:
- она должна быть предварительно вычисляемой;
- она должна зависеть семантически только от объявленных чистых элементов_библиотеки, общих пассивных библиотечных единиц, других библиотечных единиц удалённых типов или предварительно вычисленных обычных библиотечных единиц, которые упоминаются только в частных разделах с;
- она не должна содержать объявление каких-либо переменных в видимой части библиотечной единицы;
- полный вид каждого типа, объявленного в видимой части библиотечной единицы и имеющего доступные атрибуты потока, должен поддерживать внешнее потоковое представление (см. 13.13.2).
Называемый тип доступа, объявленный в видимой части библиотечной единицы удалённых типов или библиотечной единицы интерфейса удалённых вызовов, называется типом удалённого доступа. Такой тип должен быть:
- типом доступа к подпрограмме, или
- общим типом доступа, который обозначает ширококлассовый ограниченный частный тип, ширококлассовый ограниченный интерфейсный тип или ширококлассовое частное расширение, все предки которых являются либо частными расширениями, ограниченными интерфейсными типами, или ограниченными частными типами.
Тип, производный от типа удалённого доступа, также является типом удалённого доступа.
Следующие ограничения применяются к использованию типа удалённого доступа к подпрограмме:
- Значение типа удалённого доступа к подпрограмме должно преобразовываться только в или из другого (соответствующего подтипу) типа удалённого доступа к подпрограмме;
- Префикс атрибута доступа ссылка_атрибута, который возвращает значение типа удалённого доступа к подпрограмме, должен статически обозначать (соответствующую подтипу) удалённую подпрограмму.
Следующие ограничения применяются к использованию типа удалённого доступа к ширококлассовому типу:
- Примитивные подпрограммы соответствующего конкретного типа должны иметь только параметры доступа, если они являются контролируемыми формальными параметрами. Примитивные функции соответствующего конкретного типа должны иметь только результат доступа, если это контролируемый результат доступа. Каждый неконтролируемый формальный параметр и неконтролируемый тип результата должны поддерживать внешнее потоковое представление (см. 13.13.2);
- Соответствующий конкретный тип не должен иметь примитивную процедуру с указанным аспектом Синхронизация, если вид синхронизации не является Optional (см. 9.5);
- Значение типа удалённого доступа к ширококлассовому типу должно быть явно преобразовано только в другой тип удалённого доступа к ширококлассовому типу;
- Значение типа удалённого доступа к ширококлассовому типу должно быть разыменовано (или неявно преобразовано в анонимный тип доступа) только как часть вызова диспетчеризации к примитивной операции обозначенного типа, где значение обозначает контролируемый операнд вызова (см. E.4, “Вызовы удалённых подпрограмм”);
- Значение контролируемого результата доступа для примитивной функции с любыми контролируемыми операндами соответствующего конкретного типа должно либо быть явно преобразовано в тип удалённого доступа к ширококлассовому типу, либо быть частью вызова диспетчеризации, где значение обозначает контролируемый операнд вызова;
- Атрибут Storage_Pool не определён для типа удалённого доступа к ширококлассовому типу; ожидаемый тип для аллокатора не должен быть типом удалённого доступа к ширококлассовому типу. Тип удалённого доступа к ширококлассовому типу не должен быть фактическим параметром для формального типа доступа к шаблону. Атрибут Storage_Size типа удалённого доступа к ширококлассовому типу возвращает 0. Аспекты Storage_Pool и Storage_Size не должны быть указаны для типа удалённого доступа к ширококлассовому типу.
Ошибочное выполнение
Выполнение является ошибочным, если какая-либо операция (кроме инициализации или завершения объекта) изменяет значение константного объекта, объявленного в видимой части пакета удалённых типов.
ПРИМЕЧАНИЯ
5 Библиотечная единица удалённых типов не обязательно должна быть чистой, и типы, которые она определяет, могут включать уровни косвенности, реализованные с помощью типов доступа. Пользовательские атрибуты Read и Write (см. 13.13.2) обеспечивают отправку значений такого типа между активными разделами, причём Write обрабатывает представление, а Read обрабатывает разыменование любых уровней косвенности.
6 Значение типа удалённого доступа к ограниченному ширококлассовому интерфейсу может обозначать объект не ограниченного типа, производного от интерфейса.
7 Тип удалённого доступа может обозначать ширококлассовый синхронизированный, защищённый или интерфейс задачи.