4.1.6 User-Defined Indexing
Static Semantics
1/3
{
AI05-0139-2}
Given a tagged type T, the following type-related,
operational aspects may be specified:
2/3
Constant_Indexing
This aspect shall be specified by a name
that denotes one or more functions declared immediately within the same
declaration list in which T is declared. All such functions shall
have at least two parameters, the first of which is of type T
or T'Class, or is an access-to-constant parameter with designated
type T or T'Class.
2.a/3
Aspect Description
for Constant_Indexing: Defines
function(s) to implement user-defined indexed_components.
3/3
Variable_Indexing
This aspect shall be specified by a name
that denotes one or more functions declared immediately within the same
declaration list in which T is declared. All such functions shall
have at least two parameters, the first of which is of type T
or T'Class, or is an access parameter with designated type T
or T'Class. All of such functions shall have a return type that
is a reference type (see 4.1.5), whose reference
discriminant is of an access-to-variable type.
3.a/3
Reason: We require
these functions to return a reference type so that the object returned
from the function can act like a variable. We need no similar rule for
Constant_Indexing, since all functions return constant objects.
3.b/3
Aspect Description
for Variable_Indexing: Defines
function(s) to implement user-defined indexed_components.
4/3
These aspects are inherited
by descendants of T (including the class-wide type T'Class).
[The aspects shall not be overridden, but the functions they denote may
be.]
4.a/3
Ramification: Indexing
can be provided for multiple index types by overloading routines with
different parameter profiles. For instance, the map containers provide
indexing on both cursors and keys by providing pairs of overloaded routines
to the Constant_Indexing and Variable_Indexing aspects.
5/3
{
AI05-0139-2}
An indexable type is (a view of) a tagged
type with at least one of the aspects Constant_Indexing or Variable_Indexing
specified. An indexable object is an object
of an indexable type. [A generalized_indexing
is a name
that denotes the result of calling a function named by a Constant_Indexing
or Variable_Indexing aspect.]
Legality Rules
6/3
{
AI05-0139-2}
The Constant_Indexing or Variable_Indexing aspect
shall not be specified:
7/3
on a derived type if the
parent type has the corresponding aspect specified or inherited; or
8/3
9/3
In addition
to the places where Legality Rules normally apply (see 12.3),
these rules apply also in the private part of an instance of a generic
unit.
9.a/3
Ramification: In
order to enforce these rules without breaking privacy, we cannot allow
a tagged private type to have hidden indexing aspects. There is no problem
if the private type is not tagged (as the indexing aspects cannot be
specified on descendants in that case).
9.b/3
We don't need an assume-the-worst
rule as deriving from formal tagged type is not allowed in generic bodies.
Syntax
10/3
Name Resolution Rules
11/3
12/3
13/3
when the Variable_Indexing
aspect is not specified for the type of the indexable_object_prefix;
14/3
when the indexable_object_prefix
denotes a constant;
15/3
15.a/3
Ramification: This
means it is not interpreted as a constant indexing for the variable_name
in the LHS of an assignment (not inside a primary),
nor for the name
used for an out or in out parameter (not allowed to be
a constant), nor for the name
in an object renaming (not inside a primary), unless there is no Variable_Indexing
aspect defined.
16/3
17/3
When a generalized_indexing
is interpreted as a constant (or variable) indexing, it is equivalent
to a call on a prefixed view of one of the functions named by the Constant_Indexing
(or Variable_Indexing) aspect of the type of the indexable_object_prefix
with the given actual_parameter_part,
and with the indexable_object_prefix
as the prefix
of the prefixed view.
17.a/3
17.b/3
17.c/3
where
Indexing is the name specified for the Constant_Indexing or Variable_Indexing
aspect.
Extensions to Ada 2005
17.d/3
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe