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 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 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).
 
Paragraphs 6 through 
9 were deleted. 
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.
 
6  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
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