Annotated Ada Reference ManualLegal Information
Contents   Index   References   Search   Previous   Next 

 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
on a full_type_declaration if the type has a tagged partial view. 
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
{AI05-0139-2} generalized_indexing ::= indexable_object_prefix actual_parameter_part

Name Resolution Rules

11/3
 {AI05-0139-2} The expected type for the indexable_object_prefix of a generalized_indexing is any indexable type.
12/3
 {AI05-0139-2} If the Constant_Indexing aspect is specified for the type of the indexable_object_prefix of a generalized_indexing, then the generalized_indexing is interpreted as a constant indexing under the following circumstances:
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
when the generalized_indexing is used within a primary where a name denoting a constant is permitted.
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
 Otherwise, the generalized_indexing is interpreted as a variable indexing.
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
Ramification: In other words, the generalized_indexing is equivalent to:
17.b/3
indexable_object_prefix.Indexing actual_parameter_part
17.c/3
where Indexing is the name specified for the Constant_Indexing or Variable_Indexing aspect. 

Extensions to Ada 2005

17.d/3
{AI05-0139-2} Aspects Constant_Indexing and Variable_Indexing, and the generalized_indexing syntax are new. 

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe