4.1.6 User-Defined Indexing
Static Semantics
1/3
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.
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 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.
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.
5/3
An
indexable container type is (a view of)
a tagged type with at least one of the aspects Constant_Indexing or Variable_Indexing
specified.
An
indexable container object is
an object of an indexable container 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
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.
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_container_object_prefix;
14/3
when the
indexable_container_object_prefix
denotes a constant;
15/3
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_container_object_prefix
with the given
actual_parameter_part,
and with the
indexable_container_object_prefix
as the
prefix
of the prefixed view.
Examples
18/3
type Indexed_Barrel is tagged ...
with Variable_Indexing => Find;
-- Indexed_Barrel is an indexable container type,
-- Find is the generalized indexing operation.
19/3
function Find (B :
aliased in out Indexed_Barrel; Key : String)
return Ref_Element;
--
Return a reference to an element of a barrel (see 4.1.5).
20/3
IB: aliased Indexed_Barrel;
21/3
--
All of the following calls are then equivalent:
Find (IB,"pear").Data.
all := Element'(...); --
Traditional call
IB.Find ("pear").Data.
all := Element'(...); --
Call of prefixed view
IB.Find ("pear") := Element'(...); --
Implicit dereference (see 4.1.5)
IB ("pear") := Element'(...); --
Implicit indexing and dereference
IB ("pear").Data.
all := Element'(...); --
Implicit indexing only
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe