Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


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)
(blank)
(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;


Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12