Spec-Zone.ru › Ada 95
Справочник по Ada 95

13.13.2 Потоковые атрибуты

Операционные атрибуты Write, Read, Output и Input преобразуют значения в поток элементов и восстанавливают значения из потока.

Статическая семантика

Для каждого подтипа S определенного типа T определены следующие атрибуты.
S'Write
S'Write обозначает процедуру со следующим описанием:
procedure S'Write(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T)
S'Write записывает значение Item в Stream.
S'Read
S'Read обозначает процедуру со следующим описанием:
procedure S'Read(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : out T)
S'Read считывает значение Item из Stream.
Для неразмеченных производных типов атрибуты Write и Read родительского типа наследуются, как указано в 13.1; в противном случае используются стандартные реализации этих атрибутов. Стандартные реализации атрибутов Write и Read выполняются следующим образом:
Для элементарных типов представление в терминах потоковых элементов определяется реализацией. Для составных типов атрибут Write или Read для каждого компонента вызывается в каноническом порядке, при этом размерность массива изменяется быстрее для последнего измерения, а порядок агрегатов записей определяется их позицией. Границы не включаются в поток, если T — тип массива. Если T — дискриминированный тип, дискриминанты включаются только в том случае, если они имеют значения по умолчанию. Если T — помеченный тип, метка не включается. Для расширений типов вызывается атрибут Write или Read родительского типа, за которым следуют атрибуты Write или Read каждого компонента части расширения в каноническом порядке. Для ограниченного расширения типа, если атрибут любого предкового типа T был задан явно, а атрибут любого предкового типа типа любого из компонентов расширения, являющегося ограниченным типом, не был задан, атрибут T должен быть задан явно.
Для каждого подтипа S'Class класса-типа T'Class:
S'Class'Write
S'Class'Write обозначает процедуру со следующим описанием:
procedure S'Class'Write(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)
Выполняет переадресацию подпрограмме, обозначаемой атрибутом Write соответствующего типа, идентифицированного меткой Item.
S'Class'Read
S'Class'Read обозначает процедуру со следующим описанием:
procedure S'Class'Read(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : out T'Class)
Выполняет переадресацию подпрограмме, обозначаемой атрибутом Read соответствующего типа, идентифицированного меткой Item.

Рекомендации по реализации

Если размер потокового элемента совпадает с размером элемента хранения, то нормальное представление в памяти должно использоваться атрибутами Read и Write для скалярных объектов. В противном случае Read и Write должны использовать наименьшее количество потоковых элементов, необходимое для представления всех значений в базовом диапазоне скалярного типа.

Статическая семантика

Для каждого подтипа S определенного типа T определены следующие атрибуты.
S'Output
S'Output обозначает процедуру со следующим описанием:
procedure S'Output(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T)
S'Output записывает значение Item в Stream, включая любые границы или дискриминанты.
S'Input
S'Input обозначает функцию со следующим описанием:
function S'Input(
Stream : access Ada.Streams.Root_Stream_Type'Class)
return T
S'Input считывает и возвращает одно значение из Stream, используя любые границы или дискриминанты, записанные соответствующим S'Output, чтобы определить, сколько считывать.
Для неразмеченных производных типов атрибуты Output и Input родительского типа наследуются, как указано в 13.1; в противном случае используются стандартные реализации этих атрибутов. Стандартные реализации атрибутов Output и Input выполняются следующим образом:
  • Если T — тип массива, S'Output сначала записывает границы, а S'Input сначала считывает границы. Если T имеет дискриминанты без значений по умолчанию, S'Output сначала записывает дискриминанты (используя S'Write для каждого), а S'Input сначала считывает дискриминанты (используя S'Read для каждого).
  • Затем S'Output вызывает S'Write для записи значения Item в поток. S'Input затем создаёт объект (с границами или дискриминантами, если они есть, взятыми из потока), инициализирует его с помощью S'Read и возвращает значение объекта.
Для каждого подтипа S'Class класса-типа T'Class:
S'Class'Output
S'Class'Output обозначает процедуру со следующим описанием:
procedure S'Class'Output(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)
Сначала записывает внешнюю метку Item в Stream (вызвав String'Output(Tags.External_Tag(Item'Tag) — см. 3.9), а затем выполняет переадресацию подпрограмме, обозначаемой атрибутом Output соответствующего типа, идентифицированного меткой.
S'Class'Input
S'Class'Input обозначает функцию со следующим описанием:
function S'Class'Input(
Stream : access Ada.Streams.Root_Stream_Type'Class)
return T'Class
Сначала считывает внешнюю метку из Stream и определяет соответствующую внутреннюю метку (вызвав Tags.Internal_Tag(String'Input(Stream)) — см. 3.9), а затем выполняет переадресацию подпрограмме, обозначаемой атрибутом Input соответствующего типа, идентифицированного внутренней меткой; возвращает результат.
В стандартной реализации Read и Input для составного типа для каждого скалярного компонента, являющегося дискриминантом или чьё объявление компонента включает выражение по умолчанию, проверяется, принадлежит ли значение, возвращённое Read для компонента, его подтипу. Constraint_Error возбуждается, если эта проверка не пройдена. Для других скалярных компонентов проверка не выполняется. Для каждого компонента типа доступа, если реализация может обнаружить, что значение, возвращённое Read для компонента, не является значением его подтипа, возбуждается Constraint_Error. Если значение не является значением его подтипа и эта ошибка не обнаруживается, компонент имеет аномальное значение, что может привести к ошибочному выполнению (см. 13.9.1).
В стандартной реализации Read и Input для типа, End_Error возбуждается, если конец потока достигается до завершения чтения значения типа.
Потоковые атрибуты могут быть определены для любого типа с помощью attribute_definition_clause. Все неограниченные типы имеют стандартные реализации для этих операций. Ссылка на атрибут для одного из этих атрибутов некорректна, если тип ограничен, если только атрибут не определён в attribute_definition_clause или (для расширения типа) не определён для предкового типа. Для attribute_definition_clause, определяющего один из этих атрибутов, подтип параметра Item должен быть базовым подтипом, если он скалярный, и первым подтипом в противном случае. То же правило относится к результату функции Input.

Требования к реализации

Для каждого подтипа S языка-определённого неограниченного специфического типа T выход, сгенерированный S'Output или S'Write, должен быть читаем с помощью S'Input или S'Read соответственно. Это правило распространяется на разделы, если реализация соответствует приложению Распределённые системы.
ПРИМЕЧАНИЯ
31 Для определённого подтипа S типа T достаточно T'Write и T'Read, чтобы передать произвольное значение подтипа через поток. Для неопределённого подтипа S типа T обычно потребуются T'Output и T'Input, так как T'Write и T'Read не передают границы, дискриминанты или метки.
32 Пользовательские атрибуты S'Class не наследуются другими типами класса, произошедшими от S.

Примеры

Пример пользовательского атрибута Write:
procedure My_Write(
Stream : access Ada.Streams.Root_Stream_Type'Class; Item : My_Integer'Base);
for My_Integer'Write use My_Write;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API