Go to the first, previous, next, last section, table of contents.


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

  1. 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;
    
  2. package body Stack is
    
  3.    type Table is array (Positive range <>) of Item;
       Space : Table(1 .. Size);
       Index : Natural := 0;
    
  4.    procedure Push(E : in Item) is
       begin
          if Index >= Size then
             raise Overflow;
          end if;
          Index := Index + 1;
          Space(Index) := E;
       end Push;
    
  5.    procedure Pop(E : out Item) is
       begin
          if Index = 0 then
             raise Underflow;
          end if;
          E := Space(Index);
          Index := Index - 1;
       end Pop;
    
  6. end Stack;
    
  7. Instances of this generic package can be obtained as follows:
  8. package Stack_Int  is new Stack(Size => 200, Item => Integer);
    package Stack_Bool is new Stack(100, Boolean);
    
  9. Thereafter, the procedures of the instantiated packages can be called as follows:
  10. Stack_Int.Push(N);
    Stack_Bool.Push(True);
    
  11. Alternatively, a generic formulation of the type Stack can be given as follows (package body omitted):
  12. 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;
    
  13. In order to use such a package, an instance has to be created and thereafter stacks of the corresponding type can be declared:
  14. declare
       package Stack_Real is new On_Stacks(Real); use Stack_Real;
       S : Stack(100);
    begin
       ...
       Push(S, 2.54);
       ...
    end;
    


Go to the first, previous, next, last section, table of contents.