12.2 Generic Bodies
{generic body}
The body of a generic unit (a
generic body)
[is a template for the instance bodies. The syntax of a generic body
is identical to that of a nongeneric body].
Ramification: We also use terms like
“generic function body” and “nongeneric package body.”
Dynamic Semantics
{elaboration (generic
body) [partial]} The elaboration of a
generic body has no other effect than to establish that the generic unit
can from then on be instantiated without failing the Elaboration_Check.
If the generic body is a child of a generic package, then its elaboration
establishes that each corresponding declaration nested in an instance
of the parent (see
10.1.1) can from then
on be instantiated without failing the Elaboration_Check.
4 The syntax of generic subprograms implies
that a generic subprogram body is always the completion of a declaration.
Examples
Example of a generic
procedure body:
procedure Exchange(U, V :
in out Elem)
is --
see 12.1
T : Elem; --
the generic formal type
begin
T := U;
U := V;
V := T;
end Exchange;
Example of a generic
function body:
function Squaring(X : Item)
return Item
is --
see 12.1
begin
return X*X; --
the formal operator "*"
end Squaring;
Example of a generic
package body:
package body On_Vectors
is --
see 12.1
function Sum(A, B : Vector) return Vector is
Result : Vector(A'Range); -- the formal type Vector
Bias : constant Integer := B'First - A'First;
begin
if A'Length /= B'Length then
raise Length_Error;
end if;
for N in A'Range loop
Result(N) := Sum(A(N), B(N + Bias)); -- the formal function Sum
end loop;
return Result;
end Sum;
function Sigma(A : Vector) return Item is
Total : Item := A(A'First); -- the formal type Item
begin
for N in A'First + 1 .. A'Last loop
Total := Sum(Total, A(N)); -- the formal function Sum
end loop;
return Total;
end Sigma;
end On_Vectors;