4.1.6 User-Defined Indexing
Static Semantics
Given a tagged type
T, the following type-related, operational aspects may be specified:
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, or the declaration completed by
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.
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, or the declaration completed by
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.
These aspects are inherited by descendants of T
(including the class-wide type T'Class).
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.
The Constant_Indexing and Variable_Indexing aspects
are nonoverridable (see
13.1.1).
Legality Rules
If an ancestor of a type
T is an indexable
container type, then any explicit specification of the Constant_Indexing
or Variable_Indexing aspects shall be confirming; that is, the specified
name shall
match the inherited aspect (see
13.1.1).
Paragraphs 7 through
8 were deleted.
In addition to the places where
Legality Rules normally apply (see
12.3),
this rule applies also in the private part of an instance of a generic
unit.
Syntax
Name Resolution Rules
when the Variable_Indexing aspect is not specified
for the type of the
indexable_container_object_prefix;
when the
indexable_container_object_prefix
denotes a constant;
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.
NOTE The Constant_Indexing and Variable_Indexing
aspects cannot be redefined when inherited for a derived type, but the
functions that they denote can be modified by overriding or overloading.
Examples
Examples of the
specification and use of generalized indexing:
type Indexed_Barrel is tagged ...
with Variable_Indexing => Find;
-- Indexed_Barrel is an indexable container type,
-- Find is the generalized indexing operation.
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).
IB: aliased Indexed_Barrel;
--
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