Let's imagine that you want to create a generic package for a Stack that takes operations Push and Pop. Here's one way to define such a Stack; we'll define a Stack package that stores some Item type and has a maximum size:
generic
Size : Positive;
type Item is private;
package Generic_Stack is
procedure Push(E : in Item);
procedure Pop (E : out Item);
Overflow, Underflow : exception;
end Generic_Stack;
Now a definition needs to be implemented, so here's a sample implementation:
package body Generic_Stack is
type Table is array (Positive range <>) of Item;
Space : Table(1 .. Size);
Index : Natural := 0;
procedure Push(E : in Item) is
begin
if Index >= Size then
raise Overflow;
end if;
Index := Index + 1;
Space(Index) := E;
end Push;
procedure Pop(E : out Item) is
begin
if Index = 0 then
raise Underflow;
end if;
E := Space(Index);
Index := Index - 1;
end Pop;
end Generic_Stack;
Somewhere else you can instantiate the Generic_Stack package. If you wanted to instantiate a new package called ``Stack_Int'' which could hold 200 Integers, you could say:
package Stack_Int is new Generic_Stack(Size => 200, Item => Integer);
The ``Size =>'' and ``Item =>'' are optional; you could omit them if you wanted to. From then on, you could "Push" a new Integer onto Stack_Int by saying:
Stack_Int.Push(7);
What are the formal parameters for generic package Stack?
|
|
|
|
|---|
David A. Wheeler (dwheeler@ida.org)