5.5.1 User-Defined Iterator Types
Static Semantics
The following language-defined 
generic library package exists: 
generic
   type Cursor;
   
with function Has_Element (Position : Cursor) 
return Boolean;
package Ada.Iterator_Interfaces 
is
   pragma Pure (Iterator_Interfaces);
 
   type Forward_Iterator 
is limited interface;
   
function First (Object : Forward_Iterator) 
return Cursor 
is abstract;
   
function Next (Object : Forward_Iterator; Position : Cursor)
      
return Cursor 
is abstract;
 
   type Reversible_Iterator 
is limited interface and Forward_Iterator;
   
function Last (Object : Reversible_Iterator) 
return Cursor 
is abstract;
   
function Previous (Object : Reversible_Iterator; Position : Cursor)
      
return Cursor 
is abstract;
 
end Ada.Iterator_Interfaces;
An 
iterator type is a type descended from 
the Forward_Iterator interface from some instance of Ada.Iterator_Interfaces.
 
A 
reversible iterator type is a type descended from the Reversible_Iterator 
interface from some instance of Ada.Iterator_Interfaces.
 
An 
iterator object is an object of an iterator type.
 
A 
reversible iterator object is an object of a reversible iterator 
type.
 The formal subtype Cursor from the associated 
instance of Ada.Iterator_Interfaces is the 
iteration cursor subtype 
for the iterator type.
 
The following type-related 
operational aspects may be specified for an indexable container type 
T (see 
4.1.6):
 
Default_Iterator
This aspect is specified by a 
name 
that denotes exactly one function declared immediately within the same 
declaration list in which 
T is declared, whose first parameter 
is of type 
T or 
T'Class or an access parameter whose designated 
type is type 
T or 
T'Class, whose other parameters, if any, 
have default expressions, and whose result type is an iterator type. 
This function is the 
default iterator function for 
T.
 
Its result subtype is the 
default iterator subtype for 
T.
 
The iteration cursor subtype for the default iterator subtype is the 
default cursor subtype for 
T.
 
Iterator_Element
This aspect is specified by a 
name 
that denotes a subtype. This is the 
default element subtype for 
T.
 
 These aspects are inherited by descendants of type 
T (including T'Class).
 An 
iterable container type is an indexable 
container type with specified Default_Iterator and Iterator_Element aspects.
 
A 
reversible iterable container type is an iterable container 
type with the default iterator type being a reversible iterator type.
 
An 
iterable container object is an object of an iterable container 
type.
 A 
reversible iterable container object 
is an object of a reversible iterable container type.
 
   The Default_Iterator and Iterator_Element aspects 
are nonoverridable (see 
13.1.1).
 
Legality Rules
 The Constant_Indexing 
aspect (if any) of an iterable container type T shall denote exactly 
one function with the following properties:
the result type of the function is covered by the 
default element type of 
T or is a reference type (see 
4.1.5) 
with an access discriminant designating a type covered by the default 
element type of 
T;
 
the type of the second parameter of the function 
covers the default cursor type for T;
if there are more than two parameters, the additional 
parameters all have default expressions.
 This function (if any) is the 
default constant 
indexing function for 
T.
 
 The Variable_Indexing 
aspect (if any) of an iterable container type T shall denote exactly 
one function with the following properties:
the result type of the function is a reference 
type (see 
4.1.5) with an access discriminant 
designating a type covered by the default element type of 
T;
 
the type of the second parameter of the function 
covers the default cursor type for T;
if there are more than two parameters, the additional 
parameters all have default expressions.
 This function (if any) is the 
default variable 
indexing function for 
T.
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe