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

H.7.1 Аспекты Use_Formal и Dispatching

Аспекты Use_Formal и Dispatching предназначены для более точного описания использования формальных параметров обобщённых процедур и вызовов диспетчеризации в ходе выполнения операции, что позволяет более точно проверять соответствие аспектам Nonblocking и global, которые применяются в момент вызова операции.
Для любого объявления внутри обобщённого блока, для которого может быть указан аспект global или Nonblocking, кроме generic_formal_parameter_declaration, можно указать следующий аспект, чтобы указать, какие формальные параметры обобщения используются связанным объектом:
Use_Formal
Аспект указывается с помощью formal_parameter_set, имеющего следующий вид:
formal_parameter_set ::=
formal_group_designator
| formal_parameter_name
| (formal_parameter_name{, formal_parameter_name})
formal_group_designator ::= null | all
formal_parameter_name ::=
формальный_subtype_mark
| формальный_подпрограмма_name
| формальный_доступ_к_подпрограммному_объекту_name
Для любого объявления, для которого может быть указан аспект global или Nonblocking, кроме библиотечных пакетов, обобщённых библиотечных пакетов или обобщённых формальных параметров, может быть указан следующий аспект:
Dispatching
Аспект указывается с помощью dispatching_operation_set, имеющего следующий вид:
dispatching_operation_set ::=
dispatching_operation_specifier
| (dispatching_operation_specifier{, dispatching_operation_specifier})
dispatching_operation_specifier ::=
операция_диспетчеризации_name (объект_name)

Правила разрешения имён

formal_parameter_name в аспекте Use_Formal должен статически обозначать формальный подтип, формальную подпрограмму или формальный объект анонимного типа доступа к подпрограмме вложенного обобщенного блока или видимого формального пакета.
объект_name в dispatching_operation_specifier должен статически обозначать объект (включая, возможно, формальный параметр) типа метки класса T'Class или типа доступа, обозначающего тип метки класса T'Class; операция_диспетчеризации_name в dispatching_operation_specifier должен статически обозначать операцию диспетчеризации, связанную с T.

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

Множество формальных параметров определяется набором formal_parameter_nameов. В качестве альтернативы можно использовать зарезервированное слово null, чтобы указать, что ни один из формальных параметров обобщения не используется, или all, чтобы указать, что все формальные параметры обобщения (или видимого формального пакета) могут быть использованы в ходе выполнения операции. Если для сущности, объявленной в обобщенном блоке, не указано множество формальных параметров, по умолчанию используется all.
Множество операций диспетчеризации определяется набором dispatching_operation_specifierов. Оно указывает, что проверки Nonblocking и global для вызовов диспетчеризации, соответствующих одному из спецификаторов, вместо того, чтобы учитываться аспектом Nonblocking или global, будут учитываться вызывающим операцию. Вызов диспетчеризации соответствует dispatching_operation_specifier, если имя или префикс вызова статически обозначает те же операции, что и dispatching_operation_specifier, и по крайней мере один из объектов, управляющих вызовом, обозначается или обозначается именем, которое статически называет тот же объект, что и объект_name в dispatching_operation_specifier.
В отсутствие dispatching_operation_specifierов или если ни один из них не соответствует вызову диспетчеризации C в операции P, проверки аспектов Nonblocking и global выполняются в момент вызова C в P с использованием аспектов Nonblocking и Global'Class, которые применяются к операции диспетчеризации, указанной в вызове C. Если есть соответствие, любые глобальные обращения или потенциальные блокировки в теле подпрограммы, вызываемой вызовом C, игнорируются в момент вызова в P. Вместо этого, при вызове самой операции P, проверки аспектов Nonblocking и global выполняются с предположением, что каждая указанная операция диспетчеризации вызывается по меньшей мере один раз (с указанным объектом, управляющим вызовом), но аналогичным образом игнорируются вызовы диспетчеризации, которые соответствовали бы dispatching_operation_specifier, применимые в момент вызова P.

Правила легальности

Внутри операции, к которой применяется аспект Use_Formal, если множество формальных параметров — что-то, кроме all, то только формальные подтипы, которые могут быть использованы, только формальные подпрограммы, которые могут быть вызваны, и только формальные объекты анонимного типа доступа к подпрограмме, которые могут быть разыменованы как часть вызова или переданы в качестве фактического для параметра доступа, — это те, что включены в множество формальных параметров.
При вызове операции (или её экземпляра), к которой применяется аспект Use_Formal, выполняются проверки аспектов Nonblocking и global с предположением, что каждый формальный параметр обобщения (или соответствующий фактический параметр) множества формальных параметров используется по меньшей мере один раз.

Примеры

Пример использования аспекта Dispatching:
procedure My_Write( -- см. 13.13.2
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : My_Integer'Base)
with Dispatching => Write(Stream);
for My_Integer'Write use My_Write;
Примеры использования аспекта Use_Formal см. в функциях Element множества Hashed_Sets в A.18.8.


Spec-Zone.ru

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