Contents   Index   Search   Previous   Next
 12.8 Example of a Generic Package
1
   The following example provides a possible formulation
of stacks by means of a generic package. The size of each stack and the
type of the stack elements are provided as generic formal parameters.
Examples
2/1
     This
paragraph was deleted.
3
generic
   Size : Positive;
   type Item is private;
package Stack is
   procedure Push(E : in  Item);
   procedure Pop (E : out Item);
   Overflow, Underflow : exception;
end Stack;
4
package body Stack is
5
   type Table is array (Positive range <>) of Item;
   Space : Table(1 .. Size);
   Index : Natural := 0;
6
   procedure Push(E : in Item) is
   begin
      if Index >= Size then
         raise Overflow;
      end if;
      Index := Index + 1;
      Space(Index) := E;
   end Push;
7
   procedure Pop(E : out Item) is
   begin
      if Index = 0 then
         raise Underflow;
      end if;
      E := Space(Index);
      Index := Index - 1;
   end Pop;
8
end Stack;
9
   Instances of this
generic package can be obtained as follows: 
10
package Stack_Int  is new Stack(Size => 200, Item => Integer);
package Stack_Bool is new Stack(100, Boolean);
11
    Thereafter, the procedures
of the instantiated packages can be called as follows: 
12
Stack_Int.Push(N);
Stack_Bool.Push(True);
13
    Alternatively, a
generic formulation of the type Stack can be given as follows (package
body omitted): 
14
generic
   type Item is private;
package On_Stacks is
   type Stack(Size : Positive) is limited private;
   procedure Push(S : in out Stack; E : in  Item);
   procedure Pop (S : in out Stack; E : out Item);
   Overflow, Underflow : exception;
private
   type Table is array (Positive range <>) of Item;
   type Stack(Size : Positive) is
      record
         Space : Table(1 .. Size);
         Index : Natural := 0;
      end record;
end On_Stacks;
15
    In order to use such
a package, an instance has to be created and thereafter stacks of the
corresponding type can be declared: 
16
declare
   package Stack_Real is new On_Stacks(Real); use Stack_Real;
   S : Stack(100);
begin
   ...
   Push(S, 2.54);
   ...
end;
Contents   Index   Search   Previous   Next   Legal