(В случае дискриминанта значение которого равно значению по умолчанию, дискриминант рассматривается как обычный компонент записи).
Это выполняется с помощью использования дополнительных атрибутов 'Input и 'Output.
Основная идея заключается в том, что атрибуты 'Input и 'Output
обрабатывают дополнительную информацию (если она есть) и затем вызывают 'Read и 'Write
для обработки остальных значений.
Их описание имеет следующий вид:
procedure T'Output(Stream : access Streams.Root_Stream_Type'Class; Item : in T); function T'Input(Stream: access Streams.Root_Stream_Type'Class) return T; |
Примечательно, что 'Input - это функция, поскольку T может быть неопределенным и нам могут быть не известны ограничения которые установлены для конкретного типа.
Таким образом, в случае массива процедура 'Output
выводит значения границ и, после этого, вызывает 'Write
непосредственно для самого значения.
В случае типа записи с дискриминантами, если запись имеет дискриминанты значения которых равны значениям по умолчанию, то 'Output
просто вызывает 'Write, которая трактует дискриминант как простой компонент записи.
Если значение дискриминанта не соответствует тому значению, которое указано как значение по умолчанию, то сначала 'Output
выводит дискриминанты записи, а затем вызывает 'Write
для обработки остальных компонентов записи.
В качестве примера, рассмотрим случай определенного подтипа, чей тип - это первый подтип, который не определен:
subtype String_6 is String(1 .. 6); S: String_6 := "String"; . . . String_6'Output(S); -- выводит значения границ и "String" String_6'Write(S); -- не выводит значения границ |
Примечательно, что атрибуты 'Output и 'Write
принадлежат типам и, таким образом, не имеет значения или мы записываем String_6'Write, или String'Write.
Приведенное выше описание работы T'Input и T'Output
относится к атрибутам которые заданы по умолчанию.
Они могут быть переопределены для выполнения чего-либо другого, причем не обязятельно для вызова T'Read и T'Write.