Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

5.5.1 Пользовательские типы итераторов

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

Существует следующий определённый в языке обобщённый библиотечный пакет:
generic
type Курсор;
with function Есть_Элемент (Позиция : Курсор) return Boolean;
package Ada.Iterator_Interfaces
with Pure, Nonblocking => False is
type Forward_Iterator is limited interface;
function Первый (Объект : Forward_Iterator) return Курсор is abstract;
function Следующий (Объект : Forward_Iterator; Позиция : Курсор)
return Курсор is abstract;
type Обратимый_Итератор is limited interface and Forward_Iterator;
function Последний (Объект : Обратимый_Итератор) return Курсор is abstract;
function Предыдущий (Объект : Обратимый_Итератор; Позиция : Курсор)
return Курсор is abstract;
type Параллельный_Итератор is limited interface and Forward_Iterator;
subtype Индекс_Блока is Positive;
function Разделен (Объект : Параллельный_Итератор)
return Boolean is abstract;
procedure Разделить_На_Блоки (Объект : in out Параллельный_Итератор;
Макс_Блоков : in Индекс_Блока) is abstract
with Pre'Class => not Объект.Разделен or else raise Program_Error,
Post'Class => Объект.Разделен and then
Объект.Количество_Блоков <= Макс_Блоков;
function Количество_Блоков (Объект : Параллельный_Итератор)
return Индекс_Блока is abstract
with Pre'Class => Объект.Разделен or else raise Program_Error;
function Первый (Объект : Параллельный_Итератор;
Блок : Индекс_Блока) return Курсор is abstract
with Pre'Class => (Объект.Разделен and then
Блок <= Объект.Количество_Блоков)
or else raise Program_Error;
function Следующий (Объект : Параллельный_Итератор;
Позиция : Курсор;
Блок : Индекс_Блока) return Курсор is abstract
with Pre'Class => (Объект.Разделен and then
Блок <= Объект.Количество_Блоков)
or else raise Program_Error;
type Параллельный_Обратимый_Итератор is limited interface
and Параллельный_Итератор and Обратимый_Итератор;
end Ada.Iterator_Interfaces;
Тип итератора — это тип, унаследованный от интерфейса Forward_Iterator из какого-либо экземпляра Ada.Iterator_Interfaces. Обратимый тип итератора — это тип, унаследованный от интерфейса Reversible_Iterator из какого-либо экземпляра Ada.Iterator_Interfaces. Параллельный тип итератора — это тип, унаследованный от интерфейса Parallel_Iterator из какого-либо экземпляра Ada.Iterator_Interfaces. Тип, унаследованный от интерфейса Parallel_Reversible_Iterator из какого-либо экземпляра Ada.Iterator_Interfaces, является одновременно параллельным типом итератора и обратимым типом итератора. Объект итератора — это объект типа итератора. Объект обратимого итератора — это объект обратимого типа итератора. Объект параллельного итератора — это объект параллельного типа итератора. Формальный подтип Курсор из связанного экземпляра Ada.Iterator_Interfaces является подтипом курсора итерации для типа итератора.
Для индексируемого контейнерного типа T (см. 4.1.6) могут быть заданы следующие аспекты, связанные с типом:
Default_Iterator

Этот аспект задаётся именем, обозначающим ровно одну функцию, объявленную непосредственно в том же списке объявлений, в котором объявлен тип T или завершён объявлением типа T, первый параметр которой имеет тип T или T'Class или является параметром-ссылкой, тип которой T или T'Class, а остальные параметры, если они есть, имеют значения по умолчанию, и тип результата которой — тип итератора. Эта функция является функцией-итератором по умолчанию для типа T. Её подтип результата является подтипом итератора по умолчанию для типа T. Подтип курсора итерации для подтипа итератора по умолчанию является подтипом курсора по умолчанию для типа T. Этот аспект наследуется потомками типа T (включая T'Class).
Iterator_Element

Этот аспект задаётся именем, обозначающим подтип. Это подтип элемента по умолчанию для T. Этот аспект наследуется потомками типа T (включая T'Class).
Iterator_View

Этот аспект задаётся именем, обозначающим тип T2 со следующими свойствами:
T2 объявлен в том же модуле, что и T;
T2 является итерируемым контейнерным типом;
T2 имеет единственный дискриминант, являющийся дискриминантом-ссылкой, обозначающей T; и
Подтипы итератора по умолчанию для T и T2 статически совпадают.
Этот аспект никогда не наследуется, даже типом T'Class.
Этот абзац был удалён.
Итерируемый контейнерный тип — это индексируемый контейнерный тип с заданными аспектами Default_Iterator и Iterator_Element. Обратимый итерируемый контейнерный тип — это итерируемый контейнерный тип, для которого тип итератора по умолчанию является обратимым типом итератора. Параллельный итерируемый контейнерный тип — это итерируемый контейнерный тип, для которого тип итератора по умолчанию является параллельным типом итератора. Объект итерируемого контейнера — это объект итерируемого контейнерного типа. Объект обратимого итерируемого контейнера — это объект обратимого итерируемого контейнерного типа. Объект параллельного итерируемого контейнера — это объект параллельного итерируемого контейнерного типа.
Аспекты Default_Iterator и Iterator_Element не переопределяются (см. 13.1.1).

Правила допустимости

Аспект Constant_Indexing (если задан) итерируемого контейнерного типа T должен обозначать ровно одну функцию со следующими свойствами:
  • тип результата функции соответствует типу элемента по умолчанию для T или является типом ссылки (см. 4.1.5) с дискриминантом-ссылкой, обозначающим тип, соответствующий типу элемента по умолчанию для T;
  • тип второго параметра функции соответствует типу курсора по умолчанию для T;
  • если параметров больше двух, то все дополнительные параметры имеют значения по умолчанию.
Эта функция (если задана) является функцией постоянного индексирования по умолчанию для T.
Аспект Variable_Indexing (если задан) итерируемого контейнерного типа T должен обозначать ровно одну функцию со следующими свойствами:
  • тип результата функции является типом ссылки (см. 4.1.5) с дискриминантом-ссылкой, обозначающим тип, соответствующий типу элемента по умолчанию для T;
  • тип второго параметра функции соответствует типу курсора по умолчанию для T;
  • если параметров больше двух, то все дополнительные параметры имеют значения по умолчанию.
Эта функция (если задана) является функцией переменного индексирования по умолчанию для T.

Ошибочное выполнение

Вызов операции First или Next для данного объекта Parallel_Iterator с заданным значением Блок, который не генерирует исключение, должен возвращать значение Курсор, которое либо даёт False при передаче в Has_Element, либо идентифицирует элемент, отличный от любого значения Курсор, возвращённого вызовом операции First или Next для того же объекта Parallel_Iterator с другим значением Блок. Если операции First или Next с параметром Блок ведут себя каким-либо иным образом, выполнение является ошибочным.


Spec-Zone.ru

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