Справочник по Ada 2012
4.1.6 Пользовательское индексирование
Статическая семантика
Для помеченного типа T могут быть заданы следующие связанные с типом операционные аспекты:
Constant_Indexing
Этот аспект должен быть задан именем, обозначающим одну или несколько функций, объявленных непосредственно в том же списке объявлений, в котором объявлен тип T. Все такие функции должны иметь как минимум два параметра, первый из которых имеет тип T или T'Class, или является параметром доступа к константе с назначенным типом T или T'Class.
Variable_Indexing
Этот аспект должен быть задан именем, обозначающим одну или несколько функций, объявленных непосредственно в том же списке объявлений, в котором объявлен тип T. Все такие функции должны иметь как минимум два параметра, первый из которых имеет тип T или T'Class, или является параметром доступа с назначенным типом T или T'Class. Все такие функции должны иметь возвращаемый тип, который является типом ссылки (см. 4.1.5), дискриминант ссылки которого имеет тип доступа к переменной.
Эти аспекты наследуются потомками типа T (включая тип класса T'Class).
Тип контейнера с индексированием — это (вид) помеченный тип, для которого задан как минимум один из аспектов Constant_Indexing или Variable_Indexing. Объект контейнера с индексированием — это объект типа контейнера с индексированием. generalized_indexing — это имя, обозначающее результат вызова функции, имя которой указано в аспекте Constant_Indexing или Variable_Indexing.
Аспекты Constant_Indexing и Variable_Indexing являются неизменяемыми (см. 13.1.1).
Абзацы с 6 по 9 были удалены.
Синтаксис
Правила разрешения имен
Ожидаемый тип для indexable_container_object_prefix generalized_indexing — это любой тип контейнера с индексированием.
Если для типа indexable_container_object_prefix generalized_indexing задан аспект Constant_Indexing, то generalized_indexing интерпретируется как постоянное индексирование при следующих обстоятельствах:
- когда аспект Variable_Indexing не задан для типа indexable_container_object_prefix;
- когда indexable_container_object_prefix обозначает константу;
- когда generalized_indexing используется внутри primary, где разрешено имя, обозначающее константу.
В противном случае generalized_indexing интерпретируется как индексирование переменной.
Когда generalized_indexing интерпретируется как постоянное (или переменное) индексирование, это эквивалентно вызову префиксного вида одной из функций, указанных в аспекте Constant_Indexing (или Variable_Indexing) типа indexable_container_object_prefix с заданным actual_parameter_part и с indexable_container_object_prefix в качестве префикса префиксного вида.
ПРИМЕЧАНИЯ
6 Аспекты Constant_Indexing и Variable_Indexing не могут быть переопределены при наследовании для производного типа, но функции, которые они обозначают, могут быть изменены путем переопределения или перегрузки.
Примеры
type Indexed_Barrel is tagged ...
with Variable_Indexing => Find;
-- Indexed_Barrel — это тип контейнера с индексированием,
-- Find — это операция обобщенного индексирования.
with Variable_Indexing => Find;
-- Indexed_Barrel — это тип контейнера с индексированием,
-- Find — это операция обобщенного индексирования.
function Find (B : aliased in out Indexed_Barrel; Key : String) return Ref_Element;
-- Возвращает ссылку на элемент бочки (см. 4.1.5).
-- Возвращает ссылку на элемент бочки (см. 4.1.5).
IB: aliased Indexed_Barrel;
-- Все следующие вызовы эквивалентны:
Find (IB,"pear").Data.all := Element'(...); -- Традиционный вызов
IB.Find ("pear").Data.all := Element'(...); -- Вызов префиксного вида
IB.Find ("pear") := Element'(...); -- Неявное разыменование (см. 4.1.5)
IB ("pear") := Element'(...); -- Неявное индексирование и разыменование
IB ("pear").Data.all := Element'(...); -- Только неявное индексирование
Find (IB,"pear").Data.all := Element'(...); -- Традиционный вызов
IB.Find ("pear").Data.all := Element'(...); -- Вызов префиксного вида
IB.Find ("pear") := Element'(...); -- Неявное разыменование (см. 4.1.5)
IB ("pear") := Element'(...); -- Неявное индексирование и разыменование
IB ("pear").Data.all := Element'(...); -- Только неявное индексирование