4.1.5 User-Defined References
Static Semantics
{
AI05-0139-2}
Given a discriminated type
T, the following type-related operational
aspect may be specified:
Implicit_Dereference
This aspect is specified by a
name
that denotes an access discriminant declared for the type
T.
Aspect Description for Implicit_Dereference:
Mechanism for user-defined implicit .all.
{
AI05-0139-2}
A (view of a) type with a specified Implicit_Dereference aspect is a
reference type.
A
reference object
is an object of a reference type.
The discriminant
named by the Implicit_Dereference aspect is the
reference discriminant
of the reference type or reference object.
[A
generalized_reference
is a
name
that identifies a reference object, and denotes the object or subprogram
designated by the reference discriminant of the reference object.]
Glossary entry: A reference type is one
that has user-defined behavior for “.all”, defined
by the Implicit_Dereference aspect.
Syntax
Name Resolution Rules
Static Semantics
{
AI05-0139-2}
Given a reference type
T, the Implicit_Dereference aspect is inherited
by descendants of type
T if not overridden. If a descendant type
constrains the value of the reference discriminant of
T by a new
discriminant, that new discriminant is the reference discriminant of
the descendant. [If the descendant type constrains the value of the reference
discriminant of
T by an
expression
other than the
name
of a new discriminant, a
generalized_reference
that identifies an object of the descendant type denotes the object or
subprogram designated by the value of this constraining expression.]
Dynamic Semantics
{
AI05-0139-2}
The evaluation of a
generalized_reference
consists of the evaluation of the
reference_object_name
and a determination of the object or subprogram designated by the reference
discriminant of the named reference object.
A
check is made that the value of the reference discriminant is not the
null access value.
Constraint_Error is raised if
this check fails. The
generalized_reference
denotes the object or subprogram designated by the value of the reference
discriminant of the named reference object.
Examples
{
AI05-0268-1}
type Barrel
is tagged ... --
holds objects of type Element
{
AI05-0139-2}
{
AI05-0299-2}
type Ref_Element(Data :
access Element)
is limited private
with Implicit_Dereference => Data;
--
This Ref_Element type is a "reference" type.
--
"Data" is its reference discriminant.
{
AI05-0139-2}
{
AI05-0268-1}
function Find (B :
aliased in out Barrel; Key : String)
return Ref_Element;
--
Return a reference to an element of a barrel.
Extensions to Ada 2005
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe